2021-06-28~2021-07-02总结(Java基础总结二:Java引用数据类型)

工作总结

工作内容

本周的工作内容主要是对接联通的话务接口,以及接口数据的落地。本周接着上周的内容(上周有关数据类型的连接)来谈一谈Java数据类型中的引用数据类型。

技术探索

1.浅谈Java引用数据类型

Java中引用数据类型默认的变量为null,引用数据类型 变量名=new 引用数据类型。
例如:

People people = new People ();
people.setName("张三");
people.setAge("22");

这时候内存存储如图:
在这里插入图片描述

1.1引用数据类型分类
  1. 类 Object object= new Object ();
  2. 接口 接口不能直接new进行实例化,可以引用实现接口的类。(详细的接口讲解会在之后上传链接
  3. 数组 int[] a=new int[10];(有关数组的简介点击连接
1.2 引用分类
  1. 强引用(StrongReference)
    是指在程序代码之中普遍存在的,类似 Object obj = new Object() 这类的引用,只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。(空间不回收
  2. 软引用(SoftReference)
    是指一些还有用,但并非必需的对象。对于软引用关联着的对象,在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围之中并进行第二次回收。如果这次回收还是没有足够的内存,才会抛出内存溢出异常。在JDK 1.2之后,提供了 SoftReference 类来实现软引用。(空间不足就回收
  3. 弱引用(WeakReference)
    是指非必需对象的,但是它的强度比软引用更弱一些,被弱引用关联的对象只能生存到下一次垃圾收集发生之前。当垃圾收集器工作时,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。 在java垃圾回收期扫描它管辖的范围之内时,发现弱引用,就进行回收。在JDK 1.2之后,提供了 WeakReference 类来实现弱引用。(发现就回收
  4. 虚引用(PhantomReference)
    是指最弱的一种引用关系。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。 为一个对象设置虚引用关联的唯一目的就是希望能在这个对象被收集器回收时收到一个系统通知。在JDK 1.2之后,提供了 PhantomReference 类来实现虚引用。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。(任何时候回收
2.浅谈String、StringBuffer、StringBuilder
  • String:字符串常量,每次对String的操作都会在“常量池”中生成新的String对象(类不可变
  • StringBuffer:字符串变量,任何对它指向的字符串的操作都不会产生新的对象。每个StringBuffer对象都有一定的缓冲区容量,字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,自动扩容。(类可变、有同步锁
  • StringBuilder:字符串变量,功能与StringBuffer相同,相比少了同步锁,执行速度更快。 (类可变、无同步锁
2.1 区别
  • String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象
  • StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String
  • StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer。(所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。
2.2 效率比较

StringBulider > StringBuffer > String
String 类型和 StringBuffer、 StringBuild类型的主要性能区别其实在于 String 是不可变的对象(final), 因此在每次对 String 类型进行改变的时候其实都等同于在堆中生成了一个新的 String 对象,然后将指针指向新的 String 对象,这样不仅效率低下,而且大量浪费有限的内存空间,所以经常改变内容的字符串最好不要用 String 。因为每次生成对象都会对系统性能产生影响,特别是当内存中的无引用对象过多了以后, JVM 的 GC 开始工作,那速度是一定会相当慢的。另外当GC清理速度跟不上new String的速度时,还会导致内存溢出Error,会直接kill掉主程序!
例如:下图所示简单的两行代码,程序就会在堆的常量池中新增3个字符串的常量,这样就会影响程序执行的效率以及不必要的内容浪费。
在这里插入图片描述
以上有关第二点的内容是阅读了,该篇文章的总结。

总结

1、学习基础知识点的时候,需多注重有关底层以及实现方式的原理,这样才能够更加理解其存在的含义以及在何种场景中使用。

戒骄戒躁--zwx
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值