关于String的连续追问

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

关于String的连续追问
可能你会疑惑为什么是上面的答案?

那么,这等价于问你一个问题,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可以接受并发。
关于String的连续追问

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

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

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

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

关于String的连续追问