本人水平有限,若说的不对,欢迎更正,最近在重新学习一遍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的转换,但是感觉并没有很好的理解和学习。









网友评论