一个String类型转换成Int类型的过程

平常使用Integer.ValueOf(String str)转换成Int类型的时候,都没注意是怎么转换的,今天就来研究一下。
最好别用ValueOf将String转换Int。可以使用Inetger.parseInt();

  public static void main(String[] args) {
        String in  = "1100";
        System.out.println(Integer.valueOf(in) == Integer.valueOf(in) );
        System.out.println(Integer.parseInt(in) == Integer.parseInt(in) );
         in  = "100";
        System.out.println(Integer.valueOf(in) == Integer.valueOf(in) );
        System.out.println(Integer.parseInt(in) == Integer.parseInt(in) );
    }
----------------------------------------------------------
false
true
true
true 

使用valueOf解析-128到127之前的值时,是使用IntegerCache中的数值。
超过了127将会生成2个不同但是值相同的对象。使用==比较返回false。
使用Integer.valueof()。调用会直接调用Integer.parseInt()方法处理的,然后再使用Integer.valueof()处理。

下面是Integer.parseInt();的解析过程

 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.
         */
        /**
         * 将String串转换成Int最好不用Integer.valueOf() 在java1.5之前并没有做int与Integer的自动解包装。
         * 所以使用valueof解析数值在-128与127之间的数据使用 == 是相等的,数值超过127 就是不相等
         * 他们生成相同的对象,这个对象是存在IntegerCache中 
         * 
         * 如果使用parseInt都会解析成为同一个对象可以使用==比较
         */
        
        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");
        }
        
        int result = 0;
        //设置个标记位 转换算法使用的是与Integer.MIN_VALUE与MAX_VALUE比较大小判断是否溢出
        // negative 为true是为负数 在返回的时候做判断
        boolean negative = false;
        //i 用于表示字符的位数
        int i = 0, len = s.length();
        //极限值用于判断是否溢出
        int limit = -Integer.MAX_VALUE;
        int multmin;
        int digit;
        if (len > 0) {
            // 第一个字符判断 是否符合要求 0 - + 
            char firstChar = s.charAt(0);
            // Possible leading "+" or "-"
            if (firstChar < '0') { 
                if (firstChar == '-') {
                    //标记位该数值为负数
                    negative = true;
                    //负数与
                    limit = Integer.MIN_VALUE;
                    // 如果不是 ‘+’ 抛出转换错误
                } else if (firstChar != '+')
                    throw new NumberFormatException(s);
                // 就一个符号转换失败
                if (len == 1) // Cannot have lone "+" or "-"
                    throw new NumberFormatException(s);
                //字符位后移
                i++;
            }
            //已经判断了一个字符了所以最大值/最小值也要减小一位
            multmin = limit / radix;
            while (i < len) {
                // 依次获取字符转换为int类型
                //Character.digit(),将对应的字符的ASCII转换为radix进制,如果转换失败将返回-1
                // Accumulating negatively avoids surprises near MAX_VALUE
                digit = Character.digit(s.charAt(i++),radix);
                //-1说明字符串格式错误
                if (digit < 0) {
                    throw new NumberFormatException(s);
                }
                // 判断是否溢出
                if (result < multmin) {
                    throw new NumberFormatException(s);
                }
                result *= radix;
                //对当前的数值进行溢出判断 是对负数的溢出处理
                if (result < limit + digit) {
                    throw new NumberFormatException(s);
                }
                // 用负值去做加法 0 -1=-1;-1 -4=-5 .....
                result -= digit;
            }
        } else {
            throw new NumberFormatException(s);
        }
        //前面的标记位用于处理数值的正负 
        return negative ? result : -result;
    }

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值