精华内容
下载资源
问答
  • 引用类型的类结构如图所示。1.强引用Java中的引用,类似C语言中最难的指针。(我是C语言入门编程,指针的概念还是很深入我心。)通过引用,可以对堆中的对象进行操作。如:StringBuffer stri...

    在Java中提供了四个级别的引用:强引用,软引用,弱引用和虚引用。在这四个引用类型中,只有强引用FinalReference类是包内可见,其他三种引用类型均为public,可以在应用程序中直接使用。引用类型的类结构如图所示。

    ed69fc0640721d8ec0900f6136021a90.png

    1.强引用

    Java中的引用,类似C语言中最难的指针。(我是C语言入门编程,指针的概念还是很深入我心。)通过引用,可以对堆中的对象进行操作。如:

    StringBuffer stringBuffer = new StringBuffer("Helloword");

    变量str指向StringBuffer实例所在的堆空间,通过str可以操作该对象。

    1acbc90e6c5fed29aa40cea2cdfcd711.png

    强引用的特点:

    1. 强引用可以直接访问目标对象。

    2. 强引用所指向的对象在任何时候都不会被系统回收。JVM宁愿抛出OOM异常,也不会回收强引用所指向的对象。

    3. 强引用可能导致内存泄漏。

    2.软引用

    软引用是除了强引用外,最强的引用类型。可以通过java.lang.ref.SoftReference使用软引用。一个持有软引用的对象,不会被JVM很快回收,JVM会根据当前堆的使用情况来判断何时回收。当堆使用率临近阈值时,才会去回收软引用的对象。因此,软引用可以用于实现对内存敏感的高速缓存。

    SoftReference的特点是它的一个实例保存对一个Java对象的软引用, 该软引用的存在不妨碍垃圾收集线程对该Java对象的回收。也就是说,一旦SoftReference保存了对一个Java对象的软引用后,在垃圾线程对 这个Java对象回收前,SoftReference类所提供的get()方法返回Java对象的强引用。一旦垃圾线程回收该Java对象之后,get()方法将返回null。

    下面举一个例子说明软引用的使用方法。

    在你的IDE设置参数 -Xmx2m -Xms2m规定堆内存大小为2m。

    @Test
     

    运行结果:

    是否被回收cn

    打开被注释掉的new byte[1024*100]语句,这条语句请求一块大的堆空间,使堆内存使用紧张。并显式的再调用一次GC,结果如下:

    是否被回收null

    说明在系统内存紧张的情况下,软引用被回收。

    3.弱引用

    弱引用是一种比软引用较弱的引用类型。在系统GC时,只要发现弱引用,不管系统堆空间是否足够,都会将对象进行回收。在java中,可以用java.lang.ref.WeakReference实例来保存对一个Java对象的弱引用。

    public 

    运行结果:

    是否被回收cn

    软引用,弱引用都非常适合来保存那些可有可无的缓存数据,如果这么做,当系统内存不足时,这些缓存数据会被回收,不会导致内存溢出。而当内存资源充足时,这些缓存数据又可以存在相当长的时间,从而起到加速系统的作用。

    4.虚引用

    虚引用是所有类型中最弱的一个。一个持有虚引用的对象,和没有引用几乎是一样的,随时可能被垃圾回收器回收。当试图通过虚引用的get()方法取得强引用时,总是会失败。并且,虚引用必须和引用队列一起使用,它的作用在于跟踪垃圾回收过程。

    当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在垃圾回收后,销毁这个对象,将这个虚引用加入引用队列。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。

    public 

    运行结果:

    是否被回收null
    

    对虚引用的get()操作,总是返回null,因为sf.get()方法的实现如下:

    public 

    5.WeakHashMap类及其实现

    WeakHashMap类在java.util包内,它实现了Map接口,是HashMap的一种实现,它使用弱引用作为内部数据的存储方案。WeakHashMap是弱引用的一种典型应用,它可以作为简单的缓存表解决方案。

    以下两段代码分别使用WeakHashMap和HashMap保存大量的数据:

    @Test
     

    使用-Xmx2M限定堆内存,使用WeakHashMap的代码正常运行结束,而使用HashMap的代码段抛出异常

    java

    由此可见,WeakHashMap会在系统内存紧张时使用弱引用,自动释放掉持有弱引用的内存数据。

    但如果WeakHashMap的key都在系统内持有强引用,那么WeakHashMap就退化为普通的HashMap,因为所有的表项都无法被自动清理。

    对标阿里P6+的Java架构师

    获取更多学习资料,可以加群:473984645或扫描下方二维码

    9e36a6e4a561a1816d164324f802aa7a.png
    展开全文
  • ECMAScript变量包含两种不同数据类型的值:基本类型值和引用类型值。基本类型值是简单的数据段,而引用类型值指那些...在操作对象时,实际上实在操作对象的引用而不是实际的对象,因此,引用类型的值是按引用访问的。
  • 问题:在JDK1.2以前,对象只有“被引用”和“不被引用”两种状态,对于一些“现在没用,但不确定以后是否有用”对象,在这种场景下只能被定义为“不被引用”...(比如系统缓存功能)4种引用类型:JAVA在1.2之后引...

    问题:

    在JDK1.2以前,对象只有“被引用”和“不被引用”两种状态,对于一些“现在没用,但不确定以后是否有用”的对象,在这种场景下只能被定义为“不被引用”,因而会被垃圾回收。

    一旦将来使用到该对象,就会发现这个对象找不到了。

    我们希望描述这样的一类对象:如果内存空间充足,则保持在内存中;如果垃圾回收后的内存依旧很紧张,则释放这些对象占用的内存。(比如系统的缓存功能)

    4种引用类型:

    JAVA在1.2之后引入了4种引用类型:强引用(Strong Reference),软引用(Soft Reference),弱引用(Weak Reference),虚引用(Phantom Reference)。4种引用的强度依次递减。

    强引用: 就是普通的引用,如StringBuffer sb = new StringBuffer(), 只要强引用存在,就不会被垃圾回收;

    软引用:只要内存空间足够,就不会释放软引用的对象;当系统将要发生内存溢出时,才会将软引用的对象列入回收范围,JDK1.2使用SoftReference类实现软引用;

    弱引用:弱引用不会影响对象的生命周期,垃圾回收器对弱引用的对象会当成普通对象处理(只要没有强引用就可以被回收);JDK1.2使用WeakReference类实现弱引用;

    虚引用:虚引用不会影响对象的生命周期,无法通过虚引用获取对象实例;创建虚引用的目的是可以在对象被垃圾收集器回收时收到一个系统通知。JDK1.2使用PhantomReference类实现虚引用。

    展开全文
  • 引用类型

    2019-12-09 22:41:11
    引用基本性质 引用和指针不同一切来源都是...4.引用类型智能在定义时一次确定,不可改变 引用类型参数 在函数调用运行前,生成该实参引用变量,在整个函数体运行过程中,这个引用变量相当于作为实参变量或...

    引用基本性质

    引用和指针的不同的一切来源都是因为 引用类型没有自己的值和地址空间它只是作为另一个变量的别名,在生存期期间两个名字绑定在一起。
    因此产生了三个限制:
    1.引用类型变量不能被引用
    2.引用类型不能组成数组
    3.引用类型不能定义指针
    4.引用类型智能在定义时一次确定,不可改变

    引用类型参数

    在函数调用运行前,生成该实参的引用变量,在整个函数体运行过程中,这个引用变量相当于作为实参的变量或对象的别名,直到函数调用结束返回。
    优点:
    1.可以把函数外的变量以别名形式引入,和指针优点一样
    2.不必再调用时创建于实参变量或者对象对应的值的参数变量。可以节省内存
    3.引用类型比指针安全,不可改变性质

    当做返回值

    当返回类型是引用时,返回的不仅仅是某一个变量或者对象的值,而且返回了它的别名,这个函数的调用也可以被赋值!! 是一种左值表达式
    比如

    int a=3,b=5,c;
    int & maxr(int &m,int &n)
    {
    if(m>n)return m;
    return n;
    }
    //这时候maxr()可以有两个用法
    c=maxr(a,b);//返回的是较大者的值
    maxr(a,b)=10;//左值用法,把变量a,b中较大的值改变为了10,返回的是较大者本身
    
    

    说明函数的调用本身可以作为变量和对象来使用,引用型函数可以作为左值!!!

    展开全文
  • JavaScript基本类型和引用类型的

    千次阅读 2015-11-01 21:35:37
    JS变量可能包含两种不同数据类型的值;基本类型值和引用类型值。基本类型指的是简单的数据段,而引用类型值那些由多个值构成的对象; 在将一个值赋给变量时,解析器必须确定这个值是基本...引用类型的值保存在内存中的

    JS变量可能包含两种不同数据类型的值;基本类型值和引用类型值。基本类型指的是简单的数据段,而引用类型值那些由多个值构成的对象;

    在将一个值赋给变量时,解析器必须确定这个值是基本类型值还是引用类型值。JS有5种基本数据类型:Undefined,

    Null,Boolean,Number和String。这5种基本数据类型是按值访问的。因为可以操作保存在变量中的实际的值。

    引用类型的值保存在内存中的对象。与其他语言不同,JavaScript不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间。在操作对象时,实际上是在操作对象的引用而不是实际的对象,为此,引用类型的值是按引用访问的。引用是js面向对象的基本概念之一。它是一个指向对象实际位置的指针。实际的对象肯定不会是引用。比如字符串永远是字符串,不过多个变量能够指向同一个对象。
    对象可以中有多个原型属性(property)

    动态的属性

    定义基本类型值和引用类型值的方式是类似的:创建一个变量并为该变量赋值。但是,当这个值保存到变量中以后,对不同类型值可以执行的操作则很相同。对于引用类型的值,我们可以为其添加属性和方法每页可以移除改变和删除其属性和方法。

    var person=new Object();
    	person.name="张三";
    	alert(person.name);
    	var name="李四";
    	name.age="13";
    	alert(name.age);
    以上代码创建了一个对象将其保存在了变量person中。然后,我们为该对象添加了一个名字为name的属性,并为这个属性赋了值,当我打印这个属性的时候,是可以得到结果的。这说明如果对象不被销毁或者这个属性不被删除,则这个属性将一直存在。但是我们不能给基本数据类型添加属性。

    复制变量值:

    除了保持的方式不同之外,在从一个变量向另一个变量复制基本类型和引用类型的值时,也存在不同。如果从一个变量向另一个变量复制基本类型的值,会在变量对象上创建一个新值,然后把该值复制到位新变量分配的位置上;

    var num1=5;
    	var num2=num1;
    	num1=3;
    	alert(num2);

    在此num1种保存的值是5.当使用num1的值来初始化num2时,num2中也保存了值5。但num2中的5与num1中的5是完全独立的。该值只是num1中5的一个副本。此后,这两个变量可以参与任何操作互不影响。我觉得这一点和其他高级语言很相似例如java。

    当从一个变量向另一个变量复制引用类型的值时,同样也会将存储在变量对象中的值复制一份到为新变量分配的空间中。不同的是们这个值的副本实际上是一个指针,而这个指针指向存储在堆中的一个对象,复制操作结束后,两个变量实际上将引用同一个对象。因此,改变其中一个变量,就会影响到另一个变量。这个跟引用类型的存储位置有关。

    var obj1=new Object();
    	var obj2=obj1;
    	obj1.name="张三";
    	alert(obj2.name);
    打印出来的是张三,这是因为obj1和obj2是两个引用,这两个引用指向的值都是Object();我们操作值的时候是通过引用的,当我们的对象发生改变的,其引用的值也发生了改变;

    传递参数:

      JS中所有函数的参数都是按值传递的。Java里面的参数有人认为是按值传递的,有人认为是按参数传递的,不过我写过一遍博客,里面专门讨论过这个,Java其实是按值传递的。也就是说,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。基本类型值的传递如同基本类型变量的复制一样,而引用变量传递也和复制一样。

    在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量(即命名参数,用JS的概念来说,就是arguments数组中的一个元素)。在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部。

    function add(num){
    			num+=10;
    			return num;
    		}
    		var count=20;
    		var resule=add(count);
    		alert(resule);
    		alert(count);

    参数count和参数num互不影响,只是num复制了count的值而已;

    	function setName(obj){
    			obj.name="张三";
    		}
    		var person=new Object();
    		setName(person);alert(person.name);
    以上代码创建了一个对象,并将其值保存在person引用中,然后调用setName函数,把值传递给obj,obj这个时候引用的对象和person引用的对象是同一个对象,所以里面修改了属性值,外面会有显示。有很多程序员错误的认为,在局部作用域中修改的对象会在全局作用域中反映出来,就说明是按引用传递的,这个说法不现实;

    function setName(obj){
    			obj.name="张三";
    			obj=new Object();
    			obj.name="李四";
    		}
    		var person=new Object();
    		setName(person);alert(person.name);
    如果是按引用传递的话,我们为这个引用重新创建了一个对象,并赋值,但是最后的结果还是张三,证明了是按值传递的;








    展开全文
  • 值类型是现金,引用类型是存折 值类型保存在栈上,保存的是对应的数值(由于栈的特点是需要提前确定分配的空间大小,适合保存...引用类型:除了8种基本数据类型的其他类型,如:Interger Double Float String 数组 ...
  • 基本类型和引用类型的值 ECMAScript变量可能包含两种不同数据类型的值:基本类型值和引用类型值。基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象。 在将一个赋值给变量时,解析器必须确定...
  • 作者: 她不美却常驻我心 微信公众号:老王前端分享 JS基本数据类型和引用数据...在将一个值赋给变量时,解析器必须确定这个值是基本类型值还是引用类型值,因为两种数据类型不仅存放位置不同,访问方式也不同。
  • 4.1 基本类型和引用类型的值ECMAScript 变量可能包含两种不同数据类型的值:基本类型值和引用类型值。基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象。在将一个值赋给变量时,解析器必须...
  • 基本数据类型指的是简单的数据段,而引用类型的值指那些可能由多个值构成的对象。 将一个值赋值个变量时,解析器必须确定这个值是基本数据类型还是引用数据类型,基本数据类型是按值访问的,因为可以操作保存在变量...
  • 关于引用类型的判断相等性,我的认知:引用类型(string除外)在没重写的情况下,Equals方法与ReferenceEquals方法和==的行为是相同的,都是两个对象指向同一个 引用的时候才返回true。 一开始我并不确定是否只有...
  • 值类型和引用类型的区别 值类型 引用类型 直接包含值,变量引用的位置就是值在内存中实际存储的位置。 存储是对一个内存位置的引用(内存地址),要去那个位置才能找到真正的数据 ...
  • Java的引用类型

    2021-04-16 22:15:45
    1.引用其实是一种变量赋值,引用之间可以通过引用构成一条引用链。...弱引用:如果弱引用指向对象只存在弱引用,下一次YGC时候回收,由于YGC时间不确定,弱引用回收被回收,也不确定。 虚引用:定义完成后,无法通
  • 不过由于垃圾回收器运行时间不确定,可被垃圾回收对象实际被回收时间是不确定的。对于一个对象来说,只要有引用的存在,它就会一直存在于内存中。如果这样对象越来越多,超出了JVM中内存总数,JVM就会抛出...
  • 一个对象实际类型确定的,但是可以指向对象的引用的类型有很多。 多态存在条件 有继承条件 子类重写父类方法 父类引用指向子类对象 注意:多态是方法多态,属性没有多态 多态是继封装,继承之后,面向...
  • ECMAScript 变量可能包含两种不同数据类型的值:基本类型值和引用类型值。 基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象。 在将一个值赋给变量时,解析器必须确定这个值是基本类型值...
  • 每篇文章纯属个人经验观点,如有错误疏漏欢迎指正  ECMAScript变量可能包含两种不同数据类型的值:基本类型值和引用类型值。基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象。  在将一...
  • 原标题:JavaScript基本数据类型及值类型和引用类型 在Java...由于Java采用弱类型的形式,因而一个数据的变量或常量不必首先作声明,而是在使用或赋值时确定其数据的类型的。当然也可以先声明该数据的类型,它是通过...
  • 基本类型和引用类型的值 一、综述  ECMAScript变量可能包含两种不同的数据类型的值:基本类型值和引用类型值。  基本类型值是指简单的数据段,而引用类型值指那些可能由多个值构成的对象。  在给一个变量赋值...
  • 在将一个值赋给变量时,解析器必须确定这个值是基本数据类型还是引用类型,有5中基本数据类型:undefined,null,boolean,number和string 。这5中基本数据类型是按值访问,因为可以操作保存在变量中实际值。 ...
  • JavaScript变量可能包含两种不同类型的值:基本类型值和引用类型值。基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象。 在将一个值赋给变量时,解析器必须确定这个值是基本类型值还是...
  • null问题:JAVA类型有基础变量类型、引用类型。这里写图片描述(1)对基础变量类型,如果未经初始化JAVA会自动开辟空间并赋值。...(因为NULL指是不确定对象,所以适用于引用类型,不适用于基础变量类型。)再说Nu...
  • 值类型引用类型

    2016-12-21 13:25:00
    存取是无序栈是一种后进先出数据结构...方法中变量是要确定内存大小:引用类型 2、 对象创建方式 MyClass m = new MyClass(); -> new创建了对象(newobj) -> 构造方法只是做了初始化 1、首先ne...
  • 基本类型和引用类型

    2018-04-11 15:15:06
    基本类型和引用类型。基本类型值指是简单数据段,而引用类型值指就是那些可能有多个值构成对象。 在将一个值赋给变量时,解析器必须确定这个值是基本数据类型还是引用数据类型。 基本数据类型包括 ...
  • 基本类型:指的是简单的数据段,Undefined、Null、Boolean、Number 和 String。他们是按照值进行分配的,存放在栈(stack)内存中的简单数据段...引用类型的值是保存在内存中的对象,即存放在堆(heap)内存中的对象。Ja...
  • ECMAScript变量可能包含两种不同数据类型的值:基本类型值和引用类型值。...引用类型的值是保存在内存中的对象。与其他语言不同,JavaScript不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间
  • 栈区:存放局部变量,对象声明的引用等。堆区:存放new关键字创建类(包含成员变量)和数组等。堆与栈优缺点栈优点:栈数据可以共享,存取速度比堆快。 缺点是:存在栈中数据大小与生命周期是确定的。堆优点:...
  • 栈区:存放局部变量,对象声明的引用等。堆区:存放new关键字创建类(包含成员变量)和数组等。堆与栈优缺点栈优点:栈数据可以共享,存取速度比堆快。 缺点是:存在栈中数据大小与生命周期是确定的。堆优点:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,670
精华内容 2,268
关键字:

引用类型的确定