定义一个String对象直接使用“=”赋值 与 new 创建对象赋值 有何区别?

经常在java程序员面试的过程中,面试官经常会问到下面这个问题:
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

猜你喜欢

转载自blog.csdn.net/sunshine52013/article/details/80210895