Java底层基础-Integer底层源码分析

一、Integer简介

Integer类时int基本数据类型的封装类;

  • Integer类和int的区别

    Integer 是 int 包装类,int 是八大基本数据类型之一(byte,char,short,int,long,float,double,boolean)
    Integer 是类,默认值为null,int是基本数据类型,默认值为0;
    Integer 表示的是对象,用一个引用指向这个对象,而int是基本数据类型,直接存储数值。

二、源码分析

1. 继承关系

final修饰类,所以Integer类不能被继承和修改(与String一样,每次操作都会新生成一个对象,对形参的修改,实参不受影响)
Integer继承了Number类,所以该类可以调用longValue、floatValue、doubleValue等系列方法返回对应的类型的值
Integer类实现了Comparable接口(这个接口只有compareTo一个方法),可以用compareTo进行比较,
并且Integer对象只能和Integer类型的对象进行比较,不能和其他类型比较(至少调用compareTo方法无法比较)
Integer通过Number实现了序列化接口,可以进行序列化

	public final class Integer extends Number implements Comparable<Integer> 

2. 成员变量

	// 最小取值是 -2^31
	@Native public static final int   MIN_VALUE = 0x80000000;
	// 最大取值是2^31-1
	@Native public static final int   MAX_VALUE = 0x7fffffff;
	// 表示是基本类型int的calss实例
	public static final Class<Integer>  TYPE = (Class<Integer>) Class.getPrimitiveClass("int");
	// 实际存放的值value
	private final int value;

3. 构造函数

在Integer类中提供了两个构造函数,分别针对构造参数为基本类型int和引用类型String.这两个方法都是给当前的实例的value属性赋值,参数为int类型;构造器直接将参数赋值给value属性,参数为String类型是调用了方法parseInt。

	//当我们使用new Integer(10)创建一个Integer对象的时候,就会用以下形式给value赋值
	public Integer(int value) {
   
        this.value = value;
    }
    //当我们使用Integer a = new Integer("2")创建一个Integer对象的时候 ,创建的是String 参数所指示的 int 值
    public Integer(String s) throws NumberFormatException {
   
    	//从构造方法中我们可以知道,初始化一个Integer对象的时候只能创建一个十进制的整数。
        this.value = parseInt(s, 10);
    }

4. 私有内部类

IntegerCache是Integer的内部类,用来缓存了low-high之间数字的包装类,这个类是私有且静态的,并且有三个被final修饰的静态变量外加一个静态代码块和一个私有构造函数;被缓存的包装类介于low-high之间,low的值已经写死为-128,high值由虚拟机决定。
sun.misc.VM.getSavedProperty(“java.lang.Integer.IntegerCache.high”) 是一个参数,可以动态设置。然后在循环中将low-high之间数字的装箱后方法cache[]这个Integer类型的数组中。这样就完成了缓存

private static class IntegerCache {
   
       static final int low = -128;
       static final int high;
       static final Integer cache[];

       static {
   
           // 缓存范围的最大值,可从配置文件配置
           int h = 127;
           String integerCacheHighPropValue =
               sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
           if (integerCacheHighPropValue != null) {
   
               try {
   
                   int i = parseInt(integerCacheHighPropValue);
                   // 获取配置文件i和127之间的最大值
                   i = Math.max(i, 127

你可能感兴趣的:(Java基础知识,java)