2) 软引用(SoftReference)
如果一个对象只具有软引用,那就类似于可有可物的生活用品。如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。只 要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。 软引用可以和一个引用队列(ReferenceQueue)联 合使用,如果软引用所引用的对象被垃圾回收, Java虚拟机就会把这个软引用加入到与之关联的引用队列中。
3) 弱引用(WeakReference)
如果一个对象只具有弱引用,那就类似于可有可物的生活用品。弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它 所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程, 因此不一定会很快发现那些只具有弱引用的对象。 弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回 收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。
4) 虚引用(PhantomReference)
"虚引用"顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在 任何时候都可能被垃圾回收。 虚引用主要用来跟踪对象被垃圾回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列 (ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之 关联的引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。程序如果发现某个虚引用已经被加入到引用队 列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。
16、String str1="abc" 和String str2=new String("abc")的区别?
Java虚拟机在执行这段代码时,遇到双引号操作符,它会自动创建一个String对象,该String对象所代表的值就是abc,然后再返回该对象的一个引用。
对应str1字符串来说,它的创建过程同上所述。在Java5.0及其以后的版本,在创建该对象之前,JVM会在String对象池中去搜索该字符串对象是否已经被创建,如果已经被创建,则直接返回一个引用,否则先创建再返回引用。
而str2字符串变量,它的创建过程就要多一个步骤。它会额外的创建一个新的String对象,也就是new关键字的作用,并且返回一个引用给str2 。
Java中有对象池的概念,Java虚拟机启动时候会实例化9个对象池,分别用来存储8中基本类型的包装类和String对象。对象池的存在是为了频繁的创建和销毁对象而影响系统性能。
str1是在对象池中取对象,str2方法直接生成新的对象。
任何情况下,只要new一个String对象都是创建了新的对象。
因此表达式str1==str2的结果是false的。
17、String不能被继承,String作为方法参数时是传值而不是传引用