== 和 equals 的区别
来源:互联网 发布:淘宝店主照片认证 编辑:程序博客网 时间:2024/06/07 09:28
- 值类型是存储在内存中的堆栈(简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。
- ==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
- 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
阅读全文
0 0
- “=”和“equals()”的区别
- java ==和equals、equals和hashCode的区别
- 关于“==”和“equals”的区别
- 关于Equals 和== 的区别
- equals和==的区别
- equals 和 == 的区别
- equals 和 == 的区别
- ==和Equals的区别
- equals 和 == 的区别
- equals 和 == 的区别
- equals和==的区别
- equals 和 == 的区别
- equals和==的区别
- 关于==和equals的区别
- Equals和“==”的区别
- == 和equals() 的区别
- equals("")和“==”的区别
- equals 和 == 的区别
- netty并发编程模型
- python 递归打印实例的值
- 内网服务器ssh快速传送文件
- HDU 6063 RXD and math【快速幂】【打表找规律】
- JVM学习笔记-02-JVM的分区及其创建对象的过程
- == 和 equals 的区别
- POJ1065-LIS&偏序集定理-Wooden Sticks
- 使图片按指定的比例铺满ImageView
- 在离线状态下保存数据可能会用到的XML文件读写
- 10 大深度学习架构
- BFU C.yi的书包 01背包【水题】
- 剑指Offer面试题11[数值的整数次方]
- ubuntu小白常用指令汇总(不断更新ing)
- 好玩的线上检测代码工具-codewars(2)