java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > JAVA对象方法比较

JAVA中对象常见的几种方法比较

作者:第六章初

这篇文章主要介绍了JAVA中对象常见的几种方法比较,包括基本元素的==和equals()比较、自定义对象的equals()+hashCode()实现、Comparable接口的compareTo方法实现、Comparator接口的compare方法实现等,需要的朋友可以参考下

引言

基本元素比较

Java 中基本元素(基本数据类型 + 对应的包装类 + 常用引用类型如 String)的比较规则,可以总结为以下核心要点:

1. 基本数据类型:直接用==比较值

Java 的 8 种基本数据类型(byteshortintlongfloatdoublecharboolean),只能用 == 比较值是否相等,不存在 equals() 方法。

int a = 10;
int b = 10;
System.out.println(a == b); // true,值相等

2. 包装类:分两种情况

包装类(IntegerLongBoolean 等)是引用类型,但有常量池缓存机制,比较规则需区分场景:

比较方式适用场景规则说明
==缓存范围内的包装类对象对于 Integer(-128 ~ 127)、Booleantrue/false)等,缓存池内的对象用 == 会返回 true
==缓存范围外的包装类对象会创建新对象,== 比较的是地址,返回 false
equals()所有包装类对象比较的是底层基本类型的值,推荐使用

示例:

Integer i1 = 127;
Integer i2 = 127;
System.out.println(i1 == i2); // true,在缓存范围内
System.out.println(i1.equals(i2)); // true

Integer i3 = 128;
Integer i4 = 128;
System.out.println(i3 == i4); // false,超出缓存范围
System.out.println(i3.equals(i4)); // true

3. String 类型:核心看==和equals()的区别

String 是引用类型,且有字符串常量池,比较规则是 Java 面试高频考点:

示例:

String s1 = "hello";
String s2 = "hello";
String s3 = new String("hello");

System.out.println(s1 == s2); // true,常量池同一对象
System.out.println(s1 == s3); // false,地址不同
System.out.println(s1.equals(s3)); // true,内容相同

基本元素比较的核心建议

  1. 基本数据类型:直接用 == 即可。
  2. 包装类和 String:优先用 equals() 比较内容,避免因缓存/常量池机制导致的逻辑错误。
  3. 包装类和基本类型混合比较:包装类会自动拆箱为基本类型,用 == 直接比的值。
    Integer i = 10;
    int j = 10;
    System.out.println(i == j); // true,i 自动拆箱为 int
    

总结

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

对象的比较

Java 中自定义对象的比较,核心围绕 内容相等性判断大小关系排序 两大需求,对应四种实现方式,其中前三种是开发中最常用的:

1. 覆写基类Object的equals()+hashCode()

核心用途

判断两个对象的内容是否相等,是集合去重、条件判断的基础。

核心规则

实现要点

  1. 自反性:x.equals(x) 必须返回 true
  2. 对称性:x.equals(y)y.equals(x) 结果一致。
  3. 传递性:x.equals(y)y.equals(z),则 x.equals(z)
  4. 一致性:对象属性不变时,多次调用 equals 结果不变。
  5. 非空性:x.equals(null) 必须返回 false

示例

public class User {
    private Long id;
    private String name;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return Objects.equals(id, user.id) && Objects.equals(name, user.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name);
    }
}

适用场景

2. 基于Comparable接口的比较

核心用途

定义对象的自然排序规则(默认排序规则),让对象“天生可比较”。

核心方法

实现 int compareTo(T o) 方法:

实现要点

示例

public class User implements Comparable<User> {
    private Long id;
    private String name;

    // 按 id 升序排序
    @Override
    public int compareTo(User o) {
        return this.id.compareTo(o.id);
    }
}

public class UserNameLengthComparator implements Comparator<User> {
@Overridepublic int compare (User u1, User u2) {
// 比较两个 User 对象名字的长度
int len1 = u1.getName ().length ();
int len2 = u2.getName ().length ();
// 按名字长度升序排列,如果想降序就反过来减
return len1 - len2;
 }
}
//然后,当你需要排序的时候,比如对一个 List<User>进行排序,就可以把这个 Comparator 传进去:
List<User> userList = new ArrayList<>();
// 假设已经往 userList 里加了一些 User 对象Collections.sort (userList, new UserNameLengthComparator ());

适用场景

3. 基于Comparator比较器的比较

核心用途

定义对象的定制排序规则,灵活扩展多种排序方式,不修改对象本身代码。

核心方法

实现 int compare(T o1, T o2) 方法,规则和 compareTo 一致。

实现形式

示例

// 方式1:Lambda 表达式,按姓名长度降序
Comparator<User> nameLengthComparator = (u1, u2) -> 
        Integer.compare(u2.getName().length(), u1.getName().length());

// 方式2:工具类,按姓名升序
Comparator<User> nameComparator = Comparator.comparing(User::getName);

适用场景

总结一下

比较方式核心作用灵活性适用场景
equals() + hashCode()判断内容相等集合去重、逻辑相等判断
Comparable自然排序(默认规则)对象有固定排序规则
Comparator定制排序(多规则)多种排序需求、第三方类排序
Objects.compare简化比较 + 空指针防护JDK 8+ 简洁排序代码

选型口诀

可以理解Comparable 就是让你的对象自己学会排序,比如 User 类实现了它,就相当于 User 自己知道 “我要按 id 排”。而 Comparator 呢,就是一个外部的排序小工具,你想让 User 按名字排,就做一个按名字比较的小工具传给排序方法,不用改 User 本身。一个是自带技能,一个是外部工具.

到此这篇关于JAVA中对象常见的几种方法比较的文章就介绍到这了,更多相关JAVA对象方法比较内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文