面试题
- String为什么不可变?
答案
/*
1.Java中String类维护一个final修饰的char[]数组实现不可变,意味着一旦分配了内存空间,它们就不能被修改。
2.我们所说的不可变指的是字符串池中的对象是不可更改的(这样方便JVM的内存管理) 但当前变量可以修改指向
eg1.当我们创建String实例的时候 字符串中存在-->返回引用,而不是开辟新的对象空间 不存在-->字符串中开辟对象空间并返回引用
eg2.当我们使用String中的方法来对其进行操作时,例如使用 replace() 方法修改字符串内容时,实际上是创建了一个新的字符串对象,并将其返回。
原始的字符串本身并没有被修改,只是改变了指向该字符串的引用。这种设计保证了在多线程环境下,String对象不会被修改,从而提高了代码的可靠性和安全性。
*/
- String s1=new String("abc");创建了几个字符串对象
答案
/*
创建一个字符串对象
在Java中,使用 String s = "abc" 方式创建的字符串常量在编译期就已经被确定并放入常量池中,
因此,如果使用 String s = "abc" 创建多个字符串对象时,实际上只有一个对象会被创建。
而使用 String s = new String("abc") 方式创建的字符串对象则是在运行时创建的,每次都会在堆中创建一个新的对象,
因此在本例中,该语句创建了一个在堆中的字符串对象
*/
String类部分源码
//被final修饰不可被继承
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
//String维护char[] 所以不可修改
private final char value[];
创建String对象的方式
- str1它首先会去方法区的常量池中找,有“hello”这个对象就直接引用,没有就创建一个新的对象“hello”,存放在常量池中。
- 而new的方式首先会在堆中创建一个对象,然后再去常量池中找,有直接引用,没有就创建一个新的对象“hello”。
两者区别
- 直接赋值创建0或1个对象,而new的方式创建1或2个对象。
- 为了提升Java虚拟机的性能和减少内存的开销,避免字符串的重复创建,尽量少使用new的方式创建String对象
代码分析
public static void main(String[] args) {
String str1 = "hello";//指向常量池中的引用
String str2 = new String("hello");//指向堆中的引用
String str3 = str2;//str3==str2 true
String str4 = "hello";//str1==str4 true
}
intern()
字符串调用intern()会返回常量池中这个字符串引用,可作为锁对象文章来源:https://www.toymoban.com/news/detail-426027.html
字符串拼接
String a="A";
String b="B";
String c=new String("C");
a="A"+b;//变量拼接 指向变为堆中地址
a="A"+c;//变量拼接 指向变为堆中地址!
a="A"+"A";//常量拼接依旧指向常量池中的地址 a=="AA" true
final String d="D";//这是常量
a="A"+d//a=="AD" true
+号变量拼接底层原理 StringBuidlerd构造初始化容量为16的char[] 然后调用append()进行拼接 最后将结果new String()的形式赋给左边变量文章来源地址https://www.toymoban.com/news/detail-426027.html
到了这里,关于Java中关于String类以及字符串拼接的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!