概述

本文中小编为大家细致的讲解了Java中基本数据类型对应的包装类以及包装类的缓冲机制在实际开发中的应用 。 并且对Java中基本数据类型的包装类的主要应用---自动封箱、自动拆箱做了底层剖析 。

自JDK1.5开始, 引入了自动装箱/拆箱这一语法糖, 它使程序员的代码变得更加简洁, 不再需要进行显式转换。基本类型与包装类型在某些操作符的作用下, 包装类型调用valueOf()方法将原始类型值转换成对应的包装类对象的过程, 称之为自动装箱; 反之调用xxxValue()方法将包装类对象转换成原始类型值的过程, 则称之为自动拆箱。

一、Java中基本数据类型各自对应的包装类

详细的数据类型学习请参阅:数据类型总结

二、Jav中包装类的实际应用

封箱 :

Integer in = new Integer(123); //将一个基本数据类型的值转换为对应的引用类型的对象。

System.out.println(in);//打印出的是对象的值,而不是地址 --- 底层对toString做过重写

注意:

字符串转Integer :

Integer in = new Integer("0x23"); //运行报错:字符串底层是以字符串数组形式存储,在转换时会一次判断每一位是不是数字,所以只支持十进制的数。

数值型的基本数据类型的包装类都是Number类的子类。

字符串转Boolean:

Boolean b = new Boolean(str); //要求参数是字符串,当str="true"时 b值为 true;当str为"false"或任意字符串时,b值为false。

自动封箱:

将一个基本数据类型的变量直接赋值给对应引用类型。是JDK1.5的新特性 之一。

底层实现:自动封箱实际上是调用了静态方法valueOf() --> Integer in = Integer.valueOf(i); valueOf返回一个Integer类型的实例。或者是类似于上面的自动调用Integer的构造方法实现自动封箱,Integer in = 1。

/*

* 自动封箱的测试

*/

int i = 1;

int j = 1;

Integer in1 = i;//自动封箱

Integer in2 = Integer.valueOf(i);

System.out.println(in1==in2);//true

System.out.println(in1.equals(in2));//true

System.out.println(in1.equals(j));//true

//j是一个基本数据类型,在用equals方法进行对象的比较时,j被自动封箱

自动拆箱:

int num1 = 1;

int num2 = 2;

Integer in = num1;

int res = in+num2;//拆箱

System.out.println(res);

//将一个引用类型的实例直接赋值给对应基本数据类型的变量。 JDK1.5的新特性之一。底层实现:实际上是调用了****value()方法(xxx指的是对应 的基本数据类型)。---> int i = in.intVlaue(); // ***value() 返回对应基本类型的值。

整数的哈希码是自己本身。Integer底层对hashCode()方法做过重写。

数值类型的哈希码是不变的。

注意:

Integer i1 = 123;

Integer i2 = 123;

i1==i2 ;//true;

Integer i3 = 1234;

Integer i4 = 1234;

i3==i4;//false

解释:int类型的值在常量池中初始化,只初始化-128~127的范围。所以当值在-128~127中时,是直接从从常量池中取值,而常量池中的常量是被共享的,所以i1==i2;当值 不在-128~127之间时,会new Integer(),所以i3、i4指向的堆内存地址 不一样。

自动拆箱应用:

Integer i1 = new Ingeter(123);

int i = 123;

i1 == i; //true

解释: 当引用类型与基本类型直接运算时,引用类型会自动拆箱。

底层的原理:自动调用了intValue()来实现拆箱。其他类型类推。

三、包装类的缓冲机制

包装类同String类相似,也是非可变类,其对象一经创建,就不能修改。并且,包装类也重写了equals方法,对于相同类型的两个包装类对象,只要两个对象所包装的基本数据类型的值是相等的,则equals方法就会返回true,否则返回false。

在使用“==”比较两个包装类引用时,如果两个引用指向的地址相同(指向相同的对象),则结果为true,否则结果为false。

包装类提供了对象的缓存,具体的实现方式为在类中预先创建频繁使用的包装类对象,当需要使用某个包装类的对象时,如果该对象封装的值在缓存的范围内,就返回缓存的对象,否则创建新的对象并返回。

