高分请教几个学习Java中遇到的问题。

kenees 2003-08-23 11:19:10
我看的是Thinking In Java,这两天看到容器类,有几个问题向大家请教
1,持有references这一节,SoftReference,WeakReference,PhantomReference,它们的用法和作用,我实在是搞不明白,希望各位能帮帮我,还有ReferenceQuee又是干什么用的呢,他的一个函数poll()作用为何呢?(我翻了CSDN以前的资料都没有找到合适的解答)
2,这一节有一句话“当你继续希望持有某个reference,但你也允许垃圾回收器将他释放,这时候你应该使用Reference对象”,这句话怎么理解啊,谁能举个例子呢,谢谢。

3,在一个SET中,比如HashSet中,有什么办法可以取得其中的某个指定对象呢?
比如,像在List.get(int)函数。

希望各位帮我!!

...全文
23 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhirenshao 2003-08-24
  • 打赏
  • 举报
回复
在Java里面有四种Refenerence:
1. 普通reference
2. soft reference
3. weak reference
4. phantom reference

先说说普通Reference把。 当一个对象有一个或多个普通REFERENCE指向它的时候,它是不会被垃圾收集器回收的,当这个对象失去了最后一个普通REFERENCE之后,垃圾收集器就可以将其回收(但不一定马上进行,这取决于垃圾收集器)。
例如
Object o = new Object();
Object g = o;
o = null;
g = null;

当o 和g 都被设成null以后,那个对象就失去了最后一个REFERENCE,垃圾收集器有权利将其立即回收。

那么,SoftReference有什么用呢? 就是你不希望某个对象被立即回收,但当内存不够的时候再回收它。
举个例子,假设你你要做一个图象处理软件,你为当前用户正在编辑的图象建立了一个对象,每当用户对图象进行改动后,你就新建一个对象,来取代原来那个。 但在你的程序里,需要实现一个“撤消”的操作,就是用户可以返回到上一步操作,同时你还需要实现“多步撤消”,就是用户可以返回到很多步操作以前的那个图象。

这时候,如果你只是简单地用新的图象取代旧的图象,那么旧图象的对象将因为失去了最后一个REFERENCE而被回收,你将无法返回到上一步操作以前的图象了。 解决办法是给那些旧的图象一个SoftReference。 这样一来,虽然那些旧的图象对象已经失去了所有普通REFERENCE,但它们有SoftReference指向他们,所以垃圾收集器不会立即回收他们,而只有当垃圾收集器发现当前内存不够的时候,才会试图释放SoftReference所指向的对象。 这样,你就可以通过SoftReference来找回那些旧的图象,从而实现了“撤消”的功能。

再来说说WeakReference,假设你想观察一个对象是什么时候被回收的,你可以用一个REFERENCE指向这个对象,当这个REFERENCE自动变成null了以后就说明这个对象被回收了。

不幸的是,这是无法办到的,因为只要有一个REFERENCE还指向这个对象,它就不会被回收,这里是你用于观察的那个REFERENCE。 有一个办法,那就是WeakReference。 你可以用一个WeakReference指向你要观察的对象,当这个对象失去了最后一个普通REFERENCE后,它就将被回收,这时你只要测试你的那个WeakReference是什么时候变成null的,就知道对象何时被回收了。 而你用于观察的那个WeakReference虽然指向那个对象,但无法阻止对象的回收(所以叫它Weak)

PhantomReference 只能在ReferenceQueue里被建立,主要是系统自己使用的,我们用不到的。它也无法阻止一个对象被回收。

ReferenceQueue是垃圾收集器用来注册哪些对象是可以被回收的。 垃圾收集器会将可被回收的对象放进这个队列里。 但我们在编程的时候是基本不会用到的
dddd8888 2003-08-24
  • 打赏
  • 举报
回复
up
kenees 2003-08-23
  • 打赏
  • 举报
回复
谢谢各位帮忙,我在UP一下
teaky2002 2003-08-23
  • 打赏
  • 举报
回复
高级内容,没有研究过。帮up
ewingchen 2003-08-23
  • 打赏
  • 举报
回复
关于问题3,SET有方法啊,看一下很简单的
lcl101 2003-08-23
  • 打赏
  • 举报
回复
这就是传说中的java可及对象拉
ewingchen 2003-08-23
  • 打赏
  • 举报
回复
关于问题1.2,建议楼主看一下<<程序员>>2003第8期中的有关弱可及对象使用的文章(具体文章名称忘了)
prokingvov 2003-08-23
  • 打赏
  • 举报
回复
一样只能 up ~~
kzjiang820218 2003-08-23
  • 打赏
  • 举报
回复
我也帮你up一下!
kenees 2003-08-23
  • 打赏
  • 举报
回复
自己顶以下UP

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