【源码】java包装类总结

1.包装类除了Void和Character,其他六个全部都继承自Number。Number是一个抽象类。如下:

public abstract class Number implements java.io.Serializable {
    public abstract int intValue();
    public abstract long longValue();
    public abstract float floatValue();
    public abstract double doubleValue();
    public byte byteValue() {
        return (byte)intValue();
    }
    public short shortValue() {
        return (short)intValue();
    }
    private static final long serialVersionUID = -8742448824652078965L;
}

2.Integer、Byte、Short、Long内部都有"缓存"静态类,以Integer为例:
缓存即一个Integer数组,默认大小为-128~127。初始化时,会new出256个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) {
                int i = parseInt(integerCacheHighPropValue);
                i = Math.max(i, 127);
                // Maximum array size is Integer.MAX_VALUE
                h = Math.min(i, Integer.MAX_VALUE - (-low));
            }
            high = h;
            cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);
        }
        private IntegerCache() {}
    }

当调用Integer.valueOf方法时,会首先判断参数是否在缓存范围内,若在,直接返回缓存对象,否则,构造之。

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

可见,Integer将加载缓存数组延迟到了最晚,避免浪费空间。
另外可以通过intValue方法返回Integer对应的int值(其他包装类类似):
 public int intValue() {
        return value;
    }

value是Integer成员变量,构造时被传递进来:

 private final int value;

    public Integer(int value) {
        this.value = value;
    }
    public Integer(String s) throws NumberFormatException {
        this.value = parseInt(s, 10);
    }
3.除了Void类,其余包装类均实现了Comparable接口,可以通过compareTo方法比较两个包装类的大小。同时包装类提供了静态的compare方法比较两个参数的大小(以Integer为例):
 public int compareTo(Integer anotherInteger) {
        return compare(this.value, anotherInteger.value);
    }

compareTo方法其实调用了compare静态方法:
public static int compare(int x, int y) {
        return (x < y) ? -1 : ((x == y) ? 0 : 1);
    }
4.Integer的getInteger方法的作用是返回具有指定名称的系统属性的整数值,不要误用。
public static Integer getInteger(String nm, Integer val) {
        String v = null;
        try {
            v = System.getProperty(nm);
        } catch (IllegalArgumentException e) {
        } catch (NullPointerException e) {
        }
        if (v != null) {
            try {
                return Integer.decode(v);
            } catch (NumberFormatException e) {
            }
        }
        return val;
    }

5.包装类的toString方法经过了重写
public static String toString(int i) {
        if (i == Integer.MIN_VALUE)
            return "-2147483648";
        int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
        char[] buf = new char[size];
        getChars(i, size, buf);
        return new String(buf, true);
    }
public String toString() {
        return toString(value);
    }

6.可以使用parseXXX方法将字符串转化为对应的数字。
public static int parseInt(String s, int radix)
                throws NumberFormatException
    {
        /*
         * WARNING: This method may be invoked early during VM initialization
         * before IntegerCache is initialized. Care must be taken to not use
         * the valueOf method.
         */
        if (s == null) {
            throw new NumberFormatException("null");
        }
        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;
        int i = 0, len = s.length();
        int limit = -Integer.MAX_VALUE;
        int multmin;
        int digit;
        if (len > 0) {
            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
                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);
        }
        return negative ? result : -result;
    }

 public static int parseInt(String s) throws NumberFormatException {
        return parseInt(s,10);
    }




  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
java码包J实例JAVA开发码55个合集: Java中的Blowfish对称密钥加密算法类和实例.rar Java中的EJB编程实例代码.rar Java中的SSL及HTTPS协议实例码.rar Java写的ATM机取款模拟程序.zip Java写的一个mp3播放器.rar Java写的图片幻灯片切换特效.rar Java写的天气预报软件.rar Java写的巨型LCD液晶时钟显示屏.rar JAVA图书馆管理系统码.rar Java图像文件的缩小与放大.rar Java学生信息管理系统码包.rar Java推箱子游戏(50关+音效).rar Java文件切割器代码.rar Java文件选择器代码.rar Java文字跑马灯与信息窗口.rar Java游戏中斜视角编辑器及引擎代码.rar Java游戏使命的召唤码.rar Java游戏沙丘城堡代码.rar Java码的仿QQ聊天程序.rar Java用GZIP压缩解压文件.rar Java用Zip压缩多个文件实例码.rar Java用的在线地图浏览模块.rar Java约瑟夫环演示Applet码.rar java网络五子棋的代码.rar JAVA网络抓包程序.rar Java转换xml.rar java项目码在线相册系统.rar 书籍管理系统.rar 企业进销存管理系统.rar 传奇私服登录器Java版附代码.rar 修改表头加密数据库.rar 分离SQL Server数据库.rar 单位固定资产登记管理系统JAVA版.rar 单机版java五子棋V1.1.rar 学生成绩系统(图形界面).rar 学生课程管理系统.rar 手机游戏J2ME毕业设计.rar 打地鼠游戏.rar 数据持久层框架 Hibernate.zip 数据结构提取器.rar 文件压缩解压缩包 Commons Compress.rar 日历同步统计 GCALDaemon.zip 物业管理系统毕业设计+码.rar 电子书店管理系统.rar 网上书店.rar 网络电视代码TV-Browser.rar 网络蚂蚁Java版.rar 网页浏览器.rar 蜀山剑侠传游戏J2ME手机版代码.rar 超市购物系统.rar 车间管控.rar 轻松商城系统.rar 选修课程管理系统V1.2.3.rar 配置ODBC数据.rar 销售预测系统PDP系统.rar 阳光酒店管理系统.rar
Java 自动装箱(Autoboxing)是 Java 1.5 版本之后引入的新特性,可以将基本类型自动转换为对应的包装类型,反之也可以。具体来说,就是在需要使用包装类型的地方,可以直接使用基本类型,而 Java 编译器会自动将其转换为对应的包装类型。 Java 自动装箱的实现是通过编译器在编译期间自动插入装箱(Boxing)和拆箱(Unboxing)的代码来完成的。具体来说,当编译器发现一个需要使用包装类型的地方,它会自动插入一个将基本类型转换为包装类型的代码,而当编译器发现一个需要使用基本类型的地方,它会自动插入一个将包装类型转换为基本类型的代码。 下面简单介绍一下自动装箱的码实现: 1. 自动装箱 自动装箱是通过调用对应包装类型的 valueOf 方法来实现的。例如,当需要将 int 类型的变量 i 转换为 Integer 类型时,编译器会自动插入如下代码: ```java Integer i = Integer.valueOf(i); ``` 其中,valueOf 方法定义在对应包装类型的类中,例如 Integer 类中的 valueOf 方法如下: ```java public static Integer valueOf(int i) { return new Integer(i); } ``` 2. 自动拆箱 自动拆箱是通过调用对应包装类型的 xxxValue 方法来实现的。例如,当需要将 Integer 类型的变量 i 转换为 int 类型时,编译器会自动插入如下代码: ```java int i = i.intValue(); ``` 其中,xxxValue 方法定义在对应包装类型的类中,例如 Integer 类中的 intValue 方法如下: ```java public int intValue() { return value; } ``` 以上是 Java 自动装箱的码分析,希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值