string转换成integer的方式及原理

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

string转换成integer的方式及原理

在看面试题的时候看到该问题,当时由于不清楚,
就查看了下源码,下面分下下源码。

1. Integer.parseInt(String str)方法
public static int parseInt(String s) throws NumberFormatException {
        //内部默认调用parseInt(String s, int radix)基数设置为10
        return parseInt(s,10);
    }
2. Integer.parseInt(String s, int radix)方法
public static int parseInt(String s, int radix)
                throws NumberFormatException
    {
        /*
         * WARNING: This method may be invoked early during VM initialization
         * before IntegerCache is initialized. Care must be taken to not use
         * the valueOf method.
         */
        //判断字符是否为null
        if (s == null) {
            throw new NumberFormatException("s == 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");
        }

        int result = 0;
        //是否时负数
        boolean negative = false;
        //char字符数组下标和长度
        int i = 0, len = s.length();
        //限制
        int limit = -Integer.MAX_VALUE;
        int multmin;
        int digit;
        //判断字符长度是否大于0,否则抛出异常
        if (len > 0) {
            //第一个字符是否是符号
            char firstChar = s.charAt(0);
            //根据ascii码表看出加号(43)和负号(45)对应的
            //十进制数小于‘0’(48)的
            if (firstChar < '0') { // Possible leading "+" or "-"
                //是负号
                if (firstChar == '-') {
                    //负号属性设置为true
                    negative = true;
                    limit = Integer.MIN_VALUE;
                }
                //不是负号也不是加号则抛出异常
                else if (firstChar != '+')
                    throw NumberFormatException.forInputString(s);
                //如果有符号(加号或者减号)且字符串长度为1,则抛出异常
                if (len == 1) // Cannot have lone "+" or "-"
                    throw NumberFormatException.forInputString(s);
                i++;
            }
            multmin = limit / radix;
            while (i < len) {
                // Accumulating negatively avoids surprises near MAX_VALUE
                //此方法为确定数字的的十进制值
                digit = Character.digit(s.charAt(i++),radix);
                //小于0,则为非数值字符串
                if (digit < 0) {
                    throw NumberFormatException.forInputString(s);
                }
                //result第一次为0,第一次肯定为true
                if (result < multmin) {
                    throw NumberFormatException.forInputString(s);
                }
                //result乘以基数(10)为得到位置
                //例如第一次的result为-1,第二次乘以10后为-10
                //下面再-=digit(例如:1)则得到-11
                //以此类推
                result *= radix;
                if (result < limit + digit) {
                    throw NumberFormatException.forInputString(s);
                }
                //第一次result为0 -=digit则为负值的该digit
                result -= digit;
            }
        } else {
            throw NumberFormatException.forInputString(s);
        }
        //根据上面得到的是否负数,返回相应的值
        return negative ? result : -result;
    }
3.Character.digit(char ch, int radix)方法
public static int digit(int codePoint, int radix) {
        //基数必须再最大和最小基数之间
        if (radix < MIN_RADIX || radix > MAX_RADIX) {
            return -1;
        }
        if (codePoint < 128) {
            // Optimized for ASCII
            int result = -1;
            //字符在0-9字符之间
            if ('0' <= codePoint && codePoint <= '9') {
                result = codePoint - '0';
            }
            //字符在a-z之间
            else if ('a' <= codePoint && codePoint <= 'z') {
                result = 10 + (codePoint - 'a');
            }
            //字符在A-Z之间
            else if ('A' <= codePoint && codePoint <= 'Z') {
                result = 10 + (codePoint - 'A');
            }
            //通过判断result和基数大小,输出对应值
            //通过我们parseInt对应的基数值为10,
            //所以,只能在第一个判断(字符在0-9字符之间)
            //中得到result值 否则后续程序会抛出异常
            return result < radix ? result : -1;
        }
        return digitImpl(codePoint, radix);
    }

总结:integer.parseInt(string str)方法调用Integer内部的
parseInt(string str,10)方法,默认基数为10,parseInt内部首先
判断字符串是否包含符号(-或者+),则对相应的negative和limit进行
赋值,然后再循环字符串,对单个char进行数值计算Character.digit(char ch, int radix)
在这个方法中,函数肯定进入到0-9字符的判断(相对于string转换到int),
否则会抛出异常,数字就是如上面进行拼接然后生成的int类型数值。

