精华内容
下载资源
问答
  • Java引用类型有哪些

    万次阅读 2019-07-05 16:48:32
    其中,引用数据类型在存储堆中对需要引用的对象进行引用,引用是Java面向对象的一个特点,在Java入门中,我们会接触到四种Java的引用类型,接下来就说说这四种Java引用类型有哪些吧: 1、Java中有哪几种引用?...

     

    动力节点Java培训最新上线Java实验班,等你来测试自己适不适合学习Java编程哦!

     

    Java类型一般有两种,即基本数据类型与引用数据类型。其中,引用数据类型在存储堆中对需要引用的对象进行引用,引用是Java面向对象的一个特点,在Java入门中,我们会接触到四种Java的引用类型,接下来就说说这四种Java引用类型有哪些吧:

     

     

    1、Java中有哪几种引用?它们的含义和区别是什么?

     

      从JDK1.2开始,Java中的引用类型分为四种,分别是:

     

    ①强引用(StrongReference)

     

    ②软引用(SoftRefernce)

     

    ③弱引用(WeakReference)

     

    ④虚引用(PhantomReference)

     

      强引用-StrongReference

     

      这种引用是平时开发中最常用的,例如Stringstrong=newString("StrongReference"),当一个实例对象具有强引用时,垃圾回收器不会回收该对象,当内存不足时,宁愿抛出OutOfMemeryError异常也不会通过回收强引用的对象,因为JVM认为强引用的对象是用户正在使用的对象,它无法分辨出到底该回收哪个,强行回收有可能导致系统严重错误。

     

      软引用-SoftReference

     

      如果一个对象只有软引用,那么只有当内存不足时,JVM才会去回收该对象,其他情况不会回收。软引用可以结合ReferenceQueue来使用,当由于系统内存不足,导致软引用的对象被回收了,JVM会把这个软引用加入到与之相关联的ReferenceQueue中。

     

    ReferenceQueuereferenceQueue=newReferenceQueue();

     

    SoftReference<Book>softReference=newSoftReference<>(newBook(),referenceQueue);

     

    Bookbook=softReference.get();

     

    Referencereference=referenceQueue.poll();

     

      当系统内存不足时,触发gc,这个Book就会被回收,reference将不为null。

     

      弱引用-WeakReference

     

      只有弱引用的对象,当JVM触发gc时,就会回收该对象。与软引用不同的是,不管是否内存不足,弱引用都会被回收。弱引用可以结合ReferenceQueue来使用,当由于系统触发gc,导致软引用的对象被回收了,JVM会把这个弱引用加入到与之相关联的ReferenceQueue中,不过由于垃圾收集器线程的优先级很低,所以弱引用不一定会被很快回收。下面通过一个主动触发gc的例子来验证此结论。

     

    ReferenceQueuereferenceQueue=newReferenceQueue();

     

    WeakReference<Book>weakReference=newWeakReference(newBook(),referenceQueue);

     

    Bookbook=softReference.get();

     

    System.gc();

     

    //Runtime.getRuntime().gc();

     

    Referencereference=referenceQueue.poll();

     

      当然这不是每次都能复现,因为我们调用System.gc()只是告诉JVM该回收垃圾了,但是它什么时候做还是不一定的,但就我测试来看,只要多写几次System.gc(),复现的概率还是很高的。

     

      虚引用-PhantomReference

     

      如果一个对象只有虚引用在引用它,垃圾回收器是可以在任意时候对其进行回收的,虚引用主要用来跟踪对象被垃圾回收器回收的活动,当被回收时,JVM会把这个弱引用加入到与之相关联的ReferenceQueue中。与软引用和弱引用不同的是,虚引用必须有一个与之关联的ReferenceQueue,通过phantomReference.get()得到的值为null,试想一下,如果没有ReferenceQueue与之关联还有什么存在的价值呢?

     

    PhantomReference<Book>phantomReference=newPhantomReference<>(newBook(),referenceQueue);

     

    Bookbook=phantomReference.get();//此值为null

     

    Referencereference=referenceQueue.poll();

     

     

    展开全文
  • Java引用数据类型String详解

    万次阅读 2020-07-02 23:54:44
    Java引用数据类型(String)引用数据类型概述引用数据类型与基本数据类型的差别(举例说明) 引用数据类型概述 说到引用数据类型,那么何为引用数据类型? 引用类型,都可以用null值作为值,也就是说可以在初始化的...

    引用数据类型概述

    说到引用数据类型,那么何为引用数据类型?
    引用类型,都可以用null值作为值,也就是说可以在初始化的时候赋值为null,String是引用类型,也就是说可以使用null作为值。
    在这里插入图片描述

    引用数据类型与基本数据类型的差别(举例说明)

    使用基本数据类型:
    int i1 = 1
    int i2 = 1
    这种是会在内存中存储两个1的值

    但是,使用引用类型就不会!
    String s = “hello”
    String s1 = “hello”
    这种,是不会在内存中存在两个"hello"的,只存在一个"hello"。

    假设"hello"的内存地址为xxxxxx,声明s变量时给s赋值"hello"实际上让s变量引用"hello"的内存地址xxxxxx;

    当我们再次声明变量s1也赋值为"hello"的时候实际上也是直接把已经存在的"hello"的内存地址给了s1引用

    此乃引用类型和基本数据类型的区别。

    记录自己最近学习到的东西,做一个总结,希望大家喜欢,一起加油!

    展开全文
  • java 引用传递三种类型

    万次阅读 2018-09-29 20:52:17
    我这里使用了mldn视频里...对于三种引用传递的理解: 第一种和第三种都好理解:其实就是c语言那样传递的是地址,当然能够修改属性值,对于第二种其实就是因为String类比较特殊,在第二个例子中fun()函数str2="m...

    我这里使用了mldn视频里的例子,只用于学习交流。
    第一种引用传递
    结果:调用前:50
    调用后:1000
    分析:
    在这里插入图片描述
    理解:好理解
    第二种传递方式
    先看例子
    代码
    运行结果:
    在这里插入图片描述
    分析图片:
    在这里插入图片描述
    第三种传递方式
    在这里插入图片描述
    结果:
    在这里插入图片描述
    分析:
    在这里插入图片描述
    对于三种引用传递的理解:
    第一种和第三种都好理解:其实就是c语言那样传递的是地址,当然能够修改属性值,对于第二种其实就是因为String类比较特殊,在第二个例子中fun()函数str2="mldn"其实mldn是个匿名对象!!!这个等式其实就是将str2的引用的地址值改变了,也即使str1的引用地址指向了mldn这个在堆内存的这个对象。
    感谢mldn的例子!!!!!

    展开全文
  • Java引用类型分类以及详解

    千次阅读 2018-06-11 00:10:46
    Java引用类型分类以及详解 - Java引用类型概述 在JVM之中再好的算法,也敌不过一个好烂的程序员。一个程序要想写好有两点:按照开发标准进行、请写有用代码。 而对于垃圾的产生与回收的处理之中,要想进行更好...

    Java引用类型分类以及详解

    - Java引用类型概述

    在JVM之中再好的算法,也敌不过一个好烂的程序员。一个程序要想写好有两点:按照开发标准进行、请写有用代码。
    而对于垃圾的产生与回收的处理之中,要想进行更好的控制,就必须清楚的掌握Java中的四种引用方式。
    强引用(Strong Reference):即使进行了多次的GC回收,即使JVM真的已经不够用了,即使JVM最终不得已抛出了OOM错误,那么该引用继续抢占;
    软引用(Soft Reference):当内存空间不足时,可以回收此内存空间。如果充足则不回收,可以用其完成缓存的一些处理操作开发。
    缓存:保证数据更快的操作(读取)。是不重要的数据。可以作为牺牲来释放空间。
    弱引用(Weak Reference):不管内存是否紧张,只要一出现GC处理,则立即回收。
    幽灵引用(Phantom Reference):和没有引用是一样的。
    比如HashMap根据key取得值,设置key值为null和不设置key值的效果是一样的。

    • 强引用

    强引用是Java默认支持的一种操作模式,也就是说在引用的处理其间,即使出现有GC,即使内存不足,该引用的数据也不会被回收。

    范例:观察强引用:

    这里写图片描述
    这个流程就叫做强引用。在之前所编写的所有操作都属于强引用,而强引用只有全部的对象都断开连接之后,才可能称为垃圾空间,才有可能被回收。而即使有一个对象引用此空间,那么该对象也不会被回收。
    在多线程状态下,即使产生多个引用对象,空间也不会被回收。

    这里写图片描述
    每个线程都会出现OOM
    强引用并不是造成OOM的关键性因素,正常来讲,你每一个用户(线程)操作完成后,该对象都可以被很容易的进行回收,不必强制性进行回收。

    • 软引用
      软引用指的是当内存不足的时候才进行GC的空间释放,但是如果要想使用软引用必须单独使用特殊的处理类:
      java.lang.ref.SoftReference,该类的定义如下:

    这里写图片描述
    除了强引用,其它引用必须借助特殊类来完成。

    这里写图片描述
    软引用的类继承了Reference的引用父类。
    这个类下有三个引用:
    这里写图片描述

    在软引用之中如果想要进行引用的处理操作,则可以使用如下的方法完成:

    1.构造方法:public SoftReference(T reference);
    2.取得引用的数据:public T get();

    范例:观察软引用:
    这里写图片描述
    软引用与强引用相比,最大的特点在于:软引用中保存的内容如果在内存富裕的时候会继续保留,内存不足会作为第一批的丢弃者进行垃圾空间的释放。
    在开发中,可以利用软引用可以实现高速缓存组件。
    缓存处理好了,你的程序写的才能达到高性能的第一步

    • 弱引用
      弱引用最大的特点就是一旦发生了GC的处理操作,则保存的引用内容将立即释放。弱引用使用“WeakReference”类来完成。
      java.lang.ref.WeakReference

    范例:弱引用处理
    这里写图片描述

    因为不执行GC,所以弱引用的对象并没有被释放。输出依然有值。
    这里写图片描述
    输出为null;
    一旦执行了GC,那么就需要进行内存空间的释放,在类集里面有一个与弱引用功能相似的Map集合WeakHashMap,它属于弱引用的一个实现。

    这里写图片描述

    这里写图片描述

    whm中存放的都是匿名对象。
    个人觉得使用WeakHashMap最大的好处是可以用它保存一些共享数据,这些共享数据如果长时间不使用,可以将其清空。

    • 引用队列
      在之前使用软引用和弱引用的时候都会发现有这样一个构造方法:
      SoftReference:
      这里写图片描述
      WeakReference:
      这里写图片描述
      java.lang.ref包中一共五各类:一个父类,三个子类,另外一个就是引用队列。

    引用队列:待被砍掉的对象的集合点
    如果要清楚引用队列,则首先必须知道对象的引用的强度。如果说按照现在的理解来讲:强引用的强度大于软引用,软引用大于弱引用。

    这里写图片描述
    通过以上的图形分析可以发现,如果要想找到“对象5”,那么一共有两条对象的可及性的路径:
    这里写图片描述

    在以上给出的引用的路径上,1到5是最强引用,但是由于其本身存在一个软引用,所以对象5对于整个的程序就属于软可及对象。
    在java里面,如果某一个对象不属于强引用,那么就需要有一个专门的机制来清除那些不具有存在价值的对象(强对象才有价值)
    所以这个时候如果保存有太多的无价值对象就会造成内存泄漏,那么为专门提供有一个引用队列,当某一个对象被垃圾回收后,则该对象会被保存到引用队列之中。

    范例:观察引用队列的处理操作;
    这里写图片描述
    在发生GC内存清理之前,此时引用队列中为null;
    这里写图片描述
    此处必须断开强引用
    执行完GC之后引用队列有内容。

    引用队列里面保存的就是一个要准备被回收的对象的信息。

    • 幽灵引用(虚引用)
      幽灵引用指的是什么都不保存,但是又看起来像是保存了一样。
      这个的处理类java.lang.ref.PhantomReference。

    范例:观察幽灵引用:
    幽灵引用直接就把要保存的内容保存在了引用队列之中
    这里写图片描述

    需要发生引用但是又不需要引用占用空间的时候。—采用幽灵引用。

    展开全文
  • Java引用类型

    千次阅读 2016-03-16 19:12:55
    博主最近在整理Java集合框架时,在整理到WeakHashMap的时候,觉得有必要先阐述一下Java引用类型,故此先整理的这篇文章,希望各位多提提意见。   闲话不多说,直接进入主题。Java中提供了4个级别的引用:强引用...
  • 2)当使用引用数据类型作为方法的形参时,若在方法体中 修改形参指向的数据内容,则会对实参变量的数值产生影响,因为形参变量和实参变量共享同一块堆区; 3)当使用引用数据类型作为方法的形参时,若在方法体中 ...
  • java引用与指针

    千次阅读 2018-05-06 17:45:30
    没有指针的java语言 java语言中使用了引用代替了指针,引用实质就是指针,但它是受控的、安全的。我们知道,一个引用,比如说person p 等于new person,实际上就是p这个引用指向了这个对象实体,所以本质上就是指针...
  • Java引用数据类型(类)+案例

    千次阅读 2019-03-08 19:54:09
    只是自定义类型并非Java为我们预先提供好的类型,而是我们自己定义的一种引用数据类型用来描述一个事物。 类的定义格式 创建java文件,与类名相同 public class 类名{ 数据类型 属性名称1; 数据类型 属性名称2; ...
  • public class StandardAction extends ActionSupport implements SessionAware, ApplicationAware, RequestAware { ``` 在import java.util.Map时可以指定个版本号,好比说这样: ``` import java.util.Map 2.5.18;...
  • java 引用本地JAR包

    千次阅读 2019-06-07 15:48:25
    maven 项目引用本地JAR包 写好路径和JAR包, <dependency> <groupId>xx.xx.bis</groupId> <artifactId>xx-xx-dubbo</artifactId> <version>3.5.8...
  • java引用和指针的区别

    千次阅读 2018-05-15 17:50:13
    Java引用和C++的指针的区别Java引用和C++的指针都是指向一块内存地址的,通过引用或指针来完成对内存数据的操作,就好像风筝的线轴一样,通过线轴总是能够找到风筝,但是它们在实现,原理作用等方面却有区别。...
  • Java引用计数与实现

    千次阅读 2018-08-04 12:41:14
    引用计数(Reference Counting)可作为内存管理办法,也是老代jvm垃圾回收策略之一,原理简单但是仍有广泛的引用,如OkHttp,netty等。 回收原理 对象在创建实例的时候会在堆内存申请内存时给对象引用记为1,当有其他...
  • 什么是Java的对象引用Java中都有哪些类型的对象引用Java中提供的Java对象引用主要有什么目的? 通过本文,你就能很清楚得了解Java的对象引用
  • java引用数据类型-数组

    千次阅读 2016-10-23 14:45:52
    数组的定义 数组用于将相同类型的数据存储在连续的存储单元中;...在java中声明数组有如下方式(以整型数组为例): //仅声明数组的引用,但没有分配内存空间 int[] arr; //声明数组的同时,根据指定长度分配内存,但
  • 写在前面:对Java有一定认识的人都知道,Java有垃圾回收机制,尽管如此,Java同样也会出现内存泄露,本篇系列主要介绍Java的内存回收机制,以及介绍开发过程中内存管理的小技巧。本文参考《疯狂Java-突破程序员基本...
  • JAVA中的引用四种引用类型

    千次阅读 2020-08-30 10:09:38
    关于值类型和引用类型的话题,C++、JAVA、python、go、C#等等高级语言都有相关的概念,只要理解了其底层工作原理,可以说即使是不同的语言,在面试学习工作实践中都可以信手拈来(不要太纠集语言),当然此处我选择了...
  • JAVA 引用类型数组的初始化

    千次阅读 2016-06-30 23:24:35
    引用类型数组的数组元素是 引用. 我们之前学习过的基本类型数组, 它里面的数组元素存放的是具体的值. 可以当作我们现实生活中的买房, 基本类型数组呢, 就像是你直接找到了房主. 而引用类型数组就像是你没有...
  • Java 项目无法引用javax.swing.JOptionPane JAVA引用JOptionPane类报错 解决方案 报错通常以这种方式报错 原因可能是因为eclipse的环境配置过高或过低导致的不能调用java中的一些包 下面我的解决方法如下 第一...
  • java引用

    千次阅读 2020-05-07 10:50:02
    引用: String str = “abc”; list.add(str); 软引用: 如果弱引用对象回收完之后,内存还是报警,继续回收软引用对象 SoftReference<A> sr = new SoftReference<A>(a); 弱引用: ...
  • java引用类型的强制类型转换

    千次阅读 2016-10-12 13:59:13
    1.向上造型:即父类引用指向子类对象,可以自动转换。如: Father father = new Son(); 这里的引用father指向内存中对象实质还是Son类型,不过对象的功能被临时削弱为father。 2.向下转型:即强制类型转换。 被...
  • Java引用外部字体即自定义字体文件

    万次阅读 热门讨论 2017-07-20 10:40:54
    有时候我们在程序中,会使用到Java字体,但不是所有的字体系统中都会有,我们就可能会使用外部自定义字体,这样在程序迁移部署中就会少些工作,最近在一个项目中使用到了自定义字体文件,研究清楚了如何是使用了。...
  • JAVA 引用和C语言指针的区别

    千次阅读 2015-01-14 10:04:48
    JAVA中的引用和C中的指针,最好不要混在一起,更不要认为是一回事,只不过他们的作用有些相似,学习者总习惯将它们对比。但在我们写JAVA程序的时候最好忘记C的指针 ,写C程序的时候,也不要老惦记着JAVA引用。只要...
  • java引用微信支付的p12证书文件

    千次阅读 2019-04-01 20:09:00
    最近对接微信支付的退款功能,其中涉及到引用证书文件。 1. 绝对路径: // windows: public static String PATH1 = "E:\\project_ceshi\\apiclient_cert.p12"; // linux public static String PATH2 = "/...
  • Java引用对象在堆、栈内存中的变化

    千次阅读 2018-09-04 21:18:20
    最近又重新开始学习Java基础,再次学习也对引用、对象使用时内存变化有了进一步的了解。 这里先对Java虚拟机中堆栈功能简单总结; 1、对象主要存放在堆内存中;方法和属性主要存放在栈内存中。 2、栈是运行时单位...
  • 文章目录JAVA虚拟机共享数据区方法区java堆线程私有程序计数器PC虚拟机栈本地方法栈GC垃圾回收器引用计数算法可达性分析算法回收和引用类型的关系强引用 StrongReference软引用(SoftReference)弱引用(WeakReference)...
  • 1.在eclipse上新建一个java project2.导入jar包3.将dll动态库放到项目bin目录下4.java build path配置5.在项目根目录下引入加解密文件6.创建测试类测试7.结束
  • Java四种引用类型

    万次阅读 多人点赞 2019-05-12 19:01:34
    文章目录引用类型简介对象可达性判断GC Roots对象可达性判断可达性状态类型可达性判断规则状态转换Reference类定义状态变化四...Java开发者肯定都很熟悉java中的4种引用类型,它们从强到弱分别是: 引用类型 ...
  • 吃人的那些 Java 名词:对象、引用、堆、栈

    万次阅读 多人点赞 2019-09-05 15:57:09
    作为一个有着 8 年 Java 编程经验的 IT 老兵,说起来很惭愧,我被 Java 当中的四五个名词一直困扰着:**对象、引用、堆、栈、堆栈**(栈可同堆栈,因此是四个名词,也是五个名词)。每次我看到这几个名词,都隐隐...
  • Java引用变量调用方法时的

    千次阅读 2017-06-16 09:10:15
    Java引用变量有两个类型,分为:编译时类型和运行时类型 编译时类型:即声明引用变量时的类型 运行时类型:即生成的对象的类型 例如:Animal a=new Dog();其中编译时类型为Animal,运行时类型为Dog. 当相同...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,425,825
精华内容 570,330
关键字:

java引用

java 订阅