Java Integer.toString()如何在内部工作?
我发现之前也有人问过类似的问题: 但这并不是说这个函数内部是如何工作的。当我打开Java Integer.toString()如何在内部工作?,java,integer,tostring,Java,Integer,Tostring,我发现之前也有人问过类似的问题: 但这并不是说这个函数内部是如何工作的。当我打开Integer.toString()的内部源代码时,普通初级java程序员无法理解 有人能用简短的描述解释一下内部发生的事情吗 注:这是我最近被问到的面试问题之一。我不知道如何回答这样的问题 integer.toString()的no-arg调用只调用静态方法integer.toString(int i)(使用integer变量自身的原语值),实现如下 public static String toString
Integer.toString()
的内部源代码时,普通初级java程序员无法理解
有人能用简短的描述解释一下内部发生的事情吗
注:这是我最近被问到的面试问题之一。我不知道如何回答这样的问题 integer.toString()的no-arg调用只调用静态方法
integer.toString(int i)
(使用integer
变量自身的原语值),实现如下
public static String toString(int i) {
if (i == Integer.MIN_VALUE)
return "-2147483648";
int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
char[] buf = new char[size];
getChars(i, size, buf);
return new String(0, size, buf);
}
一旦它有一个大小正确的char[]
,它就会使用下面实现的getChars()
方法填充该数组
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));
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);
r = i - ((q << 3) + (q << 1)); // r = i-(q*10) ...
buf [--charPos] = digits [r];
i = q;
if (i == 0) break;
}
if (sign != 0) {
buf [--charPos] = sign;
}
}
静态void getChars(int i,int index,char[]buf){
int q,r;
int charPos=索引;
字符符号=0;
if(i<0){
符号='-';
i=-i;
}
//每次迭代生成两位数
而(i>=65536){
q=i/100;
//真的:r=i-(q*100);
r=i-((q)对于这个网站来说,它一点也不简单,可能太宽了。可能最好用谷歌搜索一下。String.valueOf(this);
@sᴜʀᴇsʜᴀᴛᴛᴀ 不是这个,而是对提供的基中的所有数字进行迭代的包装值,每个数字都被转换为其相应的字符
。然后字符数组被转换为字符串
。这会不会不起作用。..String number=123+“”;@assylias-更新后的答案将与关于此主题的SO答案一样深入(空间有限)。添加了stringSize()
和getChars()
的实现。
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));
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);
r = i - ((q << 3) + (q << 1)); // r = i-(q*10) ...
buf [--charPos] = digits [r];
i = q;
if (i == 0) break;
}
if (sign != 0) {
buf [--charPos] = sign;
}
}