// 正确重写示例@OverridepublicinthashCode(){returnObjects.hash(name, age);// 基于关键字段生成}@Overridepublicbooleanequals(Object obj){if(this== obj)returntrue;if(obj ==null||getClass()!= obj.getClass())returnfalse;Person person =(Person) obj;return age == person.age &&Objects.equals(name, person.name);}
String vs StringBuffer vs StringBuilder
特性
String
StringBuffer
StringBuilder
可变性
❌ 不可变
✅ 可变
✅ 可变
线程安全
✅ 安全
✅ (synchronized)
❌ 不安全
性能
低(频繁创建新对象)
中
高
适用场景
常量字符串
多线程环境字符串操作
单线程环境字符串操作
// 性能对比示例String result ="";// 每次拼接生成新对象for(int i =0; i <10000; i++){
result += i;// 效率极低!}StringBuilder sb =newStringBuilder();// 单线程首选for(int i =0; i <10000; i++){
sb.append(i);// 内存操作,高效}
List<String> list =Arrays.asList("a","b","c");
list.stream().filter(s ->!s.equals("b")).map(String::toUpperCase).forEach(System.out::println);// 输出 A, C
4. Optional 类
Optional<String> name =Optional.ofNullable(getName());System.out.println(name.orElse("default"));// 避免 NPE