JAVA基本变量包装类和缓存池

el/2024/5/23 1:27:29

一、包装类

Java 面向对象编程,一切都是对象,但是有例外: 8 个基本数据类型不是对象,因此在很多时候非常不方便。 为此, Java提供为 8 个基本类型提供了对应的包装类:

  • byte ------- Byte
  • short ------ Short
  • int ---------- Integer
  • long -------- Long
  • char -------- Character
  • float -------- Float
  • double ----- Double
  • boolean----- Boolean

包装类如何使用? JDK1.5 , 新增了 2 个功能:自动装箱、自动拆箱。

		Integer x = 2;  //装箱 调用了 Integer.valueOf(2)int y = x;      //拆箱 调用了 x.intValue()

自动装箱 ----- 基本类型的值 → 包装类的实例

自动拆箱 ----- 基本类型的值 ← 包装类的实例

二、缓存池

new Integer(123) 与 Integer.valueOf(123) 的区别在于:

  • new Integer(123) 每次会新建一个对象
  • Integer.valueOf(123) 会优先使用缓存池中的对象,引用的是同一个对象
		Integer x = new Integer(123);Integer y = new Integer(123);System.out.println(x == y);  //false --不同对象Integer z = Integer.valueOf(123);Integer k = Integer.valueOf(123);System.out.println(z == k);  //true --相同对象

结果为:
在这里插入图片描述
由此可知 .valueOf() 方法返回了缓存池中的对象,源码如下:

	public static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];  //直接返回缓存池中的对象return new Integer(i);}

Integer 的缓存池默认大小为 -128 ~ 127,源码如下

   private static class IntegerCache {static final int low = -128; //下界static final int high;static final Integer cache[]; //缓存池数组static {// high value may be configured by propertyint h = 127; //默认上界String integerCacheHighPropValue =sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"); //系统属性修改上界if (integerCacheHighPropValue != null) {try {int i = parseInt(integerCacheHighPropValue);i = Math.max(i, 127); //获取上界// Maximum array size is Integer.MAX_VALUEh = Math.min(i, Integer.MAX_VALUE - (-low) -1);} catch( NumberFormatException nfe) {// If the property cannot be parsed into an int, ignore it.}}high = h;cache = new Integer[(high - low) + 1];int j = low;for(int k = 0; k < cache.length; k++)cache[k] = new Integer(j++);// range [-128, 127] must be interned (JLS7 5.1.7)assert IntegerCache.high >= 127;}private IntegerCache() {}}

在Java 8 中基本类型对应的缓冲池如下:

  • Int,short -128 ~ 127
  • all byte
  • char \u0000 to \u007F Unicode编码对照

在使用这些基本类型对应的包装类型时,如果该数值范围在缓存池范围内,就可以直接使用缓冲池中的对象

在 JDK1.8 所有的数值类缓存池中,Integer的缓存池 IntegerCache 很特殊,他的下界是 -128,上界默认是 127,但是这个上界是可调的,在启动 JVM 的时候,通过 -XX:AutoBoxCacheMax = 来指定这个缓存池的大小,该选项在 JVM 初始化的时候会设定一个名为 java.lang.IntegerCache.high 系统属性,然后 IntegerCache 初始化的时候就会读取该系统属性来决定上界。


http://www.ngui.cc/el/5277794.html

相关文章

阿里云OSS附件服务器:多线程异步批量操作(批量上传实例)

多线程批量上传OSS 一、OSS简介 阿里云存储服务&#xff08;OpenStorageService&#xff0c;简称OSS&#xff09;&#xff0c;是阿里云对外提供的海量&#xff0c;安全&#xff0c;低成本&#xff0c;高可靠的云存储服务。 大家首先开通OSS&#xff0c;并且创建好Bucket&#…

Java互斥同步 关于Synchronized关键字与ReentrantLock的使用和比较

synchronized关键字的四种使用方法 1. 同步一个代码块 public void func1(){ // 同步代码块synchronized (this){//...}}它只作用于同一个对象&#xff0c;如果调用两个对象上的同步代码块不会同步 对于以下线程&#xff0c;由于调用同一个对象&#xff0c;所以实…

比 Json 还牛的 Protobuf 的编码须知(.proto文件该如何编写)

编码规范&#xff1a; 定义一个 message 消息类型&#xff1a; 字段编号尽量使用 16 &#xff08;虽然前15个 bytes 浪费了&#xff0c;但好处多多&#xff09; syntax "proto3";message SearchRequest {string query 1;int32 page_number 2;int32 result_per_…

Springboot 的三种注入方式对比

首先来看看 Spring 中的实例该如何注入&#xff0c;总结起来&#xff0c;无非三种&#xff1a; 属性注入set 方法注入构造方法注入 我们分别来看下。 1、属性注入 属性注入是大家最为常见也是使用最多的一种注入方式了&#xff0c;代码如下&#xff1a; Service public cl…

SELECT 语句的执行过程

SELECT 语句的执行过程为&#xff1a;连接、查询缓存、词法分析&#xff0c;语法分析&#xff0c;语义分析&#xff0c;构造执行树&#xff0c;生成执行计划、执行器执行计划&#xff0c;下面开始梳理一次完整的查询流程&#xff1a; 连接器 连接器负责与客户端建立连接,获取…

Unity3D 旧版Animation. Time.timeScale = 0暂停,播放动画.

需要用到Time.timeScale 0暂停&#xff0c;但个别地方需要播放动画&#xff0c;在Time.timeScale 0前&#xff0c;开启下面的"播放动画"协程即可. IEnumerator PlayAnimation(Animation animation, string clipName, bool useTimeScale, System.Action onComplete…

C# 计算文件、字符串的MD5值

/// <summary> /// 计算字符串的MD5值 /// </summary> public static string md5(string source) {MD5CryptoServiceProvider md5 new MD5CryptoServiceProvider();byte[] data System.Text.Encoding.UTF8.GetBytes(source);byte[] md5Data md5.ComputeHash(dat…

Unity ParticleSystem 控制粒子移动到一个点,沿路径移动.

一、粒子移动到一个点. 方案1&#xff1a;粒子系统模拟空间为Local. private Transform m_Transform;private ParticleSystem m_ParticleSystem;private ParticleSystem.Particle[] m_particles;public Transform target_Trans; //目标位置.(手动拖拽)private Vector3 pos; …

Unity 贝塞尔曲线(Beizer curve)的原理与运用

前言&#xff1a;现在使用各种搜索引擎 搜索贝塞尔曲线&#xff0c;都会有很多介绍。这里自己写一篇博客&#xff0c;只是记录一下自己的学习过程与运用方法&#xff0c;方便后续回忆。 贝塞尔曲线原理 1、一阶贝塞尔曲线&#xff1a; 一阶贝塞尔曲线&#xff0c;其实就是找一…

IEnumerator、IEnumerable的理解

请直接看以下代码&#xff0c;用foreach来了解Ienumerator和IEnumerable的原理。 class Program{static void Main(string[] args){//1.int[] array_Int;array_Int new int[] { 1, 3, 2 };foreach (int item in array_Int){Console.WriteLine(item);}//2.int[] array_Int2;arr…