使用 new,就是創建一個新的String~~~而採用=時,String s3= "a",然後執行String s4 = "a",系統先查找是否有"a"存在,如果沒有就創建,否則就將引用s4 指向已存在的"a",也就是s3所指向的内存塊故s3==s4,s1 != s2,s1 != s5,s1 != s3你可以試一下,即使s3,s4 不在同一個method(但兩者必須是可見的,否則無法比較,比如實例變量和局部變量),也有s3 == s4
调试欢乐多
equals:
用来比较两个对象是否相同,先比较类型,再比较对象内容,返回true or false
String s1=new String (“abc”);
String s2=new String (“abc”);
s1==s2; false
s1.equals(s2); true
若: String s1=”abc”
String s2=”abc”
s1,s2常量对象,内容一样时,系统只分配一个空间,所以引用相同
s1==s2; true
你明白了吗?
java中对象是个基本的概念,就是一切都是对象,再java中对于对象我们知道是引用的,就是当 A = B;后 A对象和B对象将是引用同一对象.把这个思想换入我们讨论的这个问题,java是把"a"看作一个对象的,而且任何时候"a"这个串实际就是同一对象的引用,那么我们用这个去给其他对象赋值,那么赋值后的对象将同样是同一对象的引用.我们有"=="运算是实际是在比较是否指向同一对象,这样就是了(赋值未"a"的对象都是"=="的);
对于wxtasp(可可) 所说的"既然s1先创建了,也就是说"a"已经存在,那么String s3="a" 是s3就应该指向"a",这样 s1==s3就应该是true,可事实并不是这样,而是返回了false"
我们应该这样理解了,当我们用new创建一个对象时,实际上是从新开辟了内存区域,哪怕是内容一样,但实际已经不是对同一对象的引用了.当然不"==".
这个问题的关键是把"a"看作一个对象.
1:String是对象,不是基本数据类型
2:==比较的是对象的引用,不是对象自身的类容
对于基本类型是比较实际内容
对象比较一般用equals方法