==比较身份(基本类型比值、引用类型比地址),equals()默认比地址但可重写为比内容;自定义类需重写equals()及hashCode(),推荐用Objects.equals()防空指针。

Java里比较两个值是否一样,不能只看“长得像不像”,得看你是想比“是不是同一个东西”,还是“内容一不一样”。==和equals()就是干这两件事的,分工明确,用错就容易出bug。
== 比的是“是不是同一个对象”
对基本类型(int、char、boolean等),== 直接比数值,没问题。
但对引用类型(String、Integer、自定义类等),== 比的是内存地址——也就是两个变量是不是指向堆里**同一个对象**。
- String s1 = new String("abc");
- String s2 = new String("abc");
- System.out.println(s1 == s2); // false —— 两个不同对象,地址不同
哪怕内容完全一样,只要不是同一个new出来的,== 就返回false。
equals() 默认比的也是地址,但可以“改规矩”
因为所有类都继承自Object,而Object里的equals()源码就是 return (this == obj); —— 所以没重写时,它和==效果一模一样。
立即学习“Java免费学习笔记(深入)”;
但像String、Integer、LocalDate这些常用类,都重写了equals(),让它去逐个比较字段值(比如String比每个字符,Integer比int值)。
本文档主要讲述的是Android数据格式解析对象JSON用法;JSON可以将Java对象转成json格式的字符串,可以将json字符串转换成Java。比XML更轻量级,Json使用起来比较轻便和简单。JSON数据格式,在Android中被广泛运用于客户端和服务器通信,在网络数据传输与解析时非常方便。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
- s1.equals(s2); // true —— String重写了,比的是内容
- new Integer(5).equals(new Integer(5)); // true —— 值相同就相等
- new Dog("旺财").equals(new Dog("旺财")); // false —— Dog没重写,还是比地址
自定义类必须重写equals()才能按内容比较
如果你写了Student类,想让两个学号姓名都一样的Student对象算“相等”,那不重写equals()就不行。IDE通常能自动生成,关键逻辑是:
- 先判null和this引用是否相同(提高效率)
- 再用instanceof检查类型
- 最后逐个比较关键字段(比如id、name),都相等才返回true
注意:重写equals()时,一般也要同步重写hashCode(),否则放进HashSet或HashMap可能出问题。
安全比较小技巧:用Objects.equals()防空指针
直接调用a.equals(b)时,如果a是null,会抛NullPointerException。更稳妥的写法是:
- Objects.equals(s1, s2) // 内部自动判null,安全又简洁
- Objects.equals(student1, student2)
它底层就是先检查两边是否都为null,或是否都不为null且equals返回true。
基本上就这些。记住:==看身份,equals()看长相(但得先“教过它怎么看”)。








