当你看见这个标题的时候,你可能会下意识的去想一下,这两种方式到底有什么样的区别呢? 且看下面的demo,自然便区分开了
运行效果: testStrA == testStrB ? false testStrA == testStrC ? true testStrA == testStrF ? false 我们来分析一下,为什么会出现这样的结果: 首先我们要明白的是 1 String testStrA = "abc";
这样的代码,可能会创建一个对象或者不会创建对象:这里会出现一个名词“字符串实例池” 实例池中存在字符串: 这个名词很形象,在这个字符串实例池中,存放着很多字符串,可能包含有字符串:"abc",所以 在这种情况下面,上面的语句是不会创建对象的,而是直接引用池子中的字符串:"abc"; 实例池中不存在字符串: 如果字符串"abc"在实例池中并不存在,那么这时,就会初始化一个字符串:"abc",即创建 一个字符串对象:"abc",并且会把创建好的字符串放入到"字符串实例池"中。 1 String testStrB = new String("abc"); 对于关键字:new ,即会产生新的对象,也就是说,每次都会产生新的字符串对象 这样,对于第一个结果: testStrA == testStrB ? false
我们就知道了,原来是这样的。 而对于第二个结果: testStrA == testStrC ? true
只要我们对"字符串实例池"有一个印象,这也是不难理解的。 最后是第三个结果: testStrA == testStrF ? false
这个要稍微难理解一些。 1 String testStrD = "ab"; 2 String testStrE = "c"; 3 String testStrF = testStrD + testStrE; 字符串testStrD和testStrE都是字符串常量,所以他们在代码编译的时期就已经是确定好的了, 但是对testStrF来说,他的值是testStrD和testStrE的引用,所以不会在编译时期确定,实际上 testStrF类似于新建了一个对象出来,然后把所创建的对象的引用赋值给了testStrF。 所以出现第三个结果也是情理之中的事情... |
|
来自: OneDayDayUp > 《Java》