在包装类中,缓存的基本数据类型值得范围如下:

包装类型基本数据类型缓存对象(基本数据类型值)

Booleanbooleantrue,false(全部值)

Bytebyte-128~127(全部值)

Shortshort-128~127

Characterchar0~127

Integerint-128~127(默认为127)

Longlong-128~127

Floatfloat无缓存值

Doubledouble无缓存值

在jdk1.5及之后的版本中,Java在5大包装类中(Byte,Charactor,Short,Integer,Long)增加了相应的私有静态成员内部类为相应包装类对象提供缓存机制,Integer包装类的内部缓存类源码如下:

正如源码中所指,在自动装箱的基础上,缓存机制才会发生作用;当包装类加载时,内部类会初始化一个长度为((high-low)+1)的包装类类型数组,low有固定值为-128,而high的默认值为127,还可以通过系统配置文件进行修改,自定义high的取值范围是127---------(Interger.MAX_VALUE+127),Integer.MAX_VALUE是int类型变量的最大正数取值;’

其缓存机制是:当通过自动装箱机制创建包装类对象时,首先会判断数值是否在-128----127的范围内,如果满足条件,则会从缓存中寻找指定数值,若找到缓存,则不会新建对象,只是指向指定数值对应的包装类对象,否则,新建对象。

Integer a = new Integer(100);

Integer b = new Integer(100);

System.out.println(a == b);

// 输出为false,非自动装箱机制实现,属于两个不同的对象,所以返回false.

//--------------------------------分割线---------------------------------------

int num1 = 127;

int num2 = 127;//

Integer in1 = num1;

Integer in2 = num2;

System.out.println(in1 == in2);//true

//全部都在范围之内,所以为true

//--------------------------------分割线---------------------------------------

int num3 = 127;

int num4 = 128;//超过了上限,成为一个缓冲范围外的新对象

Integer in3 = num3;

Integer in4 = num4;

System.out.println(in3 == in4);//false

//num4的包装类in4超过了上限,成为一个缓冲范围外的新对象,所以为false

其实,Integer的缓存下限固定为-128,而缓存上限是可以在运行时通过修改系统属性来设置的。

比如可以在命令行输入:

java -Djava.lang.Integer.IntegerCache.high=100 xxx

或者在选择server虚拟机时,输入:

java -server -XX:AutoBoxCacheMax=100 xxx

如果去掉-server参数,将报错,这是因为,默认的虚拟机是client虚拟机,也就是不加参数或者使用-client参数时系统选择的虚拟机,而client虚拟机不支持-XX:AutoBoxCacheMax参数。

如果同时使用以上方式来设置缓存上限属性,以-XX:AutoBoxCacheMax参数为准。

后记

————————————————

版权声明:本文为CSDN博主「hu_beliefs」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/hu_belif/article/details/82262579

