本文目录一览:
北大青鸟java培训:java编程引用类型分析?
我们在使用java编程开发语言开发软件的时候通常都会new对象,然后通过对对象的引用来实现不同的编程需求,而今天电脑培训就一起来了解一下,java编程开发语言中都有哪些常见的引用方法。
1:虚引用1.1简介:虚引用是所有引用中强度弱的,它完全类似于没有引用,在java.reflact.PhantomReference类中实现。
虚引用对象本身没有太大影响,对象甚至感觉不到虚引用的存在。
如果一个对象存在虚引用,那么它和没有引用的效果大致相同,虚引用无法引用任何堆中的对象作用:虚引用主要用于跟踪对象被JVM垃圾回收的状态,可以通过它来手机GC的行为。
可以通过检查与虚引用关联的引用队列中是否已经包含指定的虚引用,从而了解虚引用锁引用的对象是否被回收。
注意:虚引用无法单独使用,虚引用必须和引用队列(ReferenceQueue)联合使用.被虚引用所引用对象被垃圾回收后,虚引用将被添加到引用队列中。
2:弱引用简介:弱引用和虚引用有点类似,不同之处在于虚引用锁引用的对象生存期比虚引用长一点。
虚引用在java.reflact.WeakReference类实现。
在系统进行垃圾回收的时候,不管系统内存是否足够,总是回收该对象所占用的内存.但是弱引用的强度是要大于虚引用的3:软引用简介:软引用比弱引用的强度高一点,它是通过java.reflact.SoftReference来实现。
对于软引用来说,当系统内存空间足够时,它不会被系统回收,程序中改对象的引用也是有效的。
而当系统的内存空间不够时,系统将会回收它。
作用:软引用是强引用好的替代,它一定程度上可以避免系统内存不足的异常,可以充分使用软引用来解决内存紧张的问题。
4:强引用简介:强引用很常见,在平时的程序中,我们新new一个对象,比如Objectobject=newObject();那么这个object就是指向object对象的强引用。
强引用的特点就是:被引用的java对象绝对不会被垃圾回收机制回收,即使系统的内存非常紧张,即使java以后也用不到,jvm不会回收强引用所引用的java对象。
java中引用是什么??
关于java中的引用 我觉得在"think in java"这本书里面讲得很好 在那本书里 他们把引用叫做"句柄"(Handle)
java中就是用"句柄"来操纵对象的
在java中 任何东西都可以看作是对象 因此,我们可采用一种统一的语法,任何地方均可照搬不误。但要注意,尽管将一切都“看作”对象,但操纵的标识符实际是指向一个对象的“句柄”(Handle)。在其他Java参考书里,还可看到有的人将其称作一个“引用”,甚至一个“指针”。可将这一情形想象成用遥控板(句柄)操纵电视机(对象)。只要握住这个遥控板,就相当于掌握了与电视机连接的通道。但一旦需要“换频道”或者“关小声音”,我们实际操纵的是遥控板(句柄),再由遥控板自己操纵电视机(对象)。如果要在房间里四处走走,并想保持对电视机的控制,那么手上拿着的是遥控板,而非电视机。
此外,即使没有电视机,遥控板亦可独立存在。也就是说,只是由于拥有一个句柄,并不表示必须有一个对象同它连接。
java 中的引用是什么意思?
在java实现某个功能的时候,会将类实例化成对象,然后jvm再对实例化后的对象进行操作。
实例化后的对象可以赋值,也可以引用。赋值时,java会开辟一个新的地址用于存放变量,而引用则不开辟地址。
String a = "a";
String b = "a";
将String类实例化成对象a与b,并赋值
String c = new String("a");
将c指向new出来的String型对象"a"
System.out.println(a==b);
System.out.println(a==c);
由于a与b都为对象赋值,打印出来的结果应该是true
而c是引用对象“a”,所以打印出来的结果应该是false
对象:一个类的具体实例化;
引用:对象的别名,使用该别名可以存放该对象,编译器不会为引用分配空间,新对象与源对象共用一个存储地址空间;引用的生命周期是它所引用的对象的生命周期,函数里返回一个局部对象的引用是很危险的
给你推荐一种最简单的理解方式:引用就好比是给商品贴的标签,你通过标签可以拿到这个商品.......我开始就是这么理解的,后来用多了就意会啦.....
java三个引用类型
四种引用类型
所以在 JDK.1.2 之后,Java 对引用的概念进行了扩充,将引用分为了:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)4 种,这 4 种引用的强度依次减弱。
一,强引用
Java中默认声明的就是强引用,比如:
Object obj = new Object(); //只要obj还指向Object对象,Object对象就不会被回收
obj = null; //手动置null
只要强引用存在,垃圾回收器将永远不会回收被引用的对象,哪怕内存不足时,JVM也会直接抛出OutOfMemoryError,不会去回收。如果想中断强引用与对象之间的联系,可以显示的将强引用赋值为null,这样一来,JVM就可以适时的回收对象了
二,软引用
软引用是用来描述一些非必需但仍有用的对象。在内存足够的时候,软引用对象不会被回收,只有在内存不足时,系统则会回收软引用对象,如果回收了软引用对象之后仍然没有足够的内存,才会抛出内存溢出异常。这种特性常常被用来实现缓存技术,比如网页缓存,图片缓存等。
在 JDK1.2 之后,用java.lang.ref.SoftReference类来表示软引用。
下面以一个例子来进一步说明强引用和软引用的区别:
在运行下面的Java代码之前,需要先配置参数 -Xms2M -Xmx3M,将 JVM 的初始内存设为2M,最大可用内存为 3M。
首先先来测试一下强引用,在限制了 JVM 内存的前提下,下面的代码运行正常
public class TestOOM {
public static void main(String[] args) {
testStrongReference();
}
private static void testStrongReference() {
// 当 new byte为 1M 时,程序运行正常
byte[] buff = new byte[1024 * 1024 * 1];
}
}
但是如果我们将
byte[] buff = new byte[1024 * 1024 * 1];
替换为创建一个大小为 2M 的字节数组
byte[] buff = new byte[1024 * 1024 * 2];
则内存不够使用,程序直接报错,强引用并不会被回收
接着来看一下软引用会有什么不一样,在下面的示例中连续创建了 10 个大小为 1M 的字节数组,并赋值给了软引用,然后循环遍历将这些对象打印出来。
public class TestOOM {
private static ListObject list = new ArrayList();
public static void main(String[] args) {
testSoftReference();
}
private static void testSoftReference() {
for (int i = 0; i 10; i++) {
byte[] buff = new byte[1024 * 1024];
SoftReferencebyte[] sr = new SoftReference(buff);
list.add(sr);
}
System.gc(); //主动通知垃圾回收
for(int i=0; i list.size(); i++){
Object obj = ((SoftReference) list.get(i)).get();
System.out.println(obj);
}
}
}
打印结果:
我们发现无论循环创建多少个软引用对象,打印结果总是只有最后一个对象被保留,其他的obj全都被置空回收了。
这里就说明了在内存不足的情况下,软引用将会被自动回收。
值得注意的一点 , 即使有 byte[] buff 引用指向对象, 且 buff 是一个strong reference, 但是 SoftReference sr 指向的对象仍然被回收了,这是因为Java的编译器发现了在之后的代码中, buff 已经没有被使用了, 所以自动进行了优化。
如果我们将上面示例稍微修改一下:
private static void testSoftReference() {
byte[] buff = null;
for (int i = 0; i 10; i++) {
buff = new byte[1024 * 1024];
SoftReferencebyte[] sr = new SoftReference(buff);
list.add(sr);
}
System.gc(); //主动通知垃圾回收
for(int i=0; i list.size(); i++){
Object obj = ((SoftReference) list.get(i)).get();
System.out.println(obj);
}
System.out.println("buff: " + buff.toString());
}
则 buff 会因为强引用的存在,而无法被垃圾回收,从而抛出OOM的错误。
如果一个对象惟一剩下的引用是软引用,那么该对象是软可及的(softly reachable)。垃圾收集器并不像其收集弱可及的对象一样尽量地收集软可及的对象,相反,它只在真正 “需要” 内存时才收集软可及的对象。
三,弱引用
弱引用的引用强度比软引用要更弱一些,无论内存是否足够,只要 JVM 开始进行垃圾回收,那些被弱引用关联的对象都会被回收。在 JDK1.2 之后,用 java.lang.ref.WeakReference 来表示弱引用。
我们以与软引用同样的方式来测试一下弱引用:
private static void testWeakReference() {
for (int i = 0; i 10; i++) {
byte[] buff = new byte[1024 * 1024];
WeakReferencebyte[] sr = new WeakReference(buff);
list.add(sr);
}
System.gc(); //主动通知垃圾回收
for(int i=0; i list.size(); i++){
Object obj = ((WeakReference) list.get(i)).get();
System.out.println(obj);
}
}
打印结果:
可以发现所有被弱引用关联的对象都被垃圾回收了。
四,虚引用
虚引用是最弱的一种引用关系,如果一个对象仅持有虚引用,那么它就和没有任何引用一样,它随时可能会被回收,在 JDK1.2 之后,用 PhantomReference 类来表示,通过查看这个类的源码,发现它只有一个构造函数和一个 get() 方法,而且它的 get() 方法仅仅是返回一个null,也就是说将永远无法通过虚引用来获取对象,虚引用必须要和 ReferenceQueue 引用队列一起使用。
public class PhantomReferenceT extends ReferenceT {
/**
* Returns this reference object's referent. Because the referent of a
* phantom reference is always inaccessible, this method always returns
* codenull/code.
*
* @return codenull/code
*/
public T get() {
return null;
}
public PhantomReference(T referent, ReferenceQueue? super T q) {
super(referent, q);
}
}
那么传入它的构造方法中的 ReferenceQueue 又是如何使用的呢?
五,引用队列(ReferenceQueue)
引用队列可以与软引用、弱引用以及虚引用一起配合使用,当垃圾回收器准备回收一个对象时,如果发现它还有引用,那么就会在回收对象之前,把这个引用加入到与之关联的引用队列中去。程序可以通过判断引用队列中是否已经加入了引用,来判断被引用的对象是否将要被垃圾回收,这样就可以在对象被回收之前采取一些必要的措施。
java 什么是引用?
String s = new String();s就是引用,说它是引用是就它的行为而言的,s引用着一个对象,换句话说就是s指向了一个对象;不是Java中没有指针,其实Java到处都是指针,在我们编码这个角度来看,s就是引用,言外之意就是你无法直接操作一个对象,你要想操作一个对象你必须通过该对象的引用!这也是为什么叫引用。在我们看来Java确是屏蔽了指针的复杂操作,这只是为我们编程带来方便,但是真正在运行时,在Java程序跑起来之后,会将引用转换成一个指针,s这个引用被转换为一个指针,真真正正的指向了内存中存储体的某个存储单元的某些位某些01; 回答人的补充 2009-09-20 03:39 对象是对象!引用时引用!这是两个不同的概念,上面怎么能说对象就是引用呢?只不过我们是通过引用操作对象,引用是一块内存,对象是另一块内存!