比较 == ? equals?
结论:
- 所有的引用数据类型包括包装类型 都用equals
- 所有基本数据类型 都用==
public class Compare {
public static void main(String[] args) {
//基本数据类型, == 比较数值
int i = 10;
int j = 10;
System.out.println(i == j); //true
double d = 10.0;
System.out.println(i == d); //true
//引用数据类型 == 比较变量的内存地址
String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
//s1与s2 同一块内存
// java做了优化,将双引号"..."字符串放入字符串常量池 -- 视作常量
System.out.println(s1 == s2); //true
//s3构建新字符串对象 内存地址不在字符串常量池中
System.out.println(s1 == s3); //false
//引用对象比较内容 String类使用.equals()方法
//String类对父类Object中的equals方法进行了重写 使其可以比较字符串内容
System.out.println(s1.equals(s3)); //true
User user1 = new User();
User user2 = new User();
//new创建的对象 新的内存地址 == 比较地址
System.out.println(user1 == user2); //false
//User类的.equals()方法没有重写时 equals方法内还是使用 == 进行比较
System.out.println(user1.equals(user2)); //重写equals前false 重写equals后true
//包装类型
//int => Integer -- JVM实际上调用了 Integer.valueOf(int)
//Integer 有1B缓存:-128 ~ 127 在缓存范围内调用.valueOf方法不会创建对象而是直接调用缓存
//因此在-128 ~ 127内 == 判断为true -- 内存地址相同 而范围外 判断为false
//所以应该尽量避免用 == 比较包装类型的对象
Integer i1 = 100;
Integer i2 = Integer.valueOf(100);
Integer i3 = 200;
Integer i4 = 200;
System.out.println(i1 == i2); //true
System.out.println(i3 == i4); //false
// 包装类或者说所有的引用数据类型 都用equals 所有基本数据类型 都用==
System.out.println(i1.equals(i2)); //true
System.out.println(i3.equals(i4)); //true
}
}
class User{
@Override
public boolean equals(Object obj) {
return true;
}
//一般重写equals 也会重写hashCode
//根据hashcode的规则,两个对象相等其哈希值一定相等
//如果只重写equals不重写hashCode 则equals相等时hashCode不相等 产生矛盾
//以下是关于hashcode的一些规定:
// 两个对象相等,hashcode一定相等
// 两个对象不等,hashcode不一定不等
// hashcode相等,两个对象不一定相等
// hashcode不等,两个对象一定不等
@Override
public int hashCode() {
return 1;
}
}
标签:还是,System,equals,println,Integer,true,比较,out
From: https://www.cnblogs.com/Ashen-/p/17021560.html