关于String的连续追问

1.String s= "123"和String str = new String(“123”)的区别

在这里插入图片描述
可能你会疑惑为什么是上面的答案?

那么,这等价于问你一个问题,String s = new String(“123”);分配了几次内存?
答案是两次。第一次在栈中分配内存存放了一个"123",这是一个共享的数据,所有的String s = “123”;都会指向这个"123";第二次是在堆中分配一个new String()对象指向了堆中的"123".这就是为什么不同的new String(“123”)却不想等,因为他们都在堆中分配了新的地址,指向了一个共享的栈中的"123".

2. String是不可变对象吗?

String s = “123”;是一个不可变对象,比如String s=“123"和String s2=s+“4"地址不同,说明"4"不是直接加在了s1后面,而是在栈中分配了一个字符串"123”,然后分配了一个内存"4”,然后将加在一起形成了"1234"赋值给了s2.形如这种我们称之为不可变对象。

java将String变成不可变对象就是为了保证String可以接受并发。
在这里插入图片描述

3.String如何变成可变对象?

java提供了StringBuilder和StringBuffer两个可变的String对象。其中StringBuilder是一个没有同步锁的可变对象,StringBuffer是一个有同步锁的可变对象。也是因为没有锁,所以单线程中StringBuilder性能极高。相比而言StringBuffer性能不如StringBuilder。

4.String不可变对象,那么String s = "A"可以被修改吗?

答案是可以,使用反射。(当然,可能有同学了解unsafe,可以尝试)

shiy

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值