equals()方法。

String str = "Welcome to java";
//推荐这种方式,只产生一个对象,节省空间
String str = new String("Welcome to java");
//会产生两个对象,产生垃圾空间

这种方式的缺点:
a. 如果使用String构造方法就会开辟两块堆内存空间,并且其中一块堆内存将成为垃圾空间(字符串常量 “hello” 也是一个匿名对象, 用了一次之后就不再使用了, 就成为垃圾空间, 会被 JVM 自动回收掉).
b. 字符串共享问题. 同一个字符串可能会被存储多次, 比较浪费空间.
// 可以手工入池,intern();不会创建垃圾空间
String str1 = new String("hello").intern();
String str2 = "hello";
System.out.println(str1 == str2); //输出:true
char[] data = {'h','e','l','l','o'};
String str = new String(data);
String类的设计使用了共享设计模式。
在JVM底层实际上会自动维护一个字符串常量池:
String str = "hello";
str = "world";
System.out.println(str); //输出:world
通过反射强行破坏String类的封装,获取value数组进行改变。
听听就行了:
import java.lang.reflect.Field;
public class Test {
public static void main(String[] args) throws Exception{
String str = "hello";
//通过反射获取String类中的value数组
Field field = String.class.getDeclaredField("value");
//value的private定义取消掉
field.setAccessible(true);
//获取到str对象内部的value数组
char[] value = (char[]) field.get(str);
value[0] = 'H';
System.out.println(str); //输出:Hello
}
}
为了方便字符串的修改,引入这两个类,它俩大部分功能是相同的。
StringBuffer : 线程安全
StringBuilder : 线程不安全,但是更快
实际上它们与String类没有一点关系,没有血缘关系。
当出现字符串拼接 “+” 时,JVM会自动把字符串转换成StringBuilder类型的,调用其中的append()方法扩展字符串,避免产生过多的垃圾空间。
equals()方法是判断两个对象的内容是否相同,而 == 是判断是否为同一个对象。
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1.equals(str2)); // true
System.out.println(str1 == str2); // false
String str3 = "world";
String str4 = new String("world");
System.out.println(str3.equals(str4)); // true
System.out.println(str3 == str4); // false
String str5 = "张三";
String str6 = "张三";
System.out.println(str5.equals(str6)); // true
System.out.println(str5 == str6); // true
总结:
提示:这里对文章进行总结:
以上就是今天的学习内容,本文是JavaSE的学习,深度剖析String类,学习字符串创建的方式,字符串的不可变性,以及字符串常量池。之后的学习内容将持续更新!!!