== 和 equals 的区别
程序员文章站
2022-04-15 22:21:35
...
- 值类型是存储在内存中的堆栈(简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。
- ==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
- equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。
- ==比较的是2个对象的地址,而equals比较的是2个对象的内容,显然,当equals为true时,==不一定为true。
java代码:
People类(用于演示)
package demo8;
/**
*
* @ClassName: People
* @Description:演示
* @author cheng
* @date 2017-8-11 下午04:32:16
*/
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 2017-8-14 下午03:29:09
*/
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
}
}
图示:
关于String类型的比较
测试
package demo8;
/**
*
* @ClassName: AddressTest
* @Description: 测试
* @author cheng
* @date 2017-8-14 下午03:29:09
*/
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
}
}
图示:
注意:
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";
创建如下图:
第二种方式:
只要看到new关键字,直接创建一个新的对象.并且不会把创建的字符串放到字符窗池中!!!
String str1 = new String("str1");
String str2 = new String("str1");
String str3 = new String("str2");
创建如下图:
特别注意:
String str1 = new String("str1");//创建一个新的对象
String str2 = "str1";//字符串池中没有此字符串,创建一个新的对象
System.out.println(str1 == str2);//两者指向的对象地址不一致,false
上一篇: 为百度UE编辑器上传图片添加水印功能,ue水印_PHP教程
下一篇: 七牛云存储文件命名