面试 | String 转换成 Integer方式原理 大体思路: 示例,调用Integer类的parseInt()方法; public static void method() { String str = "-255"; Integer num = Integer.parseInt(str); System.out.println(num); } 默认十进制,也可以手动传其他进制来规定要把str字符串转换成什么进制的数字; public s... 阅读详情

相关推荐

Java中string 转换成 integer方式原理

1 Integer.parseInt(String str)方法 public static int parseInt(String s) throws NumberFormatException { //内部默认调用parseInt(String s, int radix)基数设置为10 return parseInt(s,10); } 2 Int...

weixin_38576356的博客 8281

Java的string 转换成 integer方式原理

方法接受一个字符串参数,并尝试将其解析为整数。如果字符串可以成功解析为整数,则返回解析后的整数值。如果无法解析为整数,则会抛出。该方法的原理是遍历字符串中的每个字符,并将其换为对应的数字。方法将字符串"123"解析为整数123,并将其赋值给变量。在Java中,可以使用。方法将字符串换为整数。

qq_38366111的博客 2373

Java 中 String Integer 的方法与底层原理详解

考点解答parseInt和valueOf的区别?一个返回int,一个返回Integer,后者有装箱过程哪个方法更推荐?valueOf推荐用于对象封装,parseInt更轻量用于原始类型有缓存机制吗?✅ 有,范围是为什么 new Integer() 不推荐?每次都会创建新对象,浪费内存,不走缓存池。

m0_73748193的博客 3653

string中的数字提取出来并且化为Integer类型

这个题目好像不是我该记录的霍,哈哈哈,因为实在是太基础了,应该说是初学者的小练习,今天有朋友请教我 所以我就写出来 记录一下 希望可以帮助到更多学习编程的小伙伴,题目是这样的: 将一个字符串string中的数字提取出来化为Integer 例如1:输入12a,输出12 例如2:输入1a2b3c,输出123 思路:将字符串为char类型的数组,用正则表达式去判断每个下标对应的字符是不是数字 如果是数字就拼接,最后化返回。 代码: /** * @author: shenw...

gloamer的博客 1427

string 转换成 integer方式原理

1.Integer.parseInt(String str)方法 public static int parseInt(String s) throws NumberFormatException { //内部默认调用parseInt(String s, int radix)基数设置为10 return parseInt(s,10); } 2.Inte...

suncat的博客 2988

java stringinteger_java-string转换成integer方式原理

1 Integer.parseInt(String str)方法public static int parseInt(String s) throws NumberFormatException {//内部默认调用parseInt(String s, int radix)基数设置为10return parseInt(s,10);}2 Integer.parseInt(String s, int r...

weixin_39759107的博客 1504

String 转换成Integer方式原理

1)parseInt(String s)内部调用parseInt(s, 10)默认为10 进制。 2)正常判断null\进制范围,length 等。 3)判断第一个字符是否是符号位。 4)循环遍历确定每个字符的十进制值。 5)通过*=和-=进行计算拼接。 6)判断是否为负值返回结果。 ...

siyuanwai的博客 1609

java面试-基础

1、java中==和equals和hashCode的区别 = =: 是运算符,用于比较两个变量是否相等 equals: 是Objec类的方法,用于比较两个对象是否相等,默认Object类的equals方法是比较两个对象的地址,跟= =的结果一样 hashCode: Object类的本地方法,返回对象的内存地址处理后的结构。 2、int与integer的区别 1、int是基本数据类型。intege...

weixin_44863780的博客 233

String转换成Integer源码分析

我们经常为用到Integer.valueOf(String str)这个方法,如果字符串格式不对,这个方法会抛出一个系统异常NumberFormatException这里我们就要分析一下这个方法,其中Byte,Short也是调用了Ingeter中的方法.在Integer类中的定义如下:public static Integer valueOf(String s) throws NumberForm

treeroot的专栏 5727

Java中StringInteger的互换方法及原理

StringInteger 调用方法 调用Integer.parseInt(String s) 方法 调用Integer.valueOf(String s) 方法 这两种方法,不管是哪种方法,其内部最终还是会调用parseInt(String s, int radix)这个方法,这里的radix 是想转换成多少进制的一个参数,范围是[2,36] 最终调用的parseInt(String s, int radix)的源码如下: public static int parseInt(Strin

qq_44840148的博客 1327

关于Integer、 int、 String 的比较判别

当int 和Integer 数据类型进行比较时Integer会进行自动拆箱操作,所以只会比较实际的值 Integer是int的封装类,一般来说基础变量(int)赋值给Integer对象将自动装箱(Auto Boxing)并为Integer对象分配堆空间 String 的机制是String s="hello" 创建对象时同样是现在常量池中找,若没有就创建,若有则返回地址引用

ZM1984L的博客 867

Integer不能强制换为String:toString()、(String)和String.valueOf()的区别

问题出现的起因:Object x = new Integer(0); System.out.println((String)x);如上代码编译时无错误,运行时报错: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.StringtoString()、(String)和String.valueOf(

文景大大 1万+

String,Integer,int类型之间换总结

今天学习了封装的知识理念,关于自动装箱和拆箱等手段来改变数据类型感到十分有意思,同时之间的相互换也值得我们去牢记,当然,在工作中熟能生巧,只是为了梳理一下知识点,供大家参考: 自java7以后已经实现了自动装箱和自动拆箱,int和Integer之间的换已经可以实现自动 下面是实际的操作代码 复制代码 1 public class Integer04{ 2 public static ...

qq_43338895的博客 255

Integer 和int区别 String和new String()

本文就java语言来讲,探讨一下项目中遇到的坑,以及如何避免这个问题。 首先说一下我遇到的坑,我用Integer进行比较,且比较符号为 =,然后我就debug,找半天最后发现这个问题。 那为什么Integer不能用等于号呢?首先先得说一下装箱和拆箱。 装箱 int 这种基本类型Integer对象,可以通过如下代码换 // 显式换 int a=7; Integer aNum = Integer.valueOf(a); // 隐式Integer b=7; 拆箱 Integer对象转换成

miss_na的博客 320

包装类(Integer、装箱与拆箱、String、int、Integer类型互换)

文章目录包装类 包装类 java中为8种基本数据类型对应准备了8种包装类型。8种包装类型属于引用类型,父类是Object。

大白的成长之路 1248

Java—String.valueof()和Integer.toString()的不同

引言平常经常使用这两个方法进行int类型String,一般情况也不区分,今天就深究一下,它们的区别,平常应该使用那个方法更好一些。Integer.toString()方法作用:该方法返回指定整数的有符号位的String对象,以10进制字符串形式返回。内部实现:public static String toString(int i) { if (i == Integer.MIN_VALUE)

Just Do It 2万+

教拉克丝去面试(一),String转换成int的几种方式

这是一篇用趣味化的形式给大家来讲java面试, “语不惊人死不休”,没错,本篇文章的标题就是这么酷炫,接受不了的同学就别点进来看了,所谓好奇心害死猫;能够接受的同学我只能说你赚到了,你不仅能在阅读的过程中感受到维的乐思趣,还真的能学习到知识。 拉克丝 : 老哥, 我今天去面试,他问了我一个问题 我现在有点疑惑? 怎么,面试的不顺利? 我说: 拉克丝: 很顺利的,但是他问我一个感觉特别简单的问题,我当时感觉说出来了,又感觉说错了 我有点疑惑地问: 来给你哥说说什么问题?老哥来给你解答 拉克..

NULL 881

Integer. valueOf()的使用

1.Integer. valueOf()方法的作用 Integer. valueOf()可以将基本类型int换为包装类型Integer,或者将String转换成IntegerString如果为Null或“”都会报错 2.Integer. valueOf()是高效的 public static Integer valueOf(int i) { if (...

最后的武艺集大成者 10万+

c++将int转换成string_Integer与int的区别 (== 与 equal)

Integer与int的区别 (== 与 equal)先来看下Java中的8种基本类型和3种引用数据类型8种基本数据类型:boolean byte int char long short float double3种引用数据类型: 类 数组 接口Java是面向对象的编程式语言,主要用类来表达,但是,为了方面,要用到基本数据类型。但是,最终的实现还是要依靠类来实现的。说白了Integer就是int的...

weixin_39977276的博客 453
上一篇: 记录破解被保护的Excel表
下一篇: cocos2dx3.17的csb文件使用方法
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值