2019/11/12 PM 12:05
这是複习的第二天,开始吧!
来看一下当时初次接触JAVA稍稍困惑我一下的问题吧?
请问下列的两段程式码印出答案分别是甚么?为甚么?
1:
String s1 = "Brad";String s2 = "Brad";System.out.println(s1 == s2);
2:
String s3 = new String("Brad");String s4 = new String("Brad");System.out.println(s3 == s4);
想到答案了吗?
答案为
System.out.println(s1 == s2):Ans为true
System.out.println(s3 == s4):Ans为false
为甚么Ans不一样呢?
s3跟s4答案是false的原因是,因为他们虽然内容相同,但遗憾的是他们各别都使用了new String()来创造出物件实体,所以可想而知系统会在记忆体规划出两个不同区块分别放s3、s4物件实体,代表s3为一个物件s4又为一个物件两个存放在记忆体内不同位子,由于是不同的物件所以答案为false。
拿s1跟s2为甚么是true呢?当系统看到java里,String s1 = "Brad";的时候,系统会帮忙创造出物件实体,并把s1放在规划好的位子上,但注意到了吗?当系统看到String s2 = "Brad";他并没有使用new,所以系统会先去寻找一下发现s2需要的内容,s1已经存在了,所以系统会把s2也指向s1的位子,所以既然指向同一个位子就代表着,s1跟s2指向的是同一个物件,所以System.out.println(s1 == s2);翻成白话的意思是?请问s1物件实体与s2物件实体在记忆体内的位子一样吗?一样所以也代表他们是同一个物件,所以Ans为true
怕有人看到这跟我当初一样脑袋卡住,我再举一个例子说明清楚一点
当时的我想那如果是以下这样呢?
String s1 = "Brad";String s2 = "Apple";
别闹了,内容不一样啊,系统找不到还是会去规划一个地方放这个新的,既然不同位子又产生新的,那代表不是同一个物件了,自然答案就为false了,希望初学者不要像我当初一样卡了5分钟。
请注意内容要一样,系统才会在记忆体内找到拥有一样内容的位子,才能指向过去。but如果你是用new那儘管内容一样,如同上面的範例,他还是会个别规划空间喔!
那看到这你产生疑问?那如果我不想管这些,我只想比我的String物件的内容是否相同呢?别担心,Java早就设计好了,String的类别透过Override的方式,改写Java.lang.Object的equals方法,让你可以去比对字串的内容。
System.out.println(s3.equals(s4));
Ans:true
请记得你使用的类别并没有去override本来Object的equals方法的内容,那在没有複写的情况下,他就与 == 是相同的用法。
以下用程式码举例一下:
Object obj1 = new Object();Object obj2 = new Object();System.out.println(obj1 == obj2);System.out.println(obj1.equals(obj2));
答案都是false喔,可以去尝试玩一下。