StringBuffer与stringBuilder
对于String的学习:
final 修饰了String类所以String类是无法被修改的,并且不是基本数据类型。
当我们用双引号创建一个字符串时,jvm首先在字符串常量池中找寻具有相同值的字符串如果找到了,他将返回字符串常量池中的字符串对象引用。否则就在常量池中创建字符串对象并返回引用。
如果使用new创建字符串就需要在堆中创建它。
拼接字符串
我们使用Spring进行字符串拼接时,它会生成一个新的String并丢弃旧的String。/
这些操作肯定会在堆中产生大量垃圾冗余。于是产生了Stringbuffer(始于1.0之后)与StringBuilder(始于1.5之后)类用于对字符串的操作。
摘录自:https://developer.aliyun.com/article/787097?accounttraceid=7ccd1e5925ac4bff8b9d2ada96ac4f4arrjy Java 中 String 与 StringBuffer 和 StringBuilder 的区别: 在 Java 1.4 之前,StringBuffer 是字符串操作的唯一选择。但是,它的一个缺点是所有公共方法都是同步的。 StringBuffer 提供线程安全性,但以性能为代价。 在大多数情况下,我们不会在多线程环境中使用 String。所以 Java 1.5 引入了一个新类 StringBuilder,除了线程安全和同步之外,它与 StringBuffer 类似。 StringBuffer 有一些额外的方法,例如 substring, length, capacity, trimToSize 等。但是,这些不是必需的,因为 String 中也有所有这些。这就是为什么这些方法从未在 StringBuilder 类中实现的原因。 StringBuffer 是在 Java 1.0 中引入的,而 StringBuilder 类是在查看 StringBuffer 的缺点后在 Java 1.5 中引入的。 假设在单线程环境中或无关线程安全,要使用 StringBuilder。反之,使用 StringBuffer 进行线程安全的操作。
关于Spring的面试体
//第一题
String s1 = "abc";
String s2 = "xyz";
String s3 = s1 + s2;
String s4 = "abc" + "xyz";
String s5 = "zbcxyz";
System.out.println(s3 == s4); // false
System.out.println(s4 == s5); // true
s1、s2都在常量池中,而s3=s1+s2,s3不会放在常量池中(只有字面常量才会放在常量池中),所以s3放在堆中,s4是两个字面常量拼接,所以会放在常量池中,内容为“abcxyz”,s5创建时,现在常量池中找到了相同的,所以两者引用相同
所以s3和s4的引用不同,s4和s5的引用相同
原文链接:https://blog.csdn.net/weixin_42193813/article/details/107725927
//第二种
String s1 = "abc"