java 问题!

谁能给我讲讲java中的引用类型?越详细越好,最好的给追加10分。... 谁能给我讲讲java中的引用类型?越详细越好,最好的给追加10分。 展开
 我来答
晚生好学
2010-10-25 · TA获得超过5920个赞
知道小有建树答主
回答量:1005
采纳率:50%
帮助的人:494万
展开全部
Java 中一共有 4种类型的引用 : StrongReference、 SoftReference、 WeakReference 以及 PhantomReference
这 4 种类型的引用与 GC 有着密切的关系, 让我们逐一来看它们的定义和使用场景 :
1. Strong Reference

StrongReference 是 Java 的默认引用实现, 它会尽可能长时间的存活于 JVM 内, 当没有任何对象指向它时 GC 执行后将会被回收
Java代码
@Test
public void strongReference() {
Object referent = new Object();

/**
* 通过赋值创建 StrongReference
*/
Object strongReference = referent;

assertSame(referent, strongReference);

referent = null;
System.gc();

/**
* StrongReference 在 GC 后不会被回收
*/
assertNotNull(strongReference);
}

2. WeakReference & WeakHashMap

WeakReference, 顾名思义, 是一个弱引用, 当所引用的对象在 JVM 内不再有强引用时, GC 后 weak reference 将会被自动回收
Java代码
@Test
public void weakReference() {
Object referent = new Object();
WeakReference<Object> weakRerference = new WeakReference<Object>(referent);

assertSame(referent, weakRerference.get());

referent = null;
System.gc();

/**
* 一旦没有指向 referent 的强引用, weak reference 在 GC 后会被自动回收
*/
assertNull(weakRerference.get());
}

WeakHashMap 使用 WeakReference 作为 key, 一旦没有指向 key 的强引用, WeakHashMap 在 GC 后将自动删除相关的 entry
Java代码
@Test
public void weakHashMap() throws InterruptedException {
Map<Object, Object> weakHashMap = new WeakHashMap<Object, Object>();
Object key = new Object();
Object value = new Object();
weakHashMap.put(key, value);

assertTrue(weakHashMap.containsValue(value));

key = null;
System.gc();

/**
* 等待后台线程清理无效 entries
*/
Thread.sleep(1000);

/**
* 一旦没有指向 key 的强引用, WeakHashMap 在 GC 后将自动删除相关的 entry
*/
assertFalse(weakHashMap.containsValue(value));
}

3. SoftReference

SoftReference 于 WeakReference 的特性基本一致, 最大的区别在于 SoftReference 会尽可能长的保留引用直到 JVM 内存不足时才会被回收(虚拟机保证), 这一特性使得 SoftReference 非常适合缓存应用
Java代码

@Test
public void softReference() {
Object referent = new Object();
SoftReference<Object> softRerference = new SoftReference<Object>(referent);

assertNotNull(softRerference.get());

referent = null;
System.gc();

/**
* soft references 只有在 jvm OutOfMemory 之前才会被回收, 所以它非常适合缓存应用
*/
assertNotNull(softRerference.get());
}

4. PhantomReference

Phantom Reference 与 WeakReference 和 SoftReference 有很大的不同, 因为它的 get() 方法永远返回 null

Java代码
@Test
public void phantomReferenceAlwaysNull() {
Object referent = new Object();
PhantomReference<Object> phantomReference = new PhantomReference<Object>(referent, new ReferenceQueue<Object>());

/**
* phantom reference 的 get 方法永远返回 null
*/
assertNull(phantomReference.get());
}

5. 小结
一般的应用程序不会涉及到 Reference 编程, 但是了解这些知识会对理解 GC 的工作原理以及性能调优有一定帮助, 在实现一些基础性设施比如缓存时也可能会用到, 希望本文能有所帮助
大时代暑
2010-10-25 · TA获得超过2.5万个赞
知道大有可为答主
回答量:4111
采纳率:0%
帮助的人:4834万
展开全部
1。首先,你要明白什么是变量。变量的实质是一小块内存单元。这一小块内存里存储着变量的值

比如int a = 1;

a就是变量的名名,1就是变量的值。

而当变量指向一个对象时,这个变量就被称为引用变量

比如A a =new A();

a就是引用变量,它指向了一个A对象,也可以说它引用了一个A对象。我们通过操纵这个a来操作A对象。 此时,变量a的值为它所引用对象的地址
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
LinShara
2010-11-02
知道答主
回答量:81
采纳率:0%
帮助的人:0
展开全部
当变量指向一个对象时,这个变量就被称为引用变量
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
找到了好工作
2010-10-27
知道答主
回答量:37
采纳率:0%
帮助的人:0
展开全部
引用变量就是指向了一个对象
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式