Integer类【JDK源码分析】

简介: Integer类【JDK源码分析】

前言

2023-10-9 14:29:39

以下内容源自《【JDK源码分析】》

仅供学习交流使用

推荐

Integer类【JDK源码分析】

Integer类

parseInt()

测试代码

源码分析在Solution类中

其巧妙之处在于:

使用负数保存运算结果:

// Accumulating negatively avoids surprises near MAX_VALUE
负积累可避免在MAX_VALUE附近出现意外
int result=0;
result -= digit;

预先判断1

if (result < multmin) {//保证不能 <-214748364 ,否则*radix之后必然越界
  throw forInputString(s);
}
result *= radix;

预先判断2

if (result < limit + digit) {//保证不能result-digit<limit,否则-digit;之后必然越界
  throw forInputString(s);
}
result -= digit;//这里是负数保存

测试代码

package testlang;
public class TestInteger1 {
    public static void main(String[] args) {
        int max=Integer.MAX_VALUE;//2147483647
        int min=Integer.MIN_VALUE;//-2147483648
        try {
            String minS="-2147483649";
            int m = Integer.parseInt(minS);
            System.out.println(m);
        } catch (NumberFormatException e) {
            e.printStackTrace();
        }
        try {
            String maxS="2147483648";
            int n = Integer.parseInt(maxS);
            System.out.println(n);
        } catch (NumberFormatException e) {
            e.printStackTrace();
        }
    }
    static class Solution{
        public static int parseInt(String s) throws NumberFormatException {
            return parseInt(s,10);
        }
        public static int parseInt(String s, int radix)
                throws NumberFormatException
        {
            if (s == null) {
                throw new NumberFormatException("null");
            }
            if (radix < Character.MIN_RADIX) {
                throw new NumberFormatException("radix " + radix +
                        " less than Character.MIN_RADIX");
            }
            if (radix > Character.MAX_RADIX) {
                throw new NumberFormatException("radix " + radix +
                        " greater than Character.MAX_RADIX");
            }
            //result是按照负数来处理结果的
            //result -= digit;
            int result = 0;
            boolean negative = false;
            int i = 0, len = s.length();
            int limit = -Integer.MAX_VALUE;//-2147483647
            int multmin;
            int digit;
            if (len > 0) {
                char firstChar = s.charAt(0);
                if (firstChar < '0') { // Possible leading "+" or "-"
                    if (firstChar == '-') {
                        negative = true;
                        limit = Integer.MIN_VALUE;//-2147483648
                    } else if (firstChar != '+')
                        throw forInputString(s);
                    if (len == 1) // Cannot have lone "+" or "-"
                        throw forInputString(s);
                    i++;
                }
                multmin = limit / radix;//-214748364
                while (i < len) {
                    // Accumulating negatively avoids surprises near MAX_VALUE
                    digit = Character.digit(s.charAt(i++),radix);
                    if (digit < 0) {
                        throw forInputString(s);
                    }
                    if (result < multmin) {//保证不能 <-214748364 ,否则*radix之后必然越界
                        throw forInputString(s);
                    }
                    result *= radix;
                    if (result < limit + digit) {//保证不能result-digit<limit,否则-digit;之后必然越界
                        throw forInputString(s);
                    }
                    result -= digit;//这里是负数保存
                }
            } else {
                throw forInputString(s);
            }
            return negative ? result : -result;
        }
        //NumberFormatException.forInputString()
        static NumberFormatException forInputString(String s) {
            return new NumberFormatException("For input string: \"" + s + "\"");
        }
    }
}

parseByte()

源码是调用parseInt()之后判断是否溢出

可以借鉴parseInt()来自己实现此代码

代码

package testlang;
public class TestByte {
    public static void main(String[] args) {
        try {
            String str="-129";
            byte b = parseByte(str);
            System.out.println(b);
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            String str="+128";
            byte b = parseByte(str);
            System.out.println(b);
        } catch (Exception e) {
            e.printStackTrace();
        }
        String str="+127";
        byte b = parseByte(str);
        System.out.println(b);
        str="-128";
        b = parseByte(str);
        System.out.println(b);
    }
    public static byte parseByte(String s){
        int radix=10;
        if (s==null){
            throw new NumberFormatException("null");
        }
        byte result=0;//结果按负数保存
        boolean negative = false;
        int i = 0, len = s.length();
        int limit = -Byte.MAX_VALUE;//-127
        int multmin;
        int digit;
        if (len>0){
            char firstChar=s.charAt(0);
            if (firstChar<'0'){
                if (firstChar=='-'){
                    negative=true;
                    limit=Byte.MIN_VALUE;
                }else if (firstChar!='+'){//非法的符号
                    throw forInputString(s);
                }
                if (len==1){//不能只包含符号
                    throw forInputString(s);
                }
                i++;
            }
            multmin=limit/radix;
            while (i<len){
                digit=Character.digit(s.charAt(i++),radix);
                if (digit<0){
                    throw forInputString(s);
                }
                if (result<multmin){
                    throw forInputString(s);
                }
                result*=radix;
                if (result<limit+digit){
                    throw forInputString(s);
                }
                result-=digit;
            }
            return negative?result: (byte) -result;
        }else {
            throw forInputString(s);
        }
    }
    static NumberFormatException forInputString(String s) {
        return new NumberFormatException("For input string: \"" + s + "\"");
    }
}

