JDK源码(10)-Integer(用处最多,重点讲解)

简介: JDK源码(10)-Integer(用处最多,重点讲解)

一、概述

Integer是对基本数据类型int的一个包装,类定义如下:

public final class Integer extends Number implements Comparable<Integer>

image.gif

通过属性MAX_VALUEMIN_VALUE定义了范围是:-2^31到2^31 -1.。

二、主要方法

1.toString(int i, int radix)

第二个参数的进制,默认是10进制,进制的范围是2-36进制之间,如果传入的参数超出范围,就设置为10进制。

2.toUnsignedString(int i, int radix)

无符号的字符串,调用了Long的toUnsignedString方法来实现。

3.toHexString、toOctalString、toBinaryString

无符号的2/8/16进制数,如果参数为负,则无符号整数值为参数加2^32。都是调用Integer的私有方法toUnsignedString0和方法formatUnsignedInt来实现的,方法如下:

private static String toUnsignedString0(int val, int shift) {
        // assert shift > 0 && shift <=5 : "Illegal shift value";
        int mag = Integer.SIZE - Integer.numberOfLeadingZeros(val);
        int chars = Math.max(((mag + (shift - 1)) / shift), 1);
        char[] buf = new char[chars];
        formatUnsignedInt(val, shift, buf, 0, chars);
        // Use special constructor which takes over "buf".
        return new String(buf, true);
    }

image.gif

4.parseInt(String s, int radix)、parseInt(String s)

将一个字符串转换为int类型,传入正数负数都可以进行转换,radix不传默认是10进制。

5.hashCode:就是本身

6.public static Integer decode(String nm)

String解码为Integer 。 接受以下语法给出的十进制,十六进制和八进制数:

    • DecimalNumeral
    • 0xHexDigits
    • 0XHexDigits
    • #HexDigits
    • 0OctalDigits
    • -
    • +
    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.
                String constant = negative ? ("-" + nm.substring(index))
                                           : nm.substring(index);
                result = Integer.valueOf(constant, radix);
            }
            return result;
        }

    image.gif

    7.divideUnsigned、remainderUnsigned

    无符号商、无符号余数

    8.highestOneBit、lowestOneBit

    这个函数调用。使用的第一感觉就是这个函数是干什么用的,通过查看文档得知,这个函数的作用是取 i 这个数的二进制形式最左边的最高一位且高位后面全部补零,最后返回int型的结果。

    用人话说:返回最高位为1, 其它位为0的数

      • 如果一个数是0, 则返回0;
      • 如果是负数, 则返回 -2147483648:【1000,0000,0000,0000,0000,0000,0000,0000】(二進制表示的數);
      • 如果是正数, 返回的则是跟它最靠近的比它小的2的N次方

      比如 17:

      二进制是【0000,0000,0000,0000,0000,0000,0001,0001】

      highestOneBit(17)返回的是最高位的1个1, 其它全是0 的二进制數:【0000,0000,0000,0000,0000,0000,0001,0000】,其实就是16。

      三、特殊之处

      1.静态私有类private static class IntegerCache

      -128到127之间的会被缓存,高值可以通过JVM参数java.lang.Integer.IntegerCache.high进行设置。

      相关文章
      |
      4天前
      |
      安全 前端开发 Java
      JDK源码级别彻底剖析JVM类加载机制
      JDK源码级别彻底剖析JVM类加载机制
      |
      4天前
      |
      缓存 Dubbo Java
      趁同事上厕所的时间,看完了 Dubbo SPI 的源码,瞬间觉得 JDK SPI 不香了
      趁同事上厕所的时间,看完了 Dubbo SPI 的源码,瞬间觉得 JDK SPI 不香了
      |
      8月前
      |
      Java 容器
      阿里内部流传的JDK源码剖析手册!GitHub已获上千万的访问量
      相信现在已经有很多小伙伴知道了“微软”要对JDK下手了! JDK是什么? jdk是Java语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。jdk是整个java开发的核心,它包含了JAVA的运行环境和JAVA工具。相对而言,没有jdk的话,无法编译Java程序(指java源码.java文件),如果想只运行Java程序(指class或jar或其它归档文件),要确保已安装相应的JRE。
      208 0
      |
      4天前
      |
      缓存 Java Spring
      Spring 源码阅读 66:基于 JDK 的 AOP 代理如何获取拦截器链(4)- 将 Advice 封装为拦截器
      【1月更文挑战第1天】本文分析了 Advice 被封装成 MethodInterceptor 的过程,Spring AOP 用到的五种 Advice 中,有些本身就是 MethodInterceptor 的实现类,而有些需要通过适配器的封装。
      44 0
      |
      8月前
      |
      设计模式 Java 程序员
      太爆了!阿里最新出品2023版JDK源码学习指南,Github三天已万赞
      最近后台收到很多粉丝私信,说的是程序员究竟要不要去读源码?当下行情,面试什么样的薪资/岗位才会被问到源码? 对此,我的回答是:一定要去读,并且要提到日程上来! 据不完全统计,现在市面上不管是初级,中级,还是高级岗,面试的时候都有可能会问到源码中的问题,它已经成为程序员常规必备的一个技术点。如果你当下想通过一个面试,或者想把中级薪资要到相对于比较高的话,源码这块就必须要会。
      100 0
      |
      4天前
      |
      算法 Java 索引
      【数据结构与算法】4、双向链表(学习 jdk 的 LinkedList 部分源码)
      【数据结构与算法】4、双向链表(学习 jdk 的 LinkedList 部分源码)
      35 0
      |
      4天前
      |
      设计模式 Java
      根据JDK源码Calendar来看工厂模式和建造者模式
      根据JDK源码Calendar来看工厂模式和建造者模式
      |
      4天前
      |
      Java Linux iOS开发
      Spring5源码(27)-静态代理模式和JDK、CGLIB动态代理
      Spring5源码(27)-静态代理模式和JDK、CGLIB动态代理
      24 0
      |
      4天前
      |
      XML Java 数据格式
      Spring 源码阅读 70:基于 JDK 的 AOP 代理拦截器链执行(4)- 容易被忽略的 ExposeInvocationInterceptor
      【1月更文挑战第5天】本文分析了 Spring AOP 拦截器链中的一个特殊拦截器 ExposeInvocationInterceptor 的注册的时机以及它的作用。至此,基于 JDK 的 AOP 代理拦截器链执行的逻辑就分析完了。
      450 0
      |
      4天前
      |
      Java 索引 Spring
      Spring 源码阅读 69:基于 JDK 的 AOP 代理拦截器链执行(3)- MethodInterceptor 分析
      【1月更文挑战第4天】本文详细分析了 Spring AOP 中五种增强类型对应的拦截器中增强方法的执行逻辑,结合上一篇中分析的 ReflectiveMethodInvocation 中proceed方法的执行逻辑,就组成了完整的拦截器链递归调用的逻辑。
      35 0