Java中equals和==的区别
来源:互联网 发布:长白山东方神韵淘宝 编辑:程序博客网 时间:2024/06/14 08:21
简介:
equals 方法是定义在 Object 类中的一个方法
具体可以看我的另一篇文章: Java中的equals方法
equals和==的区别:
1、字符串
对于字符串来说:
- “==” 比较的是两个字符串在内存中的首地址
- “equals” 比较的时候两个字符串的内容
/* Test1 */String s1 = "abc";String s2 = "abc";System.out.println("s1 == s2 : " + (s1 == s2));System.out.println("s1.equals(s2) : " + s1.equals(s2));Output:s1 == s2 : trues1.equals(s2) : true
s1 和 s2 的内容相同,都是”abc”,所以 equals 的结果为 true
s1 和 s2 是两个对象,为什么 “==” 的结果也为 true 呢?
答:在程序创建的时候,会创建一个字符串缓冲区,以 String s1 = "abc"
形式创建的字符串,程序会再缓冲区中寻找或创建值为 “abc” 的首地址并引用,当创建 s2 的时候,程序发现缓冲区中已经有相同的内容,所以 s2 直接引用这块地址,所以 s1 和 s2 引用了同一块地址,所以”==”为 true。
/* Test2 */String s1 = "abc";String s2 = new String("abc");System.out.println("s1 == s2 : " + (s1 == s2));System.out.println("s1.equals(s2) : " + s1.equals(s2));Output:s1 == s2 : falses1.equals(s2) : true
在 Test2 中 “s1 == s2” 就不再为 true 了,这是因为 s2 的声明方式为 String s2 = new String("abc");
它的意思是请求在缓冲区中重新开辟一段内存在存放字符串 “abc” 所以它的 s1 的 “abc” 虽然内容相同,但是它们的首地址不相同。
/* Test3 */String s1 = new String("abc");String s2 = new String("abc");System.out.println("s1 == s2 : " + (s1 == s2));System.out.println("s1.equals(s2) : " + s1.equals(s2));Output:s1 == s2 : falses1.equals(s2) : true
Test3 中 s1 和 s2 都是通过 new 出来的字符串,结果与 Test2 一样,同理。
2、非字符串
对于非字符串对象来说
- equals 和 == 的作用相同,都是用来比较对象实例在内存中的首地址
那么有人就要问了,字符串也是对象,为什么和非字符串对象不同的?
答:在一般情况下,equals 方法定义在 Object 类中,所以一般类使用的是 “祖宗” 类 Object 类中的 equals方法,查阅源码如下:
public boolean equals(Object obj) { return (this == obj);}
我们知道想要 equals 达到自己想要的效果,必须复写 equals 方法,所以为什么 String 类的 equals 方法有所不同呢?当然是 String 类中的 equals 方法被复写了,查阅源码如下:
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
阅读 equals 方法后,很容易发现,复写的 equals 方法比较的是两个字符串的内容
3、基本类型
对于 Java 中的基本类型:
byte, short, char, int, long, float, double, boolean
1. 用 “==” 比较的是两者的值是否相同,如(其他类似):
int a = 1;int b = 1;System.out.println("a == b : " + (a == b));Output:a == b : true
需要注意的是:基本类型是没有 equals 方法的,如:a.equals(b)
是没有这种语法的。
4、包裹类型
对于Java中的包裹类型:
Boolean, Character, Byte, Shot, Integer, Long, Float, Double
1. “==” 是来比较两者的首地址是否相同
2. “equals” 是比较两者的内容是否相同
Integer a = new Integer(1);Integer b = new Integer(1);System.out.println("a == b : " + (a == b));System.out.println("a.equals(b) : " + a.equals(b));Output:a == b : falsea.equals(b) : true
总结:
本文只是列出了一些常用数据类型的浅显的区别,在类中是否复写了 equals 方法,则需要自己去查阅源码,其他的具体实现方法,需要查看jdk文档或者查阅源码。
个人浅见,欢迎指正!
- Java中==和equals的区别,equals和hashCode的区别
- Java中==和equals的区别,equals和hashCode的区别
- Java 中==和 equals 的区别, equals 和 hashCode 的区别
- Java中==和equals的区别,equals和hashCode的区别
- Java语法----Java中equals和==的区别
- Java语法----Java中equals和==的区别
- Java语法----Java中equals和==的区别
- Java语法----Java中equals和==的区别
- Java 中 equals 和 == 的区别和联系
- Java中==和equals的区别和联系
- java中字符串的equals和==的区别
- java中 ==和 equals区别
- java中"==" 和 equals区别
- Java中equals和==区别
- Java 中equals和==区别
- java中==和equals区别
- Java中equals和== 区别
- Java中"=="和"equals"区别
- android编辑框禁用emoji表情和颜文字
- CAN总线(1)
- hdfs元数据保存
- spring boot使用redis做数据缓存
- 面试_如何成功躲开HR的问题陷阱
- Java中equals和==的区别
- 初窥Linux 之 我最常用的20条命令
- 用 WeixinJSBridge.invoke函数实现微信分享标题和文案
- java:截取字符串的substring和substr
- 数据库学习——注释与分页查询
- leetcode 130. Surrounded Regions DFS + 矩阵遍历
- RxBus简单使用
- 【翻译】VTK 8.0 指定新编码标准
- python网络爬虫的简单架构