JDK-Integer源码解读

  • 通过类的定义可以看出
    public final class Integer extends Number implements Comparable<Integer>
    • 不能被继承
    • 实现Comparable接口,用compareTo进行比较并且Integer对象只能和Integer类型的对象进行比较,不能和其他类型比较
    • 继承了Number类,所以该类可以调用longValue、floatValue、doubleValue等系列方法返回对应的类型的值
    • 属性
    • 私有属性
      • value
      • serialVersionUID
    • 公有属性
      • publis static fianl 可以直接使用
    • 方法
    • 当Integer被加载时,就新建了-128到127的所有数字并存放在Integer数组cache中
    • 当调用valueOf方法(包括后面会提到的重载的参数类型包含String的valueOf方法)时,如果参数的值在-127到128之间,则直接从缓存中返回一个已经存在的对象。如果参数的值不在这个范围内,则new一个Integer对象返回
    • String->int调用栈
      • getInteger(String nm) ---> getInteger(nm, null);--->Integer.decode()--->Integer.valueOf()--->parseInt()
    • getInteger
      • 获取确定具有指定名称的系统属性的整数值
    • decode
      • 该方法的作用是将 String 解码为 Integer。接受十进制、十六进制和八进制数字
      • 根据要解码的 String(mn)的形式转成不同进制的数字。 mn由三部分组成:符号、基数说明符和字符序列。 —0X123中-是符号位,0X是基数说明符(0表示八进制,0x,0X,#表示十六进制,什么都不写则表示十进制),123是数字字符序列。
    • 总结
      • parseInt方法返回的是基本类型int
      • 其他的方法返回的是Integer
      • valueOf(String)方法会调用valueOf(int)方法。借助缓存
      • 如果需要一个对象,那么建议使用valueOf(),因为该方法可以借助缓存带来的好处。
      • 如果和进制有关,那么就是用decode方法。
      • 如果是从系统配置中取值,那么就是用getInteger
    • int转为String
      • toString()
      • 局部性原理之空间局部性:sizeTable为数组,存储在相邻的位置,cpu一次加载一个块数据数据到cache中(多个数组数据),此后访问sizeTable 不需要访问内存。
      • 基于范围的查找,是很实用的设计技术
      • 移位的效率比直接乘除的效率要高
      • 乘法的效率比除法的效率要高
    • compareTo
      • return (x < y) ? -1 : ((x == y) ? 0 : 1);
    • 参考文章
    • jdk-Integer
    • java成神之路-Integer源码

猜你喜欢

转载自blog.csdn.net/sinat_32197439/article/details/78988898