String不可改变的类

String使用private final char value[]来实现字符串的存储,也就是说String对象创建之后,就不能 再修改此对象中存储的字符串内容,就是因为如此,才说String类型是不可变的(immutable).

String a = “java”, String b = “java”, a 和 b指向一个地址,
当修改a = “world"时,不是直接修改a指向的"java”,那样的话b也会等于"java",
而是新建一个"world",将a指向"world",这样b不会改变,所以说String类型是不可变的。

String a = “a”, a的引用存储在栈中,去方法区中的字符串常量池中找是否有"a",
有,就将引用指向这个;没有,就在字符串常量池中创建一个“a”,再将引用执向。

String a = new String(“a”),a的引用存储在栈中,
实际创建了2个 String对象,一个存储在堆内存,一个存储在字符串常量池中
运行期调用String类的intern()方法可以向String Pool中动态添加对象.
1.7之前在常量池中找不到时,复制一个副本放到常量池,1.7后则是将在堆上的地址引用复制到常量池。

常量字符串的“+”操作,编译阶段直接会合成为一个字符串。如string str=”JA”+”VA”,在编译阶段会直接合并成语句String str=”JAVA”,于是会去常量池中查找是否存在”JAVA”,从而进行创建或引用。

常量字符串和变量拼接时(如:String str3=baseStr + “01”;)会调用stringBuilder.append()在堆上创建新的对象。

例子:

	String s1 = "hello";
    String s2 = "hello";
    String s3 = "he" + "llo";
    String s4 = "hel" + new String("lo");
    String s5 = new String("hello");
    String s6 = s5.intern();
    String s7 = "h";
    String s8 = "ello";
    String s9 = s7 + s8;
    System.out.println(s1==s2);//true
    System.out.println(s1==s3);//true
    System.out.println(s1==s4);//false
    System.out.println(s1==s9);//false
    System.out.println(s4==s5);//false
    System.out.println(s1==s6);//true

猜你喜欢

转载自blog.csdn.net/ROAOR1/article/details/88542104
今日推荐