文档章节

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);
    }
}


© 著作权归作者所有

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

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

夏夜流星
2013/12/29
0
0
JAVA NIO 编程入门(三)

一、前期回顾 上一篇文章JAVA NIO 编程入门(二)学习了NIO的聚集和分散,以及选择器的使用,并通过一个小demo进行实战,演示了如何进行分散和聚集,以及其主要使用场景,本文将是NIO编程入门...

木木匠
09/16
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
07《Java核心技术》之int和Integer有什么区别?

一、提出问题 Java 虽然号称是面向对象的语言,但是原始数据类型仍然是重要的组成元素,所以在面试中,经常考察原始数据类型和包装类等 Java 语言特性。 今天我们要讨论的问题是,int 和 In...

飞鱼说编程
10/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

rabbitmq学习(一)

RabbitMQ是目前非常热门的一款消息中间件,具有高可靠、易拓展、高可用及丰富的功能 1.什么是消息中间件 消息是指在应用间传送的数据。包含文本字符串、JSON、内嵌对象 消息队列中间件(消息...

hensemlee
21分钟前
1
0
学习设计模式——原型模式

1. 认识原型模式 1. 定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。 2. 结构: Prototype:声明一个克隆自身的接口,用来约束想要克隆自己的具体实现类,要求这些类...

江左煤郎
27分钟前
1
0
观察者模式

观察者模式的套路 有如下角色: 事件,比如修改,用户点击; 事件队列,触发事件之后,会把事件一个一个放入事件队列 监听器,采用某种方式(一般是轮询,或者io阻塞机制),来判断事件队列是否有新的未...

黄威
30分钟前
1
0
线程安全策略

四个线程安全策略 线程限制: 一个被线程限制的对象,由线程独占,并且只能被占有它的线程修改 共享只读: 一个共享只读的对象,在没有额外同步的情况下,可以被多个线程并发访问,但是任何线...

Ala6
37分钟前
2
0
Dubbo (三)源码分析 —— 架构原理

1 核心功能 首先要了解Dubbo提供的三大核心功能: Remoting:远程通讯 提供对多种NIO框架抽象封装,包括“同步转异步”和“请求-响应”模式的信息交换方式。 Cluster: 服务框架 提供基于接口方...

小刀爱编程
38分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部