文档章节

Integer类源码阅读(二)

夏夜流星
 夏夜流星
发布于 2013/12/31 13:11
字数 560
阅读 95
收藏 1
package java.lang;    
import java.util.Properties;    
public final class Integer extends Number implements Comparable<Integer> {
    //Integer的值
    private final int value;
    
    public Integer(int value) {
        this.value = value;
    }
    //由字符串来初始化Integer
    public Integer(String s) throws NumberFormatException {
        this.value = parseInt(s, 10);
    }
    
     public byte byteValue() {
        return (byte)value;
    }
    
    public short shortValue() {
        return (short)value;
    }
    
    public int intValue() {
        return value;
    }
    
    public long longValue() {
        return (long)value;
    }
    
    public float floatValue() {
        return (float)value;
    }
    
    public double doubleValue() {
        return (double)value;
    }
    
    public String toString() {
        return toString(value);
    }
    
    public int hashCode() {
        return value;
    }
    
    public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue(); //比较两个Integer的int值
        }
        return false;
    }
    
    public static Integer getInteger(String nm) {
        return getInteger(nm, null);
    }
    
    public static Integer getInteger(String nm, int val) {
        Integer result = getInteger(nm, null);
        return (result == null) ? Integer.valueOf(val) : result;
    }
    //返回系统属性的Integer值表示,nm表示系统属性,val表示默认值
    public static Integer getInteger(String nm, Integer val) {
        String v = null;
        try {
            v = System.getProperty(nm); //获取nm指定的属性
        } catch (IllegalArgumentException e) {
        } catch (NullPointerException e) {
        }
        if (v != null) {
            try {
                return Integer.decode(v); //将属性v转化为Integer表示
            } catch (NumberFormatException e) {
            }
        }
        return val;
    }
    //将字符串解码为Integer
    public static Integer decode(String nm) throws NumberFormatException {
        int radix = 10; //采取十进制
        int index = 0; //表示符号位和进制位的长度
        boolean negative = false; //是否为负数
        Integer result;

        if (nm.length() == 0) 
            throw new NumberFormatException("Zero length string");
        char firstChar = nm.charAt(0); //查询第一个字符,处理'+','-'的情况
        // Handle sign, if present
        if (firstChar == '-') {
            negative = true;
            index++;
        } else if (firstChar == '+')
            index++;

        // Handle radix specifier, if present
        //处理十六进制数
        if (nm.startsWith("0x", index) || nm.startsWith("0X", index)) {
            index += 2;
            radix = 16;
        }
        else if (nm.startsWith("#", index)) {
            index ++;
            radix = 16;
        }
        //处理八进制数
        else if (nm.startsWith("0", index) && nm.length() > 1 + index) {
            index ++;
            radix = 8;
        }
        //若处理完进制位和符号位后出现了'+','-'的情况,直接抛出异常
        if (nm.startsWith("-", index) || nm.startsWith("+", index))
            throw new NumberFormatException("Sign character in wrong position");

        try {
            result = Integer.valueOf(nm.substring(index), radix);
            result = negative ? Integer.valueOf(-result.intValue()) : result;
        } catch (NumberFormatException e) {
            // If number is Integer.MIN_VALUE, we'll end up here. The next line
            // handles this case, and causes any genuine format error to be
            // rethrown.
            //处理为Integer的最小值的情况,该处会再次抛出异常
            String constant = negative ? ("-" + nm.substring(index))
                                       : nm.substring(index);
            result = Integer.valueOf(constant, radix);
        }
        return result;
    }
    
    public int compareTo(Integer anotherInteger) {
        return compare(this.value, anotherInteger.value);
    }
    
    public static int compare(int x, int y) {
        return (x < y) ? -1 : ((x == y) ? 0 : 1); //比较x,y的大小,x<y返回-1,x=y返回0,x>y返回1
    }
    
    public static final int SIZE = 32;
    
    public static int highestOneBit(int i) {
        // HD, Figure 3-1
        i |= (i >>  1);
        i |= (i >>  2);
        i |= (i >>  4);
        i |= (i >>  8);
        i |= (i >> 16);
        return i - (i >>> 1);
    }
}


© 著作权归作者所有

共有 人打赏支持
夏夜流星
粉丝 6
博文 4
码字总数 3844
作品 0
沙坪坝
程序员
Integer类源码阅读(一)

一、类说明 Integer类是用来包装原始类型int的类,用以表示原始类型int的面向对象的类。类中包含了原始类型int的值及相应的操作。 二、源码解析 package java.lang;import java.util.Propert...

夏夜流星
2013/12/29
0
0
java.lang.Void 解析与使用

今天在查看源码的时候发现了 java.lang.Void 的类。这个有什么作用呢? 先通过源码查看下 从源码中发现该类是final的,不可继承,并且构造是私有的,也不能 new。 那么该类有什么作用呢? 下...

jijs
2017/12/15
0
0
java.lang包源码阅读之一:类目综述以及源码阅读第一个类Boolean

java.lang包下直属类,从Java Platform Standard Edition 7 Documentation中一查便知: 大体上按照上面的分类阅读,估计应该学别人的体例-------关键代码分析,加上编译通过可运行的用例。类...

treenewtreenew
2016/10/24
48
0
你不知道的 equals 和 ==

先来看一道 equals和 == 相关的面试题吧。 先告诉你答案是 true,true,false,true。 i1 == i2 和 i1.equals(i2) 这两个都是 true,大多数人应该可以答对。后面的 i3 == i4 和 i3.equals(i4...

Wizey
08/17
0
0
DbUtils源码阅读一:初识项目

1 项目介绍 DbUtils是一个关于JDBC操作的类库。官网地址 2 项目结构 org.apache.commons.dbutils: |-AbstractQueryRunner: 抽象类 |-AsyncQueryRunner |-QueryRunner |-QueryLoader |-Proxy......

吴下阿吉
2013/02/23
0
2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

[雪峰磁针石博客]软件测试专家工具包1web测试

web测试 本章主要涉及功能测试、自动化测试(参考: 软件自动化测试初学者忠告) 、接口测试(参考:10分钟学会API测试)、跨浏览器测试、可访问性测试和可用性测试的测试工具列表。 安全测试工具...

python测试开发人工智能安全
今天
2
0
JS:异步 - 面试惨案

为什么会写这篇文章,很明显不符合我的性格的东西,原因是前段时间参与了一个面试,对于很多程序员来说,面试时候多么的鸦雀无声,事后心里就有多么的千军万马。去掉最开始毕业干了一年的Jav...

xmqywx
今天
2
0
Win10 64位系统,PHP 扩展 curl插件

执行:1. 拷贝php安装目录下,libeay32.dll、ssleay32.dll 、 libssh2.dll 到 C:\windows\system32 目录。2. 拷贝php/ext目录下, php_curl.dll 到 C:\windows\system32 目录; 3. p...

放飞E梦想O
今天
0
0
谈谈神秘的ES6——(五)解构赋值【对象篇】

上一节课我们了解了有关数组的解构赋值相关内容,这节课,我们接着,来讲讲对象的解构赋值。 解构不仅可以用于数组,还可以用于对象。 let { foo, bar } = { foo: "aaa", bar: "bbb" };fo...

JandenMa
今天
1
0
OSChina 周一乱弹 —— 有人要给本汪介绍妹子啦

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享水木年华的单曲《中学时代》@小小编辑 手机党少年们想听歌,请使劲儿戳(这里) @须臾时光:夏天还在做最后的挣扎,但是晚上...

小小编辑
今天
68
8

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部