java引用类型有哪些(JAVA 几种引用类型学习)
本文目录
JAVA 几种引用类型学习
1)强引用(StrongReference)强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。2)软引用(SoftReference)如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存(下文给出示例)。软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。
3) 弱引用(WeakReference)弱引用与软引用的区别在于:弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。
4)虚引用(PhantomReference)“虚引用”顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。虚引用主要用来跟踪对象被垃圾回收器回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之 关联的引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。
java中的引用数据类型有哪些
一、从概念方面来说基本数据类型:变量名指向具体的数值引用数据类型:变量名指向存数据对象的内存地址,即变量名指向hash值二、从内存构建方面来说基本数据类型:变量在声明之后java就会立刻分配给他内存空间引用数据类型:它以特殊的方式(类似C指针)指向对象实体(具体的值),这类变量声明时不会分配内存,只是存储了一个内存地址。三、从使用方面来说基本数据类型:使用时需要赋具体值,判断时使用“==”号引用数据类型:使用时可以赋null,判断时使用equals方法!
java中的引用数据数据类型是怎样的
java中有两种数据类型:基本类型和引用类型。基本类型有8个: 整数类型 byte、short、int、long 浮点数类型 float、double 字符型 char 布尔类型 boolean引用类型包括三种: 类 Class 接口 Interface 数组 Array基本类型是通过诸如 int a = 5; long b = 6L;的形式来定义的,称为自动变量,自动变量存放的是字面值,不是类的实例,它存放在内存的堆栈中,数据大小和生存期必须是确定的,存取速度比较快,在堆栈中的字面值可以共享,也就是说我们定义一个int a = 5;然后又定义了一个int b = 5;这时a与b在内存中指向的是同一个字面常量。引用类型一般是通过new关键字来创建,比如Integer num = new Integer(3);它存放在内存的堆中,可以在运行时动态的分配内存大小,生存期也不必事先告诉编译器,当引用类型变量不被使用时,Java内部的垃圾回收器GC会自动回收走。引用变量中存放的不是变量的内容,而是存放变量内容的地址。在参数传递时,基本类型都是传值,也就是传递的都是原变量的值得拷贝,改变这个值不会改变原变量,而引用类型传递的是地址,也就是参数与原变量指向的是同一个地址,所以如果改变参数的值,原变量的值也会改变。这点要注意。在java中,8种基本类型在java中都有对应的封装类型,也就是引用类型: 整数类型 Byte、Short、Integer、Long 浮点数类型 Float、Double 字符型 Character 布尔类型 Boolean有时候我们会看到这样的语句 Integer num = 3;Boolean b = true;这样定义也能行得通,其实这里面有一个自动装箱的问题,即java自动把3这个字面常量封装成了Integer对象,同理也有自动拆箱。还有些需要注意的比较特殊的地方:1.Integer类型Integer i1 = 3;Integer i2 = 3;此时i1 == i2 返回的是trueInteger i1 = 128;Integer i2 = 128;此时i1 == i2返回的是false,这时因为Integer的数值在-128~127之间时,即在int的范围内,默认是按照基本类型int来存放的,仍旧存在堆栈中,如果超出了int的范围,就按照对象的方式来存放和比较了。 2、String类型String类型我们有时候也会直接这样定义:String s = “abc“;这里的“abc“称为字符串常量,也是存在堆栈中的,s中存放的就是指向这个堆栈地址的引用,如果再定义一个String s1 = “abc“;这时,s与s1存放的是同一个地址的引用,即s与s1指向的是同一个字符串常量,s == s1的值是true,但是如果有String s2 = new String(“abc“);这时s == s2则为false,因为使用new之后,每次生成的对象都不是同一个,即使存储的内容相同。上面的s == s1,s == s2其实比较的都是地址,并不是里面的内容。如果要比较内容,可以使用equals()方法。其他的就不多说了,打起来太慢了,可以自己去看一下java编程思想。
更多文章:

instructions怎么读英语(指示两个字用英语怎么写读)
2025年2月21日 03:50

promise的形容词(为啥是a promising future不能是a promised future请从意义上解释)
2025年3月1日 17:00

html中label是什么意思啊(<label></label>标记是什么意思)
2025年2月28日 08:10

threads of commonality(翻译..高手进..帮忙翻译成英文 ..谢谢)
2025年4月5日 22:00

php代码在线解密(PHP解密高手们来看看这串代码 ^0^)
2025年3月22日 12:10

fedora和redhat(redhat和federa是什么,有什么关系,初学LINUX安装哪个好呢)
2025年2月27日 13:30

SPI通信主要应用在哪些场合?IIC和SPI通信分别有那些通信引脚
2025年2月21日 03:30