Integer类超详解-1

简介: Integer类超详解

前言

        有时,需要将int这样的基础数据类型转换为对象,所有的基础数据类型都有一个与之对应的类,称为包装类(或者包装器),这些包装类的有其名字如下:

基本数据类型对应的包装类名

基本数据类型 包装类
int Integer
short Short
long Long
byte Byte
float Float
double Double
char Character
boolean Boolean


       包装类同String类一样,是不可变的,一旦构造了包装类对象 ,就不能改变对应包装类中的属性。同时包装类是被final修饰的类,因此不能用来派生子类(不能被继承)。


        java.lang包中的Integer类在对象中包装了一个基本数据类型,它包含一个int类型的字段。此外,Integer类中还包含了很多方法,用来处理int类型的数据,例如将int和String类型之间相互转化的方法等。


       不只是int类型,long,short类型都可以封装成一个类,这些类都是Number的子类。


Integer的内部结构

       Integer类型里面提供了一下四个常量

1、MAX_VALUE

表示int类型可取的最大值,即   249571c865eae84d2d7008407e6f06e2_eq_%5Clarge%202%5E%7B31%7D-1.png


2、MIN_VALUE

表示int类型可取的最小值,即  


最大值,对应的十进制,八进制,和二进制,十六进制

最小值,对应的十进制,八进制,和二进制,十六进制


其使用如下:

public class Test {
    public static void main(String[] args) {
        int a = Integer.MAX_VALUE;
        int b = Integer.MIN_VALUE;
        System.out.println("the value of Integer.MAX_VALUE is: " + a);
        System.out.println("the value of Integer.MIN_VALUE is: " + b);
    }
}

打印结果为:

3、SIZE

SIZE用来以二进制补码的形式表示int值的位数(int包装类位数为32,short包装类的SIZE为16)

例如:

public class Test {
    public static void main(String[] args) {
        int SIZEOfInteger = Integer.SIZE;
        System.out.println("the value of Integer.SIZE is: " + SIZEOfInteger);
    }
}

4、TYPE

表示基本数据类型int的Class实例,可以通过TYPE来验证Integer类的常量


构造方法

Integer中有一个常量value,是被final修饰的类型,也就是在构造函数对其进行初始化之后就无法修改的常量。

1、Integer(int  number)

       语法如下:

Integer  a  =  new Integer( int  number )


       将一个int类型的数据作为参数传入其中来构建一个Integer对象


2、Integer(String  str)

Integer  a  =  new Integer( String str )


       将一个String对象作为参数传入其中, 然后调用parseInt(String s,int radix)方法,将传入的字符串作为参数,将其转化为对应的int类型的数据,然后赋值给value


4b9e039170e61e6a2e2cddbe00589f6f_d2d9245df8114f7bb4e1bbdfceb92e13.png


注意:
       对于这种传入String对象的情况,str的内容必须为数值类型的字符串,否则将会抛出NumberFormatException 异常。


3.引用为null

       包装类也可以不进行初始化,将其引用设置为null。但也因此会在使用他的时候抛出空指针NullPointerException异常:

Integer tem  =  null;

System.out.println( 1 * tem );


装、拆箱

       首先,装箱和拆箱都不是虚拟机的工作,而是编译器。编译器生成字节码,虚拟机来执行这些字节码。

       装箱

       对于一个列表ArrayList< x > ,如果我们想要存放int类型的数据,是不能直接写成:ArrayList的,因为<>尖括号中的内容是不允许为基本数据类型的,只能用一个类,例如包装类,或者自己自定义的类等。如ArrayList。


       但是java中有一个特性能很方便的将int类型直接作为对象的形式添加到ArrayList中去:调用:

List.add(2);

自动转化为:

List.add( Integer.valueOf(2))

Integer.valueOf(x) 返回一个value值为x的Integer对象。然后传入List中去,这种转换称为自动装箱


      拆箱

       反过来,也当然存在拆箱


       将一个Integer对象赋值给int类型的变量的时候,会自动拆箱,也就是会经历如下过程:执行:

int  a  =  List.get(i);

转换为:

int  a  =  List.get(i).intValue();

intValue()方法返回调用这个方法的Integer类的value值(也就是其对应的整形值),然后赋值给a变量。

       自动装拆箱对于普通的算数表达式也适用。例如:

Integer n = 3;

n++

编译器会将其拆箱,转化为int类型的数据,然后自增,随后进行装箱,再次还原为Integer对象


        隐式类型转换

如果一个表达式中同时使用了Integer对象和Double对象,那么Integer对象会拆箱,然后将里面的基础数据类型提升为double,然后在将其装箱为Double对象。例如:

public class Test {
    public static void main(String[] args) {
        Integer tem1 = 100;
        Double x = 2.0;
        System.out.println(true ? x:tem1);
    }
}

输出结果为2.0;


Integer对象的不可变性

有如下代码:

    public static void cal(int x){
        x = x + 1;
    }

        我们都知道,形参是实参的一份临时拷贝,实参传进来用形参接收,然后在方法里面改变的是形参,而没有改变实参,所以传进来的实参是不会自增1的。


       有些人可能会认为,能通过包装类来实现一个可以改变数值参数的方法,他会自动拆箱和装箱。但事实上是不可以的。例如:

1. public static void cal(Integer x){
2.         x = x + 1;
3.     }

       因为包装类是无法修改的,Integer对象里面的value值是被final修饰的,是无法修改的。


Integer类超详解-2

https://developer.aliyun.com/article/1515785

目录
相关文章
|
2天前
|
Java API
将`List<String>`转换为`List<Long>`
将`List<String>`转换为`List<Long>`
|
1月前
|
Java
Integer类超详解-2
Integer类超详解
23 0
|
1月前
BigDecimal转String
BigDecimal转String
18 0
|
10月前
|
人工智能 Java 数据库
BigDecimal 转 String
BigDecimal 转 String
115 0
|
缓存 Java API
|
安全
Synchroinzed对Integer的问题
Synchroinzed对Integer的问题
102 0
Synchroinzed对Integer的问题
Zp
|
缓存 Java
Integer的比较和注意点
Integer的比较和注意点
Zp
76 0
Integer的比较和注意点
|
Java
Java数据类型中String、Integer、int相互间的转换
Java数据类型中String、Integer、int相互间的转换
167 0
|
存储 缓存 Java
【每天一道面试题】Integer、 new Integer() 、int的==比较,你全都了解吗
【每天一道面试题】Integer、 new Integer() 、int的==比较,你全都了解吗
127 0
【每天一道面试题】Integer、 new Integer() 、int的==比较,你全都了解吗