JDK源码笔记01 Integer

something before start

写这个系列博客主要的目的是记录一下学习JDK的过程,一方面方便后面使用,另一方面则是避免草草过去。代码版本是jdk14
顺序大概是:包装类--字符串--集合类--juc并发包--io--网络编程--注解--stream--类加载--反射--文件操作处理类

方法以及子类概览

构造函数

public Integer(int value) //不建议使用,建议使用valueOf
public Integer(String s) //不建议使用,建议使用valueOf

输出字符串

有一些内容比较少的直接在这里用注释说明了:D

toString(int i) 十进制的toString,一次处理两位,相对toString(int i, int radix)性能更好一点点吧,少做了一些除法
toString(int i, int radix)
toStringUTF16(int i, int radix)
toUnsignedString(int i, int radix) 里面调用了Long的方法
toUnsignedString0(int i, int shift) shift是代表radix = 2^shift, 取值(0,5]
toHexString(int i) 返回无符号16进制字符串,里面调用了toUnsignedString0
toOctalString(int i)返回无符号8进制字符串
toBinaryString(int i)返回无符号2进制字符串

getChars(int i, int index, byte[] buf) index就是size,该方法将十进制转换成字节数组存入buf,返回开始位置

解析字符串

public static int parseInt(CharSequence s, int beginIndex, int endIndex, int radix)
public static int parseInt(String s, int radix)
public static int parseInt(String s) //十进制

public static int parseUnsignedInt(String s, int radix) 
public static int parseUnsignedInt(CharSequence s, int beginIndex, int endIndex, int radix)

public static Integer valueOf(int i) 
public static Integer valueOf(String s)  //调用parseInt之后传入valueOf(int i) 
public static Integer valueOf(String s, int radix) //同上

杂七杂八函数

  1. hash和equal
哈希值就是value
public static int hashCode(int value) {
       return value;
   }
equal 就是比较value
public boolean equals(Object obj) {
    if (obj instanceof Integer) {
        return value == ((Integer)obj).intValue();
    }
    return false;
}
  1. getInteger
//获取系统的参数,nm即参数名称,空则返回val
//内部调用了System.getProperty(nm),如果存在,则调用decode转换成Integer返回
public static Integer getInteger(String nm, Integer val)
  1. decode
    将字符串转换成Integer,支持十进制,八进制,十六进制
    十六进制:0x 0X #
    八进制:0
    加减号:+ -
public static Integer decode(String nm)
//1 取出正负号
//2 通过枚举判断出是什么进制的字符串,通过valueOf获得相应的值
//3 数字和字母部分最终通过parseInt得到
//4 把正负号放回到数字里
  1. compare
    compare
compare(int x, int y) {
        return (x < y) ? -1 : ((x == y) ? 0 : 1);
}
  1. compareUnsigned
return compare(x + MIN_VALUE, y + MIN_VALUE);
  1. highestOneBit(int i) 取出最高位
  2. lowestOneBit(int i) return i & -i; 很妙
  3. bitCount(int i) 获取1的数目,用的是分治策略 很美,可以参照这个博客 理解一下
    public static int bitCount(int i) {
        // HD, Figure 5-2
        i = i - ((i >>> 1) & 0x55555555);
        i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
        i = (i + (i >>> 4)) & 0x0f0f0f0f;
        i = i + (i >>> 8);
        i = i + (i >>> 16);
        return i & 0x3f;
    }
  1. rotateLeft(int i, int distance) 向左边循环
  2. rotateRight
  3. reverse 每位都翻转,也是分治策略 很美:D
  4. reverseBytes 翻转字符
  5. signum 取出符号,返回1 或 -1

方法详解

输出字符串

toString(int i, int radix)

签名public static String toString(int i, int radix)
功能:返回radix进制的字符串
参数
i:十进制正整数
radix:基数,若要转换成16进制则为16
问题
1. 明明用正数一样可以实现,为什么要转换成负数?
因为补码里负数多一位,如果改成正数会有bug
2. 我实现的时候发现StringLatin1这个类用不了,为什么?
傻了,因为他不是public

上一篇:C#实现进制转换(2-64)


下一篇:小程序之页面跳转传递参数问题