- String s1 = new String("11");
- String s2 = new String("11");
- System.out.println(s1 == s2);//false
- String s3 = "22";
- String s4 = "22";
- System.out.println(s3 == s4);//true
复制代码
1,s1和s2是两个不同对象的不同引用,他们分别指向各自的对象。分别储存着对象的储存地址,由于new出来两个不同对象,所以地址当然不同。如果用equals()方法,s1.equals(s2)==true;
2,s3和s4呢,当String s3="22";系统会先在常量池中寻找是否有内容"22"的字符串,没有就会重新建立对象引用s3,并将它指向对象"22";当执行String s4="22"时,系统也会在常量池中寻找是否有内容为"22"的对象,存在,就直接建立对象引用s4指向了对象"22";
3,equals与"=="的区别就是,equals比较的是储存在堆中的数据内容,而“==”比较的是储存在栈中的数据内容。new出来的对象以及数组都是储存在堆中,基本数据类型以及引用型都是储存在栈中。有特例就是:String类复写了equals()方法,它比较的是两个对象中的内容是否相等。“==”一般比较的是数据内容的地址,所以s1!=s2,而s3=s4;equals()比较的是纯属数据内容。 |