比较 == 还是 equals
比较 == ? 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;
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析