栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JDK源码分析一 Integer 分析

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JDK源码分析一 Integer 分析

一、类结构 1.1 首先先看下Integer的整体结构:

 

继承Number类,可以转换为int, long, float, double, byte, short等基本类型;

实现了Comparable接口,也重写了两个方法compareTo()和compare();

因为Integer 被final 修饰,故Integer 不能被继承。

1.2 再看下内部类:IntegerCache

 

Integer有个内部类IntegerCache,静态代码块创建的常量Integer数组,存储-127--128值的Integer对象,
  但是只有采用Integer.valueOf()调用时才会获取已经创建好的Integer数组中的值,但是若是创建的Integer值大于127,
  那么即使使用valueOf(),依然会采用new Integer() 方式进行创建对象;我们在创建对象尽量使用valueOf(),
  【注意】Integer最大值是默认127,我们可以通过修改参数值进行扩大默认值,在启动JVM时通过:
          -Djava.lang.Integer.IntegerCache.high=xxx 就可以改变缓存值的最大值。
1.3 构造函数

 Integer 中提供了两个有参构造函数,详细说说第二个,通过String进行对象创建的构造函数。     以下是源代码:

 public Integer(String s) throws NumberFormatException {
        this.value = parseInt(s, 10);
 }

 
 // radix 表示几进制
    public static int parseInt(String s, int radix)
                throws NumberFormatException{
        

        if (s == null) {
            throw new NumberFormatException("null");
        }

        // 判断需要转化的进制是否是2-36之间的进制
        if (radix < Character.MIN_RADIX) {
            throw new NumberFormatException("radix " + radix +
                                            " less than Character.MIN_RADIX");
        }

        if (radix > Character.MAX_RADIX) {
            throw new NumberFormatException("radix " + radix +
                                            " greater than Character.MAX_RADIX");
        }


        int result = 0; // 结果
        boolean negative = false; // 传入的s是否是负数
        int i = 0, len = s.length();
        int limit = -Integer.MAX_VALUE;
        int multmin;
        int digit;

        if (len > 0) {
            // 判断第一个字符是否是特殊字符,例如+ ,-    char比较的就是ASCALL码对应的值大小
            char firstChar = s.charAt(0);
            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;
            while (i < len) {
                // Accumulating negatively avoids surprises near MAX_VALUE
                // Character.digit() 查看该值各个位有没有超过该进制限定的值,超过则返回-1,没有就返回该数字
                digit = Character.digit(s.charAt(i++),radix);
                if (digit < 0) {
                    throw NumberFormatException.forInputString(s);
                }
                if (result < multmin) {
                    throw NumberFormatException.forInputString(s);
                }
                result *= radix;
                if (result < limit + digit) {
                    throw NumberFormatException.forInputString(s);
                }
                result -= digit;
            }
        } else {
            throw NumberFormatException.forInputString(s);
        }
        // 根据negative的值判断返回值是否取反
        return negative ? result : -result;
  }
1.4 常见方法 Integer转为 基本类型的相关方法
    // Integer 结果转为byte类型值
    public byte bytevalue() {
        return (byte)value;
    }

    // Integer 结果转为short类型值
    public short shortValue() {
        return (short)value;
    }

    // Integer 结果转为int类型值
    public int intValue() {
        return value;
    }

    // Integer 结果转为long类型值
    public long longValue() {
        return (long)value;
    }

    // Integer 结果转为float类型值
    public float floatValue() {
        return (float)value;
    }

    // Integer 结果转为double类型值
    public double doublevalue() {
        return (double)value;
    }

    // Integer 结果转为String类型值
    public String toString() {
        return toString(value);
    }
1.5 常见方法 int 和String 转为Integer类型
public static Integer valueOf(String s, int radix) throws NumberFormatException {
        return Integer.valueOf(parseInt(s,radix));
}

public static Integer valueOf(String s) throws NumberFormatException {
        return Integer.valueOf(parseInt(s, 10));
}

public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
}

 详细看下valueOf(int i) 方法,实现方式是判断i是否在IntegerCache创建好的Integer数组中,若是在直接返回对应的Integer结果即可,若是不在即new  Integer(),通过该方式创建的Integer 对象更方便,利于对象的创建和回收,所以我们在创建Integer对象值应该采用valueOf(int i)方法。

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/763257.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号