当前位置: 首页 > ds >正文

Java核心:Object与Objects方法全解析

Java中的Object与Objects常用方法解析

一、Object类核心方法

作为所有Java类的超类,Object定义了对象的基础行为,需重点掌握以下方法:

  1. 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提供空指针安全的对象操作方法:

  1. 对象判空校验
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, "未指定用户");

三、典型应用场景
  1. 对象比较模板
@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()

最佳实践建议

  1. 重写equals()必须同步重写hashCode()
  2. 优先使用Objects方法进行空安全操作
  3. 使用Objects.toString()替代显式null检查
  4. 对不可变对象使用requireNonNull()进行构造验证
http://www.xdnf.cn/news/10484.html

相关文章:

  • VAE在扩散模型中的技术实现与应用
  • 【代码坏味道】无用物Dispensables
  • 【Qt】EventFilter,要增加事件拦截器才能拦截到事件
  • CppCon 2014 学习:Practical Functional Programming
  • 给跑步入门的一个训练课表
  • RAGFlow从理论到实战的检索增强生成指南
  • Excel如何去除公式保留数值
  • 知识管理五强对比:Baklib高效突围
  • 10000+套PPT模版合集和简历模版 【多种系列风格】免费下载
  • Python 全面技术指南:从语言本质到工程实践
  • 第六十三节:深度学习-模型推理与后处理
  • 流媒体协议分析:流媒体传输的基石
  • MCP架构全解析:从核心原理到企业级实践
  • java开发中#和$的区别
  • 「 扑翼飞行器 」悬停飞行的信号串联滤波器设计
  • leetcode hot100刷题日记——31.二叉树的直径
  • 【计算机CPU架构】ARM架构简介
  • 差分隐私-扰动机制
  • Redis 常用数据类型和命令使用
  • Go语言的原子操作
  • 告别压降损耗与反向电流困扰:汽车电子电源防反接方案全面解析与理想二极管应用
  • 桥 接 模 式
  • 导入Maven项目
  • 人工智能在智能供应链中的创新应用与未来趋势
  • 数的划分--dfs+剪枝
  • 配置前端控制器
  • 【Hot 100】121. 买卖股票的最佳时机
  • 【优比】基于STM32的紧急求助定位导盲仪系统
  • python打卡训练营打卡记录day41
  • 26考研——文件管理_文件目录(4)