String s=new String("abc");
首先我们来详细分析这条语句:
- String s , 这个语句声明一个类String的引用变量 s [我们常常称之为句柄],而对象一般通过new创建。所以题目中s仅仅是一个引用变量,它不是对象。
- new String(), 这里是通过new创建了一个String对象,放在heap(堆)中
- 而“abc”呢,也是一个对象,不同的是放在pool(文字池)
我们来看看字符串对象的创建:
由于字符串对象的大量使用(它是一个对象,一般而言对象总是在heap分配内存),Java中为了节省内存空间和运行时间(如比较字符串时,==比equals()快),在编译阶段就把所有的字符串文字放到一个文字池(pool of literal strings)中,而运行时文字池成为常量池的一部分。文字池的好处,就是该 池中所有相同的字符串常量被合并,只占用一个空间。
我们知道,对两个引用变量,使用==判断它们的值(引用)是否相等,即指向同一个对象:
String s = "ab";
String s1 = "ab";
System.out.println(s == s1);
这里输出为true,说明两个字符串文字保存为一个对象。就是说,上面的代码只在pool中创建了一个String对象。
我们再来看这样一个面试题:
String s = "aaa" + new String("bbb");
上面创造了几个对象呢
答案是4个
- "aa"一个对象
- new Sring()一个对象
- "bbb"一个对象
- “aa” + new new Sring()一个对象
ps:前提是pool都没有这四个字符串