1.Integer类的用途

        Integer 一个整型数据用来存储整数,整数包括正整数,负整数和零。将整型数据存储起来,变成Integer对象。这个过程叫装箱,而将Integer对象变成整型数据,这个过程叫做拆箱。

Int是java的原始数据类型,Integer是java为int提供的封装类。且Integer类有两个父类,一个是object 还有一个是  Number抽象类。

2.如何将数据封装成Integer对象

        2.1 装箱

             方法1:通过new的方式,将数据封装成Integer对象。其中需要封装的数据可以是整型,还可以是纯数字的字符串

              方法2:通过Integer.Valueof()方法

示例1:

public class integer {public static void main(String[] args) {Integer i1 = new Integer(2);Integer i2 = new Integer("123");System.out.println(i1+" "+i2);}
}

示例2:

public abstract class integer {public static void main(String[] args) {Integer  i   =   Integer.valueOf(12);System.out.println(i);}
}

2.2装箱过程(原理)

     2.2.1   当需要封装的数据是整型时:

调用Integer类中构造方法将数据传入,并将数据赋值给Integer类中的value成员属性;

private final int value-属性value是用private和final关键字修饰了的,因此value属性不允许在类外访问且一旦在构造函数中赋予了初值就不会在改变,因为有final关键字,value是常量。

2.2.2   当需要封装的数据是纯数字字符串时:

        

调用参数是字符串的构造方法 ,将纯数字传入,通过Integer本类中的parseInt()方法将纯数字的字符串转化为整型数字。并将

        parseint源码转化过程:

 //将字符串和radix(表示进制默认的为十进制)传入public static int parseInt(String s, int radix)throws NumberFormatException{//判断字符串是否为空值if (s == null) {throw new NumberFormatException("null");}//判断radix是否为小于二进制。Character.MIN_RADIX来自Character类中的常量 //public static final int MIN_RADIX = 2;if (radix < Character.MIN_RADIX) {throw new NumberFormatException("radix " + radix +" less than Character.MIN_RADIX");}//判断radix是否为小于36进制。Character.MIN_RADIX来自Character类中的常量 //public static final int MAX_RADIX = 36;if (radix > Character.MAX_RADIX) {throw new NumberFormatException("radix " + radix +" greater than Character.MAX_RADIX");}/*设置了几个局部变量result表示结果negative = false相当于开关(flag)len = s.length()字符串的长度limit = -Integer.MAX_VALUE  设置限度*/int result = 0;boolean negative = false;int i = 0, len = s.length();int limit = -Integer.MAX_VALUE;int multmin;int digit;//查看字符串的长度是否大于0,如果大于0,则取第一个字符。if (len > 0) {char firstChar = s.charAt(0);/*用取出来的字符与0的Ascii码值48比较,如果小于48则说明该字符串不是纯数字可能为负数有(“-”)的字符串并往回抛出NumberFormatException(数字格式化异常)*/if (firstChar < '0') { // Possible leading "+" or "-"if (firstChar == '-') {negative = true;limit = Integer.MIN_VALUE;} else if (firstChar != '+')throw NumberFormatException.forInputString(s);if (len == 1) // Cannot have lone "+" or "-"throw NumberFormatException.forInputString(s);i++;}multmin = limit / radix;//为下面判断溢出做铺垫//如果上面判断为flas则进入循环,继续往下判断while (i < len) {// Accumulating negatively avoids surprises near MAX_VALUE/*digit = Character.digit(s.charAt(i++),radix);charAt()是String类中的方法而String继承了CharSequence接口,并实现了charAt()                          方法。该方法将用于判断i的值是否小于0或大于字符的长度,如果判断为flas则抛出StringIndexOutOfBoundsException字符索引超出的异常,如果为true则返回下标为i的字符。Character.digit(字符,radix);调用character类中的实现CharacterData中的digit抽象方法时将字符强转为整型, 在调用抽象类CharacterData.of().digit()优化得到一个整数。*/          digit = Character.digit(s.charAt(i++),radix);//将的到的整数digit与0作比较,结果如果为flas,则抛出数字格式化错误if (digit < 0) {throw NumberFormatException.forInputString(s);}//如果digit满足digit>=0,那么则开始测试是否溢出,if (result < multmin) {throw NumberFormatException.forInputString(s);}//将result转化为十进制result *= radix;if (result < limit + digit) {throw NumberFormatException.forInputString(s);}result -= digit;}} else {throw NumberFormatException.forInputString(s);}//如果negative为true返回 (负数)result否则 (正数)-result  return negative ? result : -result;}