java自动封箱_Java程序员面试,自动封箱/拆箱原理与包装类的缓冲机制你知道么?(转)...相关推荐

  1. 容易答错的java面试题_Java程序员面试中最容易答错的8道面试题,你中招了吗?...

    1. static 和 final 的用法 static 的作用从三个方面来谈,分别是静态变量.静态方法.静态类. 静态变量:声明为 static 的静态变量实质上就是全局变量,当声明一个对象时,并不 ...

  2. java程序员面试需要注意什么_Java程序员面试时要注意的一些问题

    Java程序员面试的时候会面临各种五花八门的问题,你的第一反应.思维逻辑.思考方法,专业水平决定了企业对你的评价和你的薪资水准,但是除了专业以外还有一些你需要避免出现错误的注意事项,如果很好的避免了, ...

  3. java程序员面试技术_java程序员面试应该具备的一些基本技能

    这里列举一些Java程序员面试应该要具备的一些基本技能,仅当参考. 1.基本语法 包括static.final.transient等关键字的作用,foreach循环的原理等等.越简单的问题越能看出一个 ...

  4. java xml 面试_Java程序员面试常见的10道XML面试题

    问题1:XML是什么? 答:XML即可扩展标记语言(Extensible Markup language),你可以根据自己的需要扩展XML, ,而不能使用用户定义的标签.使用DTD和XML Schem ...

  5. java中10d是什么意思_java程序员面试自我介绍

    java程序员面试自我介绍 当面试考官随便地问你:"谈谈你自己的情况如何?"这是面试中的第一个问题.此刻,你应把在此之前所有紧张不安的情绪稳定下来.因为这个问题,应试者已经做了充分 ...

  6. java核心技术 pdf下载_JAVA程序员面试秘笈 PDF 下载_Java知识分享网

    相关截图: 资料简介:Ja程序员目前就业形势较好,因为Ja的应用太广泛了,从网页开发到手机安卓开发,都离不开Ja.<Ja程序员面试秘笈>是一本解析Ja面试题的书,可以帮助求职者更好地准备面 ...

  7. android byte[] 转string 好多问号_java程序员面试遇到string题如何不凉?

    原标题:java程序员面试遇到string题如何不凉? 最近看到好多同学都在储备面试知识,以备来年轻松应对面试官,拿到心仪offer,之前好多同学反映遇到string,都只能送给自己一首凉凉.别凉,今 ...

  8. java 排名相同_Java程序员十年面试经验,助你成为offer收割机

    关于面试 其实关于面试总结这块,小编也看过不少文章,但是大部分都是关于面试题以及面试中的问题所谈.但是对于一个不擅长找工作的人来说,其实在简历制作这一块很重要.因为简历没写好的话,连面试邀请都没,何谈 ...

  9. java程序员面试怎么难为面试官_Java程序员面试这些多线程问题你知道吗?

    在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分.所以你应该准备很多关于多线程的问题.在投资银行业务中多线程和并发是一个非常受欢迎的话题,特别是电子交易发展方面相关的.他们会问面试者很 ...

最新文章

  1. 多路IO复用模型 select epoll 等
  2. Android AutoWrapTextView 解决中英文排版问题
  3. 企业网络推广期间关于网站分享功能设计有哪些细节需要加以重视?
  4. Mac终端Terminal使用
  5. lm80认证_中国能效标识GB30255、GB38450和GB37478认证要求讲解
  6. 06_clickhouse、表和列的TTL规则与实践、表和列的TTL、列级TTL、表级TTL、列级TTL示例、表级TTL示例
  7. git 简易指南+常用命令
  8. Scala _06集合_数组(二)
  9. crontab 每分钟一次_Celery实现定时任务crontab
  10. 05 HTML字符串转换成jQuery对象、绑定数据到元素上
  11. Linux 驱动开发之内核模块开发(四)—— 符号表的导出
  12. Android设计模式之——命令模式
  13. php console postman,postman内置脚本说明
  14. Struts2的ValueStack(值栈)介绍
  15. 动画以及View绘制中的addview实战
  16. git学习资料及心得
  17. 拓端tecdat|Python银行机器学习:回归、随机森林、KNN近邻、决策树、高斯朴素贝叶斯、支持向量机svm分析营销活动数据
  18. OrCAD 与 Cadence Allegro PCB 入门 - 以 16.6版本为例 (1)
  19. 一款基于matlab的图像处理软件
  20. 文本编辑器-Sublime Text 安装汉化搭建C/C++环境教程

热门文章

  1. oracle安装完成后怎么这么多用户和表,下面哪个用户不是oracle缺省安装后就存在的用户...
  2. java虚拟机jvm_java虚拟机jvm - zhuyuansj的个人空间 - OSCHINA - 中文开源技术交流社区...
  3. mybatis plus 日志打印_Mybatis-plus常用API全套教程,看完没有不懂的
  4. 山西评计算机高级职称,山西专业技术职称评审不再统一组织外语和计算机能力考试...
  5. html布局四个正方形,分享一个css小技巧,实现给正方形的四个角设置小方块的方法...
  6. android启动画面白屏,Android app启动时黑屏或者白屏的原因及解决办法
  7. 专科转行学java_大专女生想转行做IT,应该先学哪一块?
  8. matlab斜杠报错,java调用matlab 时出现java.lang.NullPointerException错误
  9. win7下ado连接mysql_提示连接无法用于执行此操作_ADODB.Recordset (0x800A0E7D)连接无法用于执行此操作。在此上下文中它可能已被关闭或无效。...
  10. 为什么建议使用count(*)来统计数据行数