链上科技面试
问int转化成String 即 Integer.toString的源码解析
实现:
字符数组digits,36位,
package string_to_int;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
/*
* created by sj 2019年8月29日
*/
public class StringToInt {
private static final char[] DigitOnes = null;
private static final char[] DigitTens = null;
private static final char[] digits = null;
public static String toString(int i) {
if(i == Integer.MAX_VALUE)
return "-2147483648";
int size = (i < 0) ? stringSize(-i)+1:stringSize(i);
char[] buf = new char[size];
getChars(i,size,buf);
String string = new String(buf, true);
return string;
}
private static void getChars(int i, int index, char[] buf) {
// TODO Auto-generated method stub
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;
}
}
//定义一个int数组,存放十个元素,分别对应了
final static int[] sizeTable = { 9, 99, 999, 9999, 99999, 999999, 9999999,
99999999, 999999999, Integer.MAX_VALUE };;
private static int stringSize(int x) {
for(int i=0; ; i++) {
if (x <= sizeTable[i]) {
return i+1;
}
}
}
}