String strA = "abc";
String StrB = new String("abc");
这两行代码中分别创建了几个对象?
【答案】第一行代码创建了1个对象,第二行代码创建了2个对象;
【解析】
首先 String strA = "abc"; 创建了一个对象StrA并且把“abc”在内存中的地址赋值给了对象StrA,所以这个过程只创建了一个对象StrA;
而在String StrB = new String("abc")中,则创建了StrB对象,其存放的是存放“abc”地址的对象的引用地址;所以这个过程创建了StrB对象和存放“abc”地址的引用对象;
【扩展延伸】:
package com.huas.demo;
/**
* @author GaoFeng
* @time 2018年5月5日下午11:43:51
* @todo http://cup.dnsxo.com
*/
public class Demo {
public static void main(String[] args) {
String strA = "abc";
String strB = new String("abc");
System.out.println("strA == strB ? " + (strA == strB ? true : false));
String strC = "abc";
System.out.println("strA == strC ? " + (strA == strC ? true : false));
String StrD = "ab";
String StrE = "c";
String StrF = StrD + StrE;
System.out.println("strA == StrF ? " + (strA == StrF ? true : false));
String strBB = new String("abc");
System.out.println("strB == strBB ? " + (strB == strBB ? true : false));
}
}
【运行结果】:
strA == strB ? false
strA == strC ? true
strA == StrF ? false
strB == strBB ? false
首先我们要明白的是
String strA = "abc";
这样的代码,可能会创建一个对象或者不会创建对象,这里会出现一个名词:字符串实例池;
实例池中存在字符串:
这个名称很形象,在这个字符串实例池中存放着很多字符串,可能包含有字符串“abc”,所以在这种情况下,上面的语句就不会创建对象,而是直接引用池中的字符串“abc”;
实例池中不存在字符串:
如果字符串“abc”在实例池中并不存在,那么此时JVM就会初始化一个字符串“abc”,即创建一个字符串对象“abc”,并且会把创建好的字符串放入到“字符串实例池”中;
String strB = new String("abc");
对于关键字 new,JVM即会重新开辟内存空间产生新的对象,也就是说每次都会产生新的字符串对象;
这样对于结果:
strA == strB ? false
strA == strC ? true
strA == strC ? true
就不足为奇了。
而对于:
strA == StrF ? false
这个就要稍微难理解一些
String StrD = "ab";
String StrE = "c";
String StrF = StrD + StrE;
字符串StrD和StrE都是字符串常量,所以它们在代码编译的时就已经是确定好了,但是对StrF来说,他的值是StrD和StrE的引用,所以不会在编译时确定,实际上StrF类似于新建了一个对象出来,然后把所创建的对象的引用赋值给了StrF。所以出现上面的结果也就是情理之中的事了。
如果您觉得文档对您有帮助,希望您能支持一下:http://cup.dnsxo.com