2.3自动装箱

 不需要是通过new的方式,将数据封装为Integer类型。

示例:

public class integer {public static void main(String[] args) {Integer i2 = 123;Integer i1 = Integer.valueOf(123);System.out.println(i1==i2);}
}

结果:

                 自动装箱成功,但是打印i1==i2,结果为true说明,i1和i2是同一个对象。只有这种说法才能让i1=i2的结果为true.这里就跟自动装箱的低层实现有关了

2.3.1 自动装箱的底层实现

                        自动装箱的底层是通过Integer.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类的内部类IntegerCache这个类中的valueof()方法,将数据与常量low和height比较。但是在IntegerCache这个类中有1个静态代码块,因此在代码块在加载时优先级加载

而这个静态代码块中有一个缓存区,将-128到127之间的数字封装成Integer对象;

        静态代码块:

        

首先初始定义的一个局部变量  h = 127,然后定义了一个String类型的变量 ,并调用了系统中虚拟机的方法获取系统中的height的默认值值,将其赋值String变量。                                        String      integerCacheHighPropValue = sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");

如果获取到的值为空则直接将h的值赋值给height.

如果获取的值不为空,则将该值转化为int类型并赋值给i变量,int  i=parseInt(integerCacheHighPropValue);再将i的值与127比较取最大的一个的值并赋值给i;i = Math.max(i, 127); 

再将i的值与Integer.MAX_VALUE-(low)-1比较,取其中的最小的一个值,目的时为了防止溢出,因为如果取的默认值超过了Integer.MAX_VALUE-(low)-1的值就会发生溢出。但是一般是不会发生,除非修改了虚拟机系统方法的默认值

h = Math.min(i, Integer.MAX_VALUE - (-low) -1);

最后将h的值赋给height,height = h  范围(-128--127)

cache = new Integer[(high - low) + 1];   cache是一个数组,而这个数组是一个Integer类型的数组,其长度为[(height-low)+1];(256)

int j = low;将low赋值给j,因为low是一个常量,方便下面的操作。

for(int k = 0; k < cache.length; k++)
                         cache[k] = new Integer(j++);
通过循环将0-255的Integer对象放在cache[]数组中,相当于起了一个缓存作用。

 assert IntegerCache.higth>= 127;assert 后跟boolean表达式,如果表达式为True则继续执行

否则抛出异常。在这里不改变系统默认值的情况下,则将继续执行。

因此只要输入的值的范围在【-128到127】之间就不会通过new来创建Integer对象,而是通过

IntegerCache  内部类中的cache[ ]数组中的封装的-128到127个Integer对象来赋值给Integer对象

的引用。

