美文网首页
java中整数转字符串源码分析

java中整数转字符串源码分析

作者: philcoulso_b627 | 来源:发表于2019-07-28 22:20 被阅读0次

本人水平有限,若说的不对,欢迎更正,最近在重新学习一遍java,于是乎想看看用了这么久的valueOf到底是怎么实现的
我们都知道,java 提供给我们字符串,和各个基本类型之间进行转化

1.int 转字符串

java 整形转字符串是非常简单的,只需要使用方法 String valueOf就行了,例如

int i=1;//整形 1
String s=String.valueOf(i);//转为字符串

可博主自己无聊,想要看看到底java到底是如何实现改功能的
点进 valueOf的源码,发现是调用了整形的toString方法

public static String valueOf(int i) {
        return Integer.toString(i);
    }

继续跟进

 public static String toString(int i) {
        if (i == Integer.MIN_VALUE)
            return "-2147483648";  //如果输入的i小于 int设置最小值,则直接返回最小值字符串
        int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);  //获取大小 这里的+1是为了负数的符号 -
        char[] buf = new char[size];  
        getChars(i, size, buf);//将整数逐个转换保存到char 数组中;
        return new String(buf, true);
    }

我们都知道java中 String类其实是一个对象,所以String对象一旦创建就是不可变的,里面保存的其实是char[],所以保存字符串还是基本类型char.

 final static char[] digits = {
        '0' , '1' , '2' , '3' , '4' , '5' ,
        '6' , '7' , '8' , '9' , 'a' , 'b' ,
        'c' , 'd' , 'e' , 'f' , 'g' , 'h' ,
        'i' , 'j' , 'k' , 'l' , 'm' , 'n' ,
        'o' , 'p' , 'q' , 'r' , 's' , 't' ,
        'u' , 'v' , 'w' , 'x' , 'y' , 'z'
    };
static void getChars(int i, int index, char[] buf) {
        int q, r;
        int charPos = index;
        char sign = 0;

        if (i < 0) {
            sign = '-';
            i = -i;
        }

        // Generate two digits per iteration
        while (i >= 65536) {
            q = i / 100;
        // really: r = i - (q * 100);
            r = i - ((q << 6) + (q << 5) + (q << 2)); //<<向左移动,为了性能所以用了<< 实际上是 q*100
            i = q;
            buf [--charPos] = DigitOnes[r];
            buf [--charPos] = DigitTens[r];
        }

        // Fall thru to fast mode for smaller numbers
        // assert(i <= 65536, i);
        for (;;) {
            q = (i * 52429) >>> (16+3);//实际上是 i/10, 这样子的方式精度是最高的
            r = i - ((q << 3) + (q << 1));  // r = i-(q*10) ... //实际上的操作为 r=i%10; 除以10乘于10丢失了小数位
            buf [--charPos] = digits [r];//比如1 则获取char "1"
            i = q;
            if (i == 0) break;
        }
        if (sign != 0) {
            buf [--charPos] = sign;
        }
    }

返回到上面

  getChars(i, size, buf);//将整数逐个转换保存到char 数组中;
        return new String(buf, true);

由于在getChars改变了 buf ,java中值传递,传递的是对象的引用,所以改变了buf数组.
于是只要调用String类构造函数传入buf数组即可.

写该文章的目的是为了更好的去理解源码,学习一下大佬的思维是怎么样的。从刚入门开始就已经知道如何使用
String和int的转换,但是感觉并没有很好的理解和学习。

相关文章

网友评论

      本文标题:java中整数转字符串源码分析

      本文链接:https://www.haomeiwen.com/subject/fdtmrctx.html