什么是引用:引用就是一个内存地址,一般存在内存的栈(stack)空间中。ps:这里指的内存一般都是java内存模型,而非操作系统内存
Java中一共有4种引用方式
1.强引用 2.软引用 3.弱引用 4.虚引用
1.强引用 强引用指向的对象永远不会被垃圾回收器回收,直至内存溢出oom
使用场景:String str = new String(“str”);
2.软引用 软引用指向的对象在内存不足时,会被垃圾回收器回收
使用场景:创建缓存的时候,创建的对象放进缓存中,当内存不足时,JVM就会回收早先创建的对象。PS:图片编辑器,视频编辑器之类的软件可以使用这种思路。
软引用使用例子传送门:https://www.cnblogs.com/mjorcen/p/3968018.html
3.弱引用 弱引用指向的对象不管内存不足与否,都会被垃圾回收器回收
使用场景:Java源码中的java.util.WeakHashMap中的key就是使用弱引用,我的理解就是,一旦我不需要某个引用,JVM会自动帮我处理它,这样我就不需要做其它操作。
弱引用使用例子传送门:http://www.importnew.com/21206.html
4.虚引用 在java8版本之前,只有在虚引用被回收后,虚引用指向的对象才会被垃圾回收器回收;而在java9以及更新的版本中,虚引用回收与否不会对指向的对象造成任何影响
使用场景:对象销毁前的一些操作,比如说资源释放等。Object.finalize()虽然也可以做这类动作,但是这个方式即不安全又低效
虚引用使用例子传送门:http://blog.csdn.net/aitangyong/article/details/39450341
一般来说,java中的传递都是都是值传递,即在向一个方法中传递某一个对象的引用后,在方法中的引用都是一个新的拷贝(这个应该是牵扯到深拷贝和浅拷贝的相关的内容),当对这个引用本身做任何操作,都不会影响到原有引用,但若是对引用指向的对象做操作,如赋予这个引用指向的对象的中的某个属性的值后,这个对象本身会受到影响