Integer类----装箱相关推荐

  1. Integer类的装箱和拆箱到底是怎样实现的?

    先解释一下装箱和拆箱: 装箱就是  自动将基本数据类型转换为包装器类型:拆箱就是  自动将包装器类型转换为基本数据类型. 下表是基本数据类型对应的包装器类型: int(4字节) Integer byt ...

  2. Java语言基础(常见对象3(数组排序(冒泡排序、选择排序、直接插入排序、快速排序、归并排序)、Arrays、基本数据类型包装类、Integer类、自动拆箱、自动装箱))

    Java语言基础 常见对象 数组排序 冒泡排序 相邻元素两两比较,大的往后放,第一次完毕,最大值的元素就会出现在最大索引处:以此循环 //冒泡排序:public static void main(St ...

  3. java可以用 lt =判断int吗_int 和 integer:装箱和拆箱的过程,会用到什么方法

    本文转载自[微信公众号:五角钱的程序员,ID:xianglin965],经微信公众号授权转载,如需转载与原文作者联系 原文标题<int 和 integer :装箱和拆箱的过程,会用到什么方法,你 ...

  4. JDK1.8源码(二)——java.lang.Integer 类

    上一篇博客我们介绍了 java.lang 包下的 Object 类,那么本篇博客接着介绍该包下的另一个类 Integer.在前面 浅谈 Integer 类 博客中我们主要介绍了 Integer 类 和 ...

  5. JAVA面试题(part7)--Integer类

    学习笔记,仅供参考 JAVA面试题 请看下面一段代码,写出它的输出结果 package com.guiyang.restudy3;public class D5Integer {public stat ...

  6. java integer_Java之Integer类

    Integer类简介: Integer类是基本数据类型int的包装器类,是抽象类Number的子类,位于java.lang包中. Integer类在对象中包装了一个基本类型int的值,也就是每个Int ...

  7. java integer == int_通过实例了解Java Integer类和int的区别

    代码实例如下 public static void main(String[] args) { Integer i = 10; Integer j = 10; System.out.println(i ...

  8. Integer自动装箱和拆箱,以及不使用不使用new关键字直接赋值会遇到的的问题

    Integer直接赋值使用==判断是否相等 //java中如果Integer不是new出Integer对象,而是直接赋值如Integer a=100;Integer b=100;System.out. ...

  9. Java中的Integer类

    常见对象(Integer类的概述和构造方法) 如果有两个需求: 需求: 将100转换成二进制, 八进制, 十六进制 判断一个数是否在int的范围内 当然,可以使用最基本的方法累除取余来求一个十进制数的 ...

最新文章

  1. Golang通道的无阻塞读写的方法示例
  2. Java struts 2 源码阅读入门
  3. Leetcode1686. 石子游戏 VI[C++题解]:博弈论、按照a+b贪心
  4. 亚马逊记AWS(Amazon Web Services)自由EC2应用
  5. 关于IE6、7、8下实现盒阴影的几个注意点
  6. 谈谈JVM内部锁升级过程
  7. 集群搭建预备操作:在私有云上创建与配置虚拟机
  8. retinanet网络模型结构
  9. 台式电脑接路由器步骤_台式电脑怎么连接无线路由器
  10. postgresql授权和撤销
  11. Thinkphp3.2邮件发送
  12. Excel word PDF导入导出 Easy POI
  13. windows系统: 解决ie谷歌浏览器证书错误.2021-05-27
  14. laravel文档链接
  15. 完美世界3D格斗手游[格斗宝贝]今日公测
  16. Linux下用五笔输入法
  17. java里面获取map的key和value的方法
  18. 交换机分布缓存_缓存比普通交换机也大许多
  19. mysql spatial索引_空间索引Spatial Indexing
  20. itsm软件_itsm软件的主要功能

热门文章

  1. [共享]iOS开发系列--Swift语言
  2. TCP/IP--网络基础知识
  3. 超酷的Prezi在线ppt制作网站
  4. 双重打击:手机碎屏了,换屏过程中可被黑客入侵
  5. 使用pagehelper实现手动分页
  6. c语言教学理念和思路,基于CDIO理念的《C语言程序设计》教学改革探索
  7. 辅助工具_米家全景相机如何拍全景图
  8. c语言goout函数,cgo,如何让被嵌入的c语言代码调用golang
  9. SpringBoot集成mybatis拦截器的实现
  10. 软件测试岗位常见的面试题有哪些?我来告诉你