java如何引用
引用类型
Java中的引用类型分为四种:强引用、软引用、弱引用和虚引用。每种引用类型在内存管理和垃圾回收中表现不同。
强引用是最常见的引用类型,只要强引用存在,对象就不会被垃圾回收器回收。例如:
Object obj = new Object();
软引用(SoftReference)在内存不足时会被垃圾回收器回收,适合用于实现内存敏感的缓存。示例:
SoftReference<Object> softRef = new SoftReference<>(new Object());
弱引用(WeakReference)在垃圾回收时无论内存是否充足都会被回收,常用于实现规范化映射。示例:

WeakReference<Object> weakRef = new WeakReference<>(new Object());
虚引用(PhantomReference)必须与引用队列联合使用,主要用于跟踪对象被垃圾回收的状态。示例:
ReferenceQueue<Object> queue = new ReferenceQueue<>();
PhantomReference<Object> phantomRef = new PhantomReference<>(new Object(), queue);
引用传递
Java中方法参数传递本质上是值传递,但对于对象类型传递的是引用的副本。修改引用指向的对象内容会影响原始对象,但重新赋值引用不会影响原始引用。
对象内容修改示例:

void modifyList(List<String> list) {
list.add("new item");
}
引用重新赋值示例:
void reassignList(List<String> list) {
list = new ArrayList<>(); // 不影响外部引用
}
引用比较
使用==比较引用时比较的是内存地址,使用equals()方法比较的是对象内容。字符串常量池的特殊情况需要注意:
String s1 = "hello";
String s2 = "hello";
String s3 = new String("hello");
s1 == s2; // true,指向常量池同一对象
s1 == s3; // false,不同对象
s1.equals(s3); // true,内容相同
引用与垃圾回收
理解引用对垃圾回收的影响很重要。强引用会阻止垃圾回收,而其他引用类型则允许对象在不同条件下被回收。使用引用队列可以跟踪对象回收状态:
ReferenceQueue<Object> rq = new ReferenceQueue<>();
WeakReference<Object> wr = new WeakReference<>(new Object(), rq);
System.gc();
Reference<?> ref = rq.poll(); // 获取被回收的引用
合理使用不同引用类型可以帮助优化内存使用,特别是在需要管理大型对象或缓存场景时。






