Java中equals()方法和双等号“==”的区别
- 双等号==
如果比较的是基本数据类型的变量,比较的是其赋值的内容是否相等,如果比较的是引用类型的变量,则比较的是所指向的对象的地址是否相等。 - equals()方法
equals方法不能用来比较基本数据类型的变量。默认情况下equals()比较的也是对象的地址是否相等。但很多引用类型都对equals()方法进行了重写,使其比较的是对象的内容是否相等。例如String、Date等类对equals方法进行了重写,比较的是所指向的对象的内容是否相等。
测试代码
int a=3;
int b=3;
System.out.println("a==b? "+(a==b)); //true
String str1="hello";
String str2="hello";
String str3=new String("hello");
String str4=new String("hello");
System.out.println("str1==str2? "+(str1==str2)); //true
System.out.println("str2==str3? "+(str2==str3)); //false
System.out.println("str3==str4? "+(str3==str4)); //false
System.out.println("str3.equals(str4)? "+str3.equals(str4)); //true
//假设定义了一个Dog类,并且没有重写equals()方法。
Dog dog1=new Dog();
Dog dog2=new Dog();
Dog dog3=dog2;
System.out.println("dog1==dog2? "+(dog1==dog2)); //false
System.out.println("dog3==dog2? "+(dog3==dog2)); //true
System.out.println("dog1.equals(dog2)? "+dog1.equals(dog2)); //false
System.out.println("dog3.equals(dog2)? "+dog3.equals(dog2)); //true
这里说一下两种String创建对象方式的的区别:(建议结合下面图片进行理解)
- String str1=“hello”;
这种方式在创建的时候,java虚拟机会检查字符串常量池中是否存在“hello”的字符串对象,如果不存在就在字符串常量池中创建该对象,将该对象的地址返回。如果存在,就不会在字符串常量池中创建新的对象,而是将存在的对象的地址返回。 - String str3=new String(“hello”);
这种方式创建的时候,java虚拟机也会检查在字符串常量池中是否存在“hello”的字符串,如果存在,就不会在字符串常量池中创建新的对象,但会将该字符串对象内容拷贝,继续在堆内存中创建一个新的字符串对象。如果不存在,就先在字符串常量池中创建一个字符串对象,然后再去堆内存中创建一个新的字符串对象。也就是说,不管字符串常量池中存不存在,都会在堆内存中创建新的对象,而且最后会将堆内存中字符串对象的地址返回。
字符串的创建方式内存图