Java String

字符串的创建

Java中字符串对象创建有两种形式,一种为字面量形式,如String s1 = “droid”;另一种就是使用new这种标准的构造对象的方法,如String s2 = new String(“droid”);

	//condition 1
	String s1="123";
	String s2="123";
	System.out.println(s1==s2);//true
	System.out.println(s1.equal(s2));//true
	//condition 2
	String s3=new String("123");
	String s4=new String("123");
	System.out.println(s3==s4);//false
	System.out.println(s3.equal(s4));//true

解释下原因:
(condition 1)字面量s1创建时,会在常量池中查找“123”对象是否已经创建,若未创建则在常量池创建"123"对象,然后将该引用赋值给s1;若已创建则将该引用直接复制给s1。所以s1和s2指向的都是同一个对象的引用。
(condition 2)new一个字符串则直接在堆中创建一个新对象,不会放到常量池,所以两者“==”比较引用为false。
那么怎么将一个new的String对象加到常量池呢?
通过intern()方法。
调用intern后,首先检查字符串常量池中是否有该对象,如果存在,则将这个引用返回给变量,否则将引用加入常量池并返回给变量。

字符串的编辑

遗憾地告诉大家,Java中String对象是不允许编辑的。因为为了提升性能与节省空间,将字符串放到了常量池中,常量池是堆的一部分,是所有线程共享的,为了避免同步操作带来的消耗,所以直接不允许编辑。所以对字符串的所有改变字符串的操作均未改变原对象,都是新建了一个对象,并将该新对象的引用赋值给变量。

		String str1 = "aaa";
        String str2 = "bbb";
        String str3 = "aaabbb";
        String str4 = str1 + "bbb";
        String str5 = "aaa" + "bbb";
        System.out.println(str3 == str4); // false,condition 1
        System.out.println(str3 == str4.intern()); // true,condition 2
        System.out.println(str3 == str5);// true,condition 3

提问:
1.顺序执行时,str5创建了几个String对象。
答:0个。
因为编译器对于字面量之间的连接进行了优化,在编译阶段通过StringBuilder将字面量连接到一起,发现"aaabbb"该对象已经存在于常量池,则将引用赋值给str5。

解释:
(condition 1)拼接时,若有new创建的对象则拼接会直接生成一个String对象,而不会从常量池中取。
(condition 2)见“字符串的创建”中对intern的解释。
(condition 3)见提问中解释。

字符串的回收

当字符串对象不可达时,则有机会回收。没有堆栈对这个string持有引用,就可以被回收。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值