“==”运算符与equals方法的区别
来源:互联网 发布:质量数据统计分析表 编辑:程序博客网 时间:2024/05/11 15:12
一. “==”运算符:对于基本数据类型,比较的是值是否相等;对于引用类型,比较的是引用地址是否相同。
1. 基本数据类型以及它们的包装类
例1:
int i = 10;
int j = 10;
if (i == j)
System.out.println("==");
else
System.out.println("!=");结果是: ==
例2:
Integer i = 10;
Integer j = 10;
if (i == j)
System.out.println("==");
else
System.out.println("!=");结果是: ==
2. 引用类型
例3:
EqualsDemo e1 = new EqualsDemo("Fine");
EqualsDemo e2 = new EqualsDemo("Fine");
if (e1 == e2)
System.out.println("==");
else
System.out.println("!=");结果是: !=
为什么是不等呢?因为e1与e2的引用地址不同,它们指向的是两个不同的内存空间。
特别的字符串类型:
例4:
String s1 = new String("Hello");
String s2 = new String("Hello");
if (e1 == e2)
System.out.println("==");
else
System.out.println("!=");结果是: !=
例5:
String s1 = "Hello";
String s2 = "Hello";
if (s1 == s2)
System.out.println("==");
else
System.out.println("!=");结果是: ==
例4是给每一个字符串实实在在地在内存上分配两个不同的堆空间。
例5看起来也是,哪为什么它们相等呢?这是因为JVM为了减少不必要的内存开销,把这两个对象都指向同一个堆里面的地址。
二. equals方法是比较对象内容上是否相等。
例6:
String s1 = "Hello";
String s2 = "Hello";
if (s1.equals(s2))
System.out.println("true");
else
System.out.println("false");结果是: true
例7:
EqualsDemo e1 = new EqualsDemo("Fine");
EqualsDemo e2 = new EqualsDemo("Fine");
if (e1.equals(e2))
System.out.println("true");
else
System.out.println("false");结果是: false
从例6和例7看出它们的结果不一样,为什么呢?因为String类覆盖了Object类上的equals方法,而由于类的继承性,我们定义的类也可以使用Object类的equals方法,可是我们并没有覆盖它,所以返回值总是为false,比较结果就不一定准确。因此,我们在自定义类中必须覆盖Object类的equals方法。
例7的完整代码如下:
public class EqualsDemo {
private String name;public String getName() {
return name;
}public void setName(String name) {
this.name = name;
}public EqualsDemo(String name) {
this.name = name;
}public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}public boolean equals(Object obj) {
if (obj == null)
return false;
if (obj == this)
return true;
if (!(obj instanceof EqualsDemo))
return false;
EqualsDemo eq = (EqualsDemo) obj;
if (eq.name.equals(name))
return true;
return false;
}public static void main(String[] args) {
EqualsDemo e1 = new EqualsDemo("Fine");
EqualsDemo e2 = new EqualsDemo("Fine");
if (e1.equals(e2))
System.out.println("true");
else
System.out.println("false");
}
}结果是: true
注意: 重写equals方法时,,通常有必要重写hashCode方法,以维护hashCode方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
- “==”运算符与equals方法的区别
- “==”运算符与equals()方法的区别
- Java ==运算符与equals方法的区别及intern方法的正确使用
- C#的==运算符和Equals()方法区别
- ==运算符与equals方法
- equals( )方法与 == 运算符的用法比较
- equals()方法与==的区别
- ==与equals()方法的区别?
- ==与equals方法的区别
- equals()方法与==的区别
- “==”与 equals 方法的区别
- ==与equals方法的区别
- ==与equals方法的区别
- 黑马程序员入学篇——(2)“==”运算符与equals()方法的区别
- ==运算符和Equals()方法区别
- ==运算符和equals()方法区别
- 黑马程序员-Equals()与运算符==区别
- java4Android(23):equals 的使用方法 instance 操作符【==与equals方法的区别】
- jboss 的几种启动方式
- JSTL 学习1 - 2
- C++之模板
- 1 兼容内核开发学习
- Java基本数据类型:long与float之间的转换疑惑
- “==”运算符与equals方法的区别
- vc 获得 cmd 返回信息
- 类型转换
- 性能分析:如何识别负载下的同步问题
- 网站采集 url网址正则表达式
- 精通Unix下C语言之文件系统结构
- 想成为嵌入式系统工程师应知道的0x10个最基本的问题
- 解析Extern
- 一个DSP高手的成长之路