Object 类
Object 类常见方法有什么
String toString()
int hashCode()
boolean equals(Object obj)
protected Object clone()
Class<?> getClass()
== 和 equals 方法的区别
== 操作符用于比较两个对象的引用是否相等
equals() 方法比较对象的内容,但默认情况下与 == 的行为相同(比较引用)。可以覆盖 equals() 方法以便在内容上进行比较,例如 String、Integer、Double 等。
// Object类 默认实现
public boolean equals(Object obj) {
return (this == obj);
}
// Integer类 实现
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
补充:
- 包装类数值缓存
- String 常量池
为什么有 hashCode 方法
为对象生成一个整数哈希值,该值可以用于哈希表等数据结构中快速查找和比较对象。
为什么重写 equals 方法时也要重写 hashCode方法?
equals 方法和 hashCode 方法应该具有一致性吗,从而保证哈希表等数据结构的正确性和一致性。
深拷贝和浅拷贝有什么区别
深拷贝:复制并创建了一个新对象
浅拷贝:复制了对象引用
深拷贝实现方式
浅拷贝实现方式:clone 方法默认实现就是浅拷贝
- 实现
Cloneable
接口,并重写clone
方法
public class User implements Cloneable {
private String name;
private Job job;
// get..., set...
@Override
public User clone() throws CloneNotSupportedException {
User user = (User) super.clone();
// User 对象中所有 引用类型 属性都要执行 clone 方法
user.setJob(user.getJob().clone());
return user;
}
}
- 把对象转换成 json 再转回对象
- 集合深拷贝
// 1. 创建原对象
List<User> userList = new ArrayList<>();
// 2. 创建深拷贝对象
List<User> userCopyList = new ArrayList<>(userList);
String 类
三个 String 类似物的关系
- Sting:不可变
- StringBuffer:可变、线程安全(效率低)
- StringBuilder:可变、线程不安全(效率高)
表格 还在加载中,请等待加载完成后再尝试复制
为什么 String 类型不可变
- 线程安全:不可变字符串是线程安全的,多个线程可以同时访问和共享同一个字符串对象。
- 安全性:避免由于某个引用改变字符串的内容,而影响其它相同指向的引用
- 性能优化:由于不可变字符串是不可变的,它们可以在创建后被缓存和重复使用。这种优化减少了在运行时创建新字符串对象的开销。
- 方便性:作为Map的键或在多个线程之间共享。