Java核心:Object与Objects方法全解析
Java中的Object与Objects常用方法解析
一、Object类核心方法
作为所有Java类的超类,Object定义了对象的基础行为,需重点掌握以下方法:
- equals()
public class Student {private String id;@Overridepublic boolean equals(Object o) {if (this == o) return true;if (!(o instanceof Student)) return false;return id.equals(((Student)o).id);}
}
String s = "abc";
StringBuilder sb = new StringBuilder("abc");System.out.println(s.equals(sb));// false
//因为equals方法是被s调用的,而s是字符串
//所以equals要看String类中的
//字符串中的equals方法,先判断参数是否为字符串
//如果是字符串,再比较内部的属性
//但是参数不是字符串,直接返回false
System.out.println(sb.equals(s));// false
//因为equals方法是被sb调用的,而sb是StringBuilder
//所以这里的equals方法要看StringBuilder中的equals方法
//那么在StringBuilder当中,没有重写equals方法
//使用的是Object中的
//在Object当中默认是使用==号比较两个对象的地址值
//而这里的s和sb记录的地址值是不一样的,所以结果返回false
规范要点:
- 比较对象逻辑相等性
- 必须重写hashCode()保持一致性
- 使用instanceof进行类型检查
2.hashCode()
@Override
public int hashCode() {return Objects.hash(id, name); // 使用Objects工具类生成
}
应用场景:
- HashMap/HashSet等哈希集合的键值存储
- 根据对象属性生成唯一哈希码
3.toString()
@Override
public String toString() {return "Student{" +"id='" + id + '\'' +", name='" + name + '\'' +'}';
}// 输出结果:Student{id='S001', name='张三'}
//思考:默认情况下,因为Object类中的toString方法返回的是地址值
//所以,默认情况下,打印一个对象打印的就是地址值
//但是地址值对于我们是没有什么意义的?
//我想要看到对象内部的属性值?我们该怎么办?
//处理方案:重写父类Object类中的toString方法
//toString方法的结论:
//如果我们打印一个对象,想要看到属性值的话,那么就重写toString方法就可以了。
//在重写的方法中,把对象的属性值进行拼接。
4.clone()
public class CloneDemo implements Cloneable {@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}
注意事项:
- 必须实现Cloneable接口
- 深拷贝需要特殊处理引用类型字段
二、Objects工具类方法
java.util.Objects
提供空指针安全的对象操作方法:
- 对象判空校验
public void process(String input) {this.input = Objects.requireNonNull(input, "输入参数不能为空");// 带自定义异常信息Objects.requireNonNull(config, () -> "配置文件加载失败");
}
2.安全比较与哈希
// 空指针安全比较
boolean isEqual = Objects.equals(obj1, obj2);// 多字段哈希生成
int hash = Objects.hash(name, age, address);
3.深度比较与空值处理
// 比较数组内容
String[] arr1 = {"A", "B"};
String[] arr2 = {"A", "B"};
System.out.println(Objects.deepEquals(arr1, arr2)); // true// 空值默认处理
String desc = Objects.toString(user, "未指定用户");
三、典型应用场景
- 对象比较模板
@Override
public boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;User user = (User) o;return age == user.age &&Objects.equals(name, user.name) &&Objects.equals(email, user.email);
}
2.构建器模式校验
public class UserBuilder {private String username;public User build() {return new User(Objects.requireNonNull(username, "用户名必填"),Objects.requireNonNullElse(email, "default@example.com"));}
}
3.流式处理空值
List<String> names = Arrays.asList("Alice", null, "Bob");
names.stream().filter(Objects::nonNull).forEach(System.out::println);
四、方法对比表
功能需求 | Object方法 | Objects方法 |
---|---|---|
对象判空 | - | requireNonNull() |
空安全比较 | equals() | equals() |
多字段哈希 | hashCode() | hash() |
空值默认转换 | toString() | toString(对象, 默认值) |
深度数组比较 | - | deepEquals() |
最佳实践建议:
- 重写equals()必须同步重写hashCode()
- 优先使用Objects方法进行空安全操作
- 使用Objects.toString()替代显式null检查
- 对不可变对象使用requireNonNull()进行构造验证