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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值