String为什么是不可变的
String类中使用字符数组保存字符串,数组前有final修饰符,所以string对象是不可变的。
private final char value[];
StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,是可变的
char[] value;
String str1 = new String("abc")创建了几个对象
一个或者两个
当字符串常量池中已经有了"abc"这个字符串对象,则new String("abc")创建了1个对象,即在堆内存中创建一个存储"abc"的String对象。
当字符串常量池中没有"abc"这个字符串对象,则new String("abc")创建了2个对象,分别是"abc"这个字符串对象和在堆内存中创建一个存储"abc"的String对象。
String str2="abc" 可能创建一个对象或者不创建对象,如果"abc"在字符串常量池里不存在,会在字符串常量池里创建一个字符串对象"abc",如果已经存在,str2直接引用这个字符串常量池里的对象。
下面这篇博客写到了字符串常量池、运行时常量池的存储位置,以及在JDK1.8中,使用元空间代替永久代来实现方法区。