String s=new String("abc") 创建了几个对象(详解)

String s=new String("abc");

首先我们来详细分析这条语句:

  1. String s , 这个语句声明一个类String的引用变量 s [我们常常称之为句柄],而对象一般通过new创建。所以题目中s仅仅是一个引用变量,它不是对象。
  2. new String(), 这里是通过new创建了一个String对象,放在heap(堆)中
  3. 而“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个

  1. "aa"一个对象
  2. new Sring()一个对象
  3. "bbb"一个对象
  4. “aa” + new new Sring()一个对象

ps:前提是pool都没有这四个字符串

猜你喜欢

转载自blog.csdn.net/qq_42651904/article/details/86236246
今日推荐