`

关于String的问题

阅读更多

关于String的经典问题很多,不过弄清楚jvm如果创建和存储String对象,一般的问题应该都能对付

1 String对象的存放

   (1) 直接使用双引号:String s = "abc"; "abc"字符串存在jvm的常量池中,常量池在方法区中

   (2) 使用new String:String s = new String("abc");在堆中分配内存区域

 

2 + 操作String对象

      (1) String s = "a" + "bc";这种类型的操作,类文件在编译成class文件时,直接把"a" + "bc"编译成了"abc";常量池中只存在"abc",不存在"a", "bc"

      (2) String a = "a"; String b = "bc"; String c = a + b;针对这种操作,编译后的指令为:先创建一个StringBuilder对象,然后使用append方法,把两个字符串append进来,然后调用 toString方法,生成一个新的String对象

 

3 itern()方法

   该方法去查找常量池用没有,有则返回,没有创建

 

4 两个类同时声明相同的str

   比如:

public class StringDemo {
    private static String xx = "abc";
    public static void main (String[] args) {
        String a = "a";
        String b = "bc";
        String c = a + b;
        String d = "a" + "bc";
        String e = "abc";
        String ss = "x" + "yyy";
        System.out.println(e == c );
        System.out.println(e == d );
        System.out.println(xx == e);
        System.out.println(xx == TestDemo.str);
    }
}

class TestDemo {

    public static final String str = "abc";

//    public static final StringDemo strDemo = new StringDemo();

    static {
        System.out.println("TestDemo clinit...");
    }
}

   执行结果:

  

com.malone.common.StringDemo
false
true
true
true

   在类TestDemo.java声明了str对象,在StringDemo声明了xx,两个类使用了相同的字符串,常量池中只存在一个"abc"

   看一下上面mian函数编译后的命令:

  

  

ldc "a"
astore_1
ldc "bc"
astore_2
new java/lang/StringBuilder
dup
invokespecial java/lang/StringBuilder/<init>()V
aload_1
invokevirtual java/lang/StringBuilder/append(Ljava/lang/String;)Ljava/lang/StringBuilder;
aload_2
invokevirtual java/lang/StringBuilder/append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invokevirtual java/lang/StringBuilder/toString()Ljava/lang/String;
astore_3
ldc "abc"
astore 4
ldc "abc"
astore 5
ldc "xyyy"
astore 6
getstatic java/lang/System/out Ljava/io/PrintStream;
aload 5
aload_3
if_acmpne 26
iconst_1
goto 27
iconst_0
invokevirtual java/io/PrintStream/println(Z)V
getstatic java/lang/System/out Ljava/io/PrintStream;
aload 5
aload 4
if_acmpne 34
iconst_1
goto 35
iconst_0
invokevirtual java/io/PrintStream/println(Z)V
getstatic java/lang/System/out Ljava/io/PrintStream;
getstatic com/malone/common/StringDemo/xx Ljava/lang/String;
aload 5
if_acmpne 42
iconst_1
goto 43
iconst_0
invokevirtual java/io/PrintStream/println(Z)V
getstatic java/lang/System/out Ljava/io/PrintStream;
getstatic com/malone/common/StringDemo/xx Ljava/lang/String;
ldc "abc"
if_acmpne 50
iconst_1
goto 51
iconst_0
invokevirtual java/io/PrintStream/println(Z)V
return

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics