equals和“==”的区别
“==”是比较两个变量本身的值,对象在内存的首地址。
首地址:对象的首地址是它在内存中存放的起始地址,它后面的地址是用来存放它所包含的各个属性的地址,所以内存中会用多个内存块来存放对象的各个参数,通过这个首地址就能找到该对象,进而找到该对象的各个属性
"equals()"用来比较字符串中的包含的内容是否相同
String s1,s2,s3 = "abc", s4 ="abc" ;
s1 = new String("abc");
s2 = new String("abc");
System.out.println("s1==s2:"+(s1==s2));//false
System.out.println("s1==s3:"+(s1==s3));//false
System.out.println("s3==s4:"+(s3==s4));//true
System.out.println("s1.equals(s2):"+(s1.equals(s2)));//true
System.out.println("s1.equals(s3):"+(s1.equals(s3)));//true
System.out.println("s3.equals(s4):"+(s3.equals(s4)));//true
s3 = "abc" //在常量池中创建对象 abc
s1 = new String("abc"); //在堆中创建new String()对象 但是因为abc已经在常量池中存在,所以不需要在常量池中创建对象
//所以 s1==s3 比较的是堆中的对象和常量池中的对象,这不是一个对象
StringBuffer sb1 = new StringBuffer("abc");
StringBuffer sb2 = new StringBuffer("abc");
System.out.println(sb1==sb2);
System.out.println(sb1.equals(sb2));
StringBuilder sb3 = new StringBuilder("abc");
StringBuilder sb4 = new StringBuilder("abc");
System.out.println(sb3==sb4);
System.out.println(sb3.equals(sb4));
原因:StringBuilder和StringBuffer类中没有重写equals这个方法,因此这个方法来自于Object
Object类中的equals的方法是用来比较地址的,所以是false。
Test t1 = new Test();
Test t2 = new Test();
System.out.println(t1==t2);
System.out.println(t1.equals(t2));
t1 = t2;
System.out.println(t1==t2);
System.out.println(t1.equals(t2));
前面的两个false相当于比较内存地址,false不言而喻
执行 t1=t2相当于 t1指向了t2的内存地址,两个内存地址一样
所以两个都是true
- equals方法对于字符串来说是比较的内容,对于非字符串来说,是比较的内存地址
- ==比较对象的内存首地址
equals和==的区别:
- 如果是基本数据类型,只能用==,不能用equals
- 对于基本类型的包装类型,比如Boolean、Character、Byte、Short、Integer、Long、Float、Double等的引用变量,==是比较地址的,而equals是比较内容的
只要是没有重写equals类中,来用equals来比较,那就是来比较内存地址的