最后

2023-10-9 14:38:43

我们都有光明的未来

祝大家考研上岸

祝大家工作顺利

祝大家得偿所愿

祝大家如愿以偿

点赞收藏关注哦

相关文章
|
3月前
|
Java Linux
java基础(3)安装好JDK后使用javac.exe编译java文件、java.exe运行编译好的类
本文介绍了如何在安装JDK后使用`javac.exe`编译Java文件,以及使用`java.exe`运行编译好的类文件。涵盖了JDK的安装、环境变量配置、编写Java程序、使用命令行编译和运行程序的步骤,并提供了解决中文乱码的方法。
77 2
|
2月前
|
Java
Java基础之 JDK8 HashMap 源码分析(中间写出与JDK7的区别)
这篇文章详细分析了Java中HashMap的源码,包括JDK8与JDK7的区别、构造函数、put和get方法的实现,以及位运算法的应用,并讨论了JDK8中的优化,如链表转红黑树的阈值和扩容机制。
35 1
|
3月前
|
Java API 开发者
【Java字节码操控新篇章】JDK 22类文件API预览:解锁Java底层的无限可能!
【9月更文挑战第6天】JDK 22的类文件API为Java开发者们打开了一扇通往Java底层世界的大门。通过这个API,我们可以更加深入地理解Java程序的工作原理,实现更加灵活和强大的功能。虽然目前它还处于预览版阶段,但我们已经可以预见其在未来Java开发中的重要地位。让我们共同期待Java字节码操控新篇章的到来!
|
3月前
|
Java API 开发者
【Java字节码的掌控者】JDK 22类文件API:解锁Java深层次的奥秘,赋能开发者无限可能!
【9月更文挑战第8天】JDK 22类文件API的引入,为Java开发者们打开了一扇通往Java字节码操控新世界的大门。通过这个API,我们可以更加深入地理解Java程序的底层行为,实现更加高效、可靠和创新的Java应用。虽然目前它还处于预览版阶段,但我们已经可以预见其在未来Java开发中的重要地位。让我们共同期待Java字节码操控新篇章的到来,并积极探索类文件API带来的无限可能!
|
4月前
|
存储 Java
【Java集合类面试七】、 JDK7和JDK8中的HashMap有什么区别?
JDK7中的HashMap使用数组加链表解决冲突,而JDK8增加了红黑树结构以优化链表过长时的性能,提高查找效率。
|
4月前
|
Oracle 安全 Java
JDK8到JDK28版本升级的新特性问题之在Java 15及以后的版本中,密封类和密封接口是怎么工作的
JDK8到JDK28版本升级的新特性问题之在Java 15及以后的版本中,密封类和密封接口是怎么工作的
|
4月前
|
Java 编译器 API
JDK版本特性问题之在 JDK 17 中,想声明一个密封类,如何解决
JDK版本特性问题之在 JDK 17 中,想声明一个密封类,如何解决
|
4月前
|
Java API
JDK版本特性问题之Hidden Classes(隐藏类)在 JDK 15 中有何用途,如何实现
JDK版本特性问题之Hidden Classes(隐藏类)在 JDK 15 中有何用途,如何实现
|
3月前
|
Java
安装JDK18没有JRE环境的解决办法
安装JDK18没有JRE环境的解决办法
378 3
|
4月前
|
Java 关系型数据库 MySQL
"解锁Java Web传奇之旅:从JDK1.8到Tomcat,再到MariaDB,一场跨越数据库的冒险安装盛宴,挑战你的技术极限!"
【8月更文挑战第19天】在Linux上搭建Java Web应用环境,需安装JDK 1.8、Tomcat及MariaDB。本指南详述了使用apt-get安装OpenJDK 1.8的方法,并验证其版本。接着下载与解压Tomcat至`/usr/local/`目录,并启动服务。最后,通过apt-get安装MariaDB,设置基本安全配置。完成这些步骤后,即可验证各组件的状态,为部署Java Web应用打下基础。
64 1