toUnsignedString0()方法的功能将整数转换成无符号数字字符串返回。该方法的核心其实是formatUnsignedInt()方法的调用,formatUnsignedInt()方法将val转换成二进制或八进制或十六进制后的数填充到buf字符数组中,而formatUnsignedInt()方法就是将该字符数组转换成字符串,这才是它的核心功能。
toUnsignedString0()方法的源码如下:
/**
* Convert the integer to an unsigned number.
*/
private static String toUnsignedString0(int val, int shift) {
// assert shift > 0 && shift <=5 : "Illegal shift value";
int mag = Integer.SIZE - Integer.numberOfLeadingZeros(val);
int chars = Math.max(((mag + (shift - 1)) / shift), 1);
char[] buf = new char[chars];
formatUnsignedInt(val, shift, buf, 0, chars);
// Use special constructor which takes over "buf".
return new String(buf, true);
}
该方法是一个私有方法,不供外界类使用,只能在Integer类调用,所以如果我们要明白这个方法,首先要明白这个方法在那些地方调用了的,其实在该方法仅在Integer类中被调用了三次,如下:
// 将一个整数转换成十六进字符串返回
public static String toHexString(int i) {
return toUnsignedString0(i, 4);
}
// 将一个整数转换成八进制字符串返回
public static String toOctalString(int i) {
return toUnsignedString0(i, 3);
}
// 将一个整数转换成二进制字符串返回
public static String toBinaryString(int i) {
return toUnsignedString0(i, 1);
}
可以看到在该方法中传入的值分别是1、3、4,对应的转换进制分别是二进制、八进制、十六进制。
- toBinaryString()方法传入的移位值是1,因为二进制的log2(2)=1;
- toOctalString()方法传入的移位值是3,因为八进制的log2(8)=3;
- toHexString()方法传入的移位值是4,因为十六进制的log2(16)=4
对toUnsignedString0()方法进行注释如下:
/**
* 将整数转换为无符号数字
*
* @param val 传入数据
* @param shift 移位值
* toBinaryString()方法传入的移位值是1,因为二进制的log2(2)=1;
* toOctalString()方法传入的移位值是3,因为八进制的log2(8)=3;
* toHexString()方法传入的移位值是4,因为十六进制的log2(16)=4
* @return
*/
private static String toUnsignedString0(int val, int shift) {
// assert shift > 0 && shift <=5 : "Illegal shift value";
// Integer.numberOfLeadingZeros(val)方法是计算val的二进制的前导零个数,比如8的二进制是0000 0000 0000 0000 0000 0000 0000 1000的前导零个数为28
// Integer.SIZE是设置的常量,值为32
// chars 代表的是字符的个数,mag代表的是除去前导零的个数
// mag是从左往右数第一个'1'之后的所有位数(包括第一个'1'),确定应当存在字符数组中的字符个数(长度)
int mag = Integer.SIZE - Integer.numberOfLeadingZeros(val);
// (mag + (shift - 1)) / shift,这是防止chars为0,我们需要chars至少为1,当mag=1时,((mag + (shift - 1)) / shift)是为1的。我们使用shift - 1
int chars = Math.max(((mag + (shift - 1)) / shift), 1);
// 根据字符个数chars定义一个字符数组
char[] buf = new char[chars];
// 调用formatUnsignedInt()方法将整数val转换成对应的进制数后每个字符保存到chars数组中
// 第一个参数val指的是要转换的十进制整数
// 第二个参数shift是移位值,比如要转换成二进制那么shift传入1,转换成八进制那么shift传入3,转换成十六进制那么shift传入4
// 第三个参数buf是定义的字符数组
// 第四个参数offset是目标缓冲区中开始的偏移量,传入0,从数组中的最后一个位置开始向前填充字符
// 第五个参数len是传入的字符个数
formatUnsignedInt(val, shift, buf, 0, chars);
// 将buf字符数组转换成字符串返回
return new String(buf, true);
}
那么关于formatUnsignedInt()方法的说明注释请参考:JDK源码之Integer类—formatUnsignedInt()方法
参考链接:
- JDK源码解读(第六弹:Integer之toUnsignedString0)