java中 == 与 equals()
java中的数据类型
- 基本数据类型:
byte
、short
、char
、int
、long
、float
、double
、boolean
; - 引用数据类型:
数组
、类
、接口
- 基本数据类型和引用数据类型的区别
- 基本数据类型:
- 变量名指向具体的值
- 声明后立刻分配内存空间
- 存储在栈中
- 使用 == 比较变量值是否相同
- 引用数据类型:
- 变量名指向存储对象的内存地址
- 声明后分配的是内存地址,不分配内存(在new时,分配内存)
- 存储在堆中
- 使用
equals()
比较变量值是否相同(使用 == 比较的时变量的内存地址是否相同)
- 基本数据类型:
equals()方法
在Object类中,equals()是这样定义的
public boolean equals(Object obj) {
return (this == obj);
}
这个方法默认比较内存地址,在一些类(如String
、Integer
、Date
)中进行了重写,使其不再是比较内存地址值内存中的值
以String为例
String str0 = "abc"; // 存放在String常量池
String str1 = new String("abc"); // 存放在堆中
System.out.println(str0 == str1); // false
System.out.println(str0.equals(str1)); // true
// intern()检查字符串池里是否存在"abc"这么一个字符串,如果存在,就返回池里的字符串;如果不存在,该方法会 把"abc"添加到字符串池中,然后再返回它的引用
str1 = str1.intern();
System.out.println(str0 == str1); // true
System.out.println(str0.equals(str1)); // true
比较两个对象的值
public class Test{
public static void main(String [] args){
Student stu0 = new Student("张三", 13);
Student stu1 = new Student("张三", 13);
System.out.println(stu0); // Student@161cd475(stu0指向的内存地址)
System.out.println(stu1); // Student@532760d8(stu1指向的内存地址)
System.out.println(stu0 == stu1); // false 比较的是内存地址
System.out.println(stu0.equals(stu1)); // true 比较对象的值
}
}
// 学生类
public class Student {
private String name;
private int age;
public Student() {}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return this.age;
}
public void setAge(int age) {
this.age = age;
}
// 重写equals方法
@Override
public boolean equals(Object object) {
// 内存地址相同,说明指向同一个实例
if (this == object) {
return false;
}
// object instanceof Student 判断object是否是Student的实例
if (!(object instanceof Student)) {
return false;
}
Student stu = (Student)object;
return this.name.equals(stu.name) && this.age == stu.age;
}
}
本文来自博客园,作者:遥远的相似性,转载请注明原文链接:https://www.cnblogs.com/z212021/p/13873542.html