0
点赞
收藏
分享

微信扫一扫

== 和 equals 的区别


  • 值类型是存储在内存中的堆栈(简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。
  • ==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
  • equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。
  • ==比较的是2个对象的地址,而equals比较的是2个对象的内容,显然,当equals为true时,==不一定为true。

java代码:

People类(用于演示)

package demo8;

/**
*
* @ClassName: People
* @Description:演示
* @author cheng
* @date
public class People
private String name;
private int age;

public People() {
super();
}

/**
* 重写
*/
@Override
public boolean equals(Object obj) {
if (obj instanceof People) {
People p = (People) obj;
//若两者的类型相同,重新定义内容相同的规则
if (this.getName().equals(p.getName())
&& this.getAge() == p.getAge()) {
return true;
}
return false;
}
return false;
}

public People(String name, int age) {
super();
this.age = age;
this.name = name;
}

@Override
public String toString() {
return "People[name=" + name + ",age=" + age + "]";
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

}

测试

package demo8;

/**
*
* @ClassName: AddressTest
* @Description: 测试
* @author cheng
* @date
public class AddressTest

public static void main(String[] args) {
People p1 = new People("张三", 100);
People p2 = new People("李四", 200);
People p3 = p2;
People p4 = new People("张三", 100);

System.out.println(p2 == p3);//依据下图可知,指向的对象地址一致,true
System.out.println(p2.equals(p3));//依据下图可知,指向的对象内容一致,true

System.out.println(p1 == p4);//依据下图可知,指向的对象地址不一致,false
System.out.println(p1.equals(p4));//依据下图可知,指向的对象内容一致,true

图示:

== 和 equals 的区别_equals

关于String类型的比较

测试

package demo8;

/**
*
* @ClassName: AddressTest
* @Description: 测试
* @author cheng
* @date
public class AddressTest

public static void main(String[] args) {
String str1 = "str1";//查看字符串池,发现没有此字符串,创建一个新对象
String str2 = "str2";//查看字符串池,发现没有此字符串,创建一个新对象
String str3 = str2;//直接复制引用,两个引用指向同一个对象
String str4 = "str1";//查看字符串池,发现有此字符串,直接指向此对象
String str5 = new String("str1");//直接创建一新个对象
String str6 = new String("str1");//直接创一个新对象

System.out.println(str1 == str4);//依据下图可知,指向的对象地址一致,true
System.out.println(str1.equals(str4));//依据下图可知,指向的内容一致,true

System.out.println(str2 == str3);//依据下图可知,指向的对象地址一致,true
System.out.println(str2.equals(str3));//依据下图可知,指向的内容一致,true

System.out.println(str1 == str5);//依据下图可知,指向的对象地址不一致,false
System.out.println(str1.equals(str5));//依据下图可知,指向的内容一致,true

System.out.println(str5 == str6);//依据下图可知,指向的对象地址不一致,false
System.out.println(str5.equals(str6));//依据下图可知,指向的内容一致,true

图示:

== 和 equals 的区别_string类_02

注意:

1.String中已经复写了equals(),源代码如下:

public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}

2.String类两种创建方式的不同

第一种方式:
先去字符串池查找是否有相同的字符串,
若有相同的字符串,直接指向该字符串,不创建新的对象;
若没有相同的字符串,创建一个新的字符串对象,并放到字符串池中

String str1 = "str1";
String str2 = "str1";
String str3 = "str2";

创建如下图:

== 和 equals 的区别_equals_03

第二种方式:
只要看到new关键字,直接创建一个新的对象.并且不会把创建的字符串放到字符窗池中!!!

String str1 = new String("str1");
String str2 = new String("str1");
String str3 = new String("str2");

创建如下图:

== 和 equals 的区别_字符串_04

特别注意:

String str1 = new String("str1");//创建一个新的对象
String str2 = "str1";//字符串池中没有此字符串,创建一个新的对象

System.out.println(str1 == str2);//两者指向的对象地址不一致,false


举报

相关推荐

0 条评论