Java中Integer.parse()的学习总结

内部使用负数表示

当函数还未考虑到符号影响时候,内部是用负数来表示逐步转换的结果。

初看到下面两句,很是疑惑。

int max = Integer.MIN_VALUE / radix;
int next = result * radix - digit;

为什么要用负数来表示呢?正数才比较符号平常头脑的思路。

我的想法是,负数部分是0~-2147483648,而正数部分是0~2147483647,负数范围比正数范围广。如果内部是用正数的话,"-2147483648"这个字符串处理就更复杂点,因为正数没法表示2147483648。

其他的理解放在下面代码注释中:

    private static int parse(String string, int offset, int radix, boolean negative) throws NumberFormatException {
    	// Why is Integer.MIN_VALUE is choosed? Not Integer.MAX_VALUE ?
    	// Maybe because the range in the minus side is greater than that in the plus side
        int max = Integer.MIN_VALUE / radix;
        int result = 0;
        int length = string.length();
        while (offset < length) {
            int digit = Character.digit(string.charAt(offset++), radix);
            if (digit == -1) {
                throw invalidInt(string);
            }
            //如果此时的result的绝对值已经大于max的绝对值,那么result再增加一位必超出范围。
            //int max = Integer.MIN_VALUE / radix; 这是max定义。
            if (max > result) {
                throw invalidInt(string);
            }
            int next = result * radix - digit;
            //可能出现overflow的现象。
            //如:如果radix为10,上面result等于-214748364,又digit大于8,则next会超出范围。
            if (next > result) {
                throw invalidInt(string);
            }
            result = next;
        }
        if (!negative) {
            result = -result;
            // when result equals to 80000000H, -result equals to result.
            if (result < 0) {
                throw invalidInt(string);
            }
        }
        return result;
    }
时间: 2024-08-27 10:30:48

Java中Integer.parse()的学习总结的相关文章

java中Integer包装类的详细讲解(java二进制操作,所有进制转换)

程序员都很懒,你懂的! 今天为大家分享的是Integer这个包装类.在现实开发中,我们往往需要操作Integer,或者各种进制的转换等等.我今天就为大家详细讲解一下Integer的使用吧.看代码: package com.herman.test; public class IntegerTest { public static void main(String[] args) { System.out.println("Integer中的常量***************************

java中Integer i1= 0; Integer i2= 0; 为什么可以用 == 符号呢

java中Integer i1= 0; Integer i2= 0;  有i1 == i2,且有i1 = 1;那么i2为什么不会变成1呢? 我这个时候的想法是:这是因为java中整型常量是基于int的,而java中有自动包装机制,也就是说看起来i1,i2是Integer类型,但是其底层还是基于int类型的(不能理解的话在java中还有一个地方那就是Arrays.asList(T...args) 他返回一个基于数组的List,如果在List中改变其大小,那么将会引发异常[UnsupportedOp

Java中Integer类的方法

字段摘要 static int MAX_VALUE              保持 int 类型的最大值的常量可取的值为 231-1. static int MIN_VALUE              保持 int 类型的最小值的常量可取的值为 -231. static int SIZE              以二进制补码形式表示 int 值的位数. static Class<Integer> TYPE              表示基本类型 int 的 Class 实例. 构造方法摘要

Java中的回调函数学习

Java中的回调函数学习 博客分类: J2SE JavaJ# 一般来说分为以下几步: 声明回调函数的统一接口interface A,包含方法callback(); 在调用类caller内将该接口设置为私有成员private A XXX; 在caller内提供实现A接口的public方法(将外部该接口的实现类通过形参传入caller的XXX): caller的某个方法dosth()中会用到XXX.callback()方法; 在caller的实例中,先实现A接口,后调用dosth()方法: 网上流行

java中Integer值比较不注意的问题

今天,帮人看代码时,发现这个问题,回顾起来,记录下来. 先来看一个代码片段 public static void main(String[] args) { Integer a1 = Integer.valueOf(60); //danielinbiti Integer b1 = 60; System.out.println("1:="+(a1 == b1)); Integer a2 = 60; Integer b2 = 60; System.out.println("2:=

java 中 Integer 比较 问题

对于 java 中 Integer  类型 比较 ,经常在面试中被提到 ,有时 还真的 让人 头疼.下面我来分析下.integer   比较问题. 解决 Integer 值比较问题.我想从以下几点说起. 1. Integer 的源码. 2.堆内存与常量池 从Integer 源码开 . 在  -128 到   127    之间 的 数    再次 再用 .或者赋值 直接从缓存中取. 例子如下 : Integer    a = 127  ; Integer   b=127; Integer   c

JAVA中Integer类下的常用方法有哪些?

JAVA中Integer类下的常用方法有哪些?1.进制转换 n进制转10进制 字符串结果 Integer.parseInt(String s, int radix): radix范围为2-36(包括0-9,a-z) string输入为二进制字符串 System.out.println( Integer.parseInt("10000",2)); //16 2.int转二进制字符串 System.out.println( Integer.toBinaryString(789)); //1

JAVA中Integer对象的引用

JAVA中没有指针一说,但也有引用的概念.这里要说的主要是Integer是不是同一个对象. 1.先看一段代码: public static void main(String[] args){ Integer a1 = 100; Integer b1 = a1;//另一种也可以b1=100 Field field = null; try { field = a1.getClass().getDeclaredField("value"); } catch (NoSuchFieldExcep

Java中Integer和String浅谈

http://qxzxcjq-126-com.iteye.com/blog/883283 Java中的基本数据类型有八种:int.char.boolean.byte.long.double.float.short.Java作为一种面向对象的编程语言,数据在Java中也是一种对象.我们用基本数据类型创建的对象,如 int x = 0;这里的x只有值这个属性,没有(或者很少)有其他的方法.这在一些需要对数据进行操作时变的很不方便,程序员需要自己编写很多代码去实现一些常用的功能,增加了工作量及程序的大