前言,大概了解了Integer的内部,而至于Long,就同理可证了。
一、看toString(int i , int radix)方法源码
/**
* A constant holding the minimum value an int can
* have, -2^31 = -2147483648
*/
public static final int MIN_VALUE = 0x80000000;
/**
* A constant holding the maximum value an int can
* have, 2^31-1 = 2147483647;剩下的一个是0,无符号从0-4294967295
*/
public static final int MAX_VALUE = 0x7fffffff;
// 字符数组digits,36位,最多实现36进制
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'
};
public static String toString(int i, int radix) {
// radix边界检查,若超出,默认10进制,取值范围2-36进制
if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX)
radix = 10;
/* Use the faster version */
if (radix == 10) {
return toString(i);
}
// 长度为33的临时字符数组,索引0-32,存储计算转换后的值
char buf[] = new char[33];
boolean negative = (i < 0);
int charPos = 32;
if (!negative) {
i = -i;
}
// 求i的radix进制,就是通过i模radix所得值作digits数组的索引,一个一个地返回转换值,再赋予buf临时字符(后面开始,charPos索引开始),更新i值,如求10的8进制,10%8=2;digits[2]=2,填充到buf[32],更新i=1再循环
while (i <= -radix) {
buf[charPos--] = digits[-(i % radix)];
i = i / radix;
}
buf[charPos] = digits[-i];
// 求完数字,若为负,在前面加符号‘-’
if (negative) {
buf[--charPos] = '-';
}
// 通过String构造函数返回字符串,toString(10,8)
// buf[31],buf[32] = 1,2
// String(buffer:buf,offset:31,count:2)
return new String(buf, charPos, (33 - charPos));
}
二、看toHexString(int i) & toOctalString(int i) & toBinaryString(int i)的源码
public static String toHexString(int i) {
// 调用toUnsignedString(i,shift)
return toUnsignedString(i, 4); // 16进制 2^4
}
public static String toOctalString(int i) {
// 调用toUnsignedString(i,shift)
return toUnsignedString(i, 3); // 8进制 2^3
}
public static String toBinaryString(int i) {
return toUnsignedString(i, 1); // 2进制 1^2
}
因此,只要看toUnsignedString的源码就一清二楚。此进制转换算法通过移位达成,这个算法对于我来说很高深,为什么这样设计?!看懂每一步干什么先吧,高深的东东不是现在能明了的,慢慢来!
private static String toUnsignedString(int i, int shift) {
char[] buf = new char[32];
int charPos = 32;
// 进制数 = 2的N次方,N等于左移步伐
// 0001,左移1位(0010),代表radix=2进制
// 0001,左移3位(1000),代表radix=8进制
int radix = 1 << shift;
int mask = radix - 1;
do {
buf[--charPos] = digits[i & mask]; // i跟mask求与,
i >>>= shift;
} while (i != 0);
return new String(buf, charPos, (32 - charPos));
} )
用一个例子模拟以上算法,目标:求10的8进制toUnsignedString(10,3)
1)
1 << shift
2)
0000 0001 左移3位 0000 1000 = radix (radix的10进制=8)
3)
mask = 0000 0111
4)
第一次循环
i & mask = 0000 1010 & 0000 0111 = 0000 0010 (10进制的2) ,digits[2] = 2,将2赋值给buf[32],求出第一位数2。
5)
i = i >>> shift 无符号右移3位
0000 1010 >>> 0000 0001
i = 0000 0001 (10进制的1)
6)
进而如此循环,求出第二位数1,最终结果为12
分享到:
相关推荐
System.out.println("Integer.toString(int i, int radix): " + Integer.toString(i1, 16)); ``` 上述代码将整数54321转换为其十六进制表示"d431"。 - **valueOf方法**:`valueOf`方法可以将字符串或特定进制的...
2. **Integer.toString(int i, int radix)**: 这个方法将给定的十进制整数`i`转换为指定基数`radix`的字符串表示。基数可以是2到36之间的任何数字,其中2表示二进制,8表示八进制,10表示十进制,16表示十六进制。 ...
此外,`Integer`类还提供了一些实用方法,比如`parseInt()`用于将字符串转换为整数,`toString()`用于将整数转换为字符串,以及`compareTo()`用于比较两个`Integer`对象的大小。 总的来说,`int`适合于需要高性能...
- `Integer.toString(int i)`: 默认转换为十进制字符串,如果需要指定进制,可以使用`Integer.toString(int i, int radix)`。 - `Integer.toHexString(int i)`: 转换为十六进制字符串,`Integer.toHexString(10)`...
`Integer`类提供了许多额外的方法,如`toString()`、`compareTo()`以及与`int`相互转换的方法,如`intValue()`、`parseInt()`等。 在自动装箱和拆箱方面,Java 5引入了这一特性,使得在`int`和`Integer`之间进行...
int i = Integer.valueOf(my_str).intValue(); 2. 使用 Integer.parseInt() 方法 使用 Integer.parseInt() 方法也可以将 String 转换成 int。例如: int i = Integer.parseInt(str); 二、将 String 转换成 ...
Java 中 int 和 Integer 的区别 在 Java 编程语言中,int 和 Integer 是两种不同的数据类型,虽然它们看起来很相似,但它们有着根本的区别。下面我们将详细探讨这两种数据类型的差异。 基本类型 vs 复杂数据类型 ...
将int类型的值转换为String类型,可以使用`Integer.toString(int i)`方法或简单地通过字符串拼接实现。 ```java int num = 123; String strNum = Integer.toString(num); // 将整数123转换为字符串"123" // 或者...
- `Integer.toString(int number, int radix)`:这个方法可以将一个十进制整数转换为指定基数的字符串表示。例如,`Integer.toString(10, 2)`会返回二进制字符串"1010"。 - `Long.toString(long number, int radix...
`String.valueOf()` 方法和 `Integer.toString()` 方法都可以将 int 类型转换为 String 类型,而字符串连接操作符可以将 int 类型转换为 String 类型,并且可以在字符串中插入其他字符。 在实际开发中,我们通常...
Integer.parseInt()和Integer.toString()这两个方法的源码值得深入研究。parseInt()会通过解析字符数组来计算整数值,而toString()则会根据整数值生成对应的字符序列。源码分析可以帮助我们理解这些转换过程的底层...
- 方法支持:`Integer`作为类,提供了许多额外的方法,如`toString()`、`compareTo()`等,而`int`不具备这些功能。 - 性能:由于`int`是基本类型,没有对象创建的开销,所以在计算密集型任务中使用`int`通常比`...
2. `Integer.toString(int i, int radix)`:相反,这个方法将整数转换成指定基数的字符串形式。例如,`Integer.toString(10, 16)`会将十进制的10转换为十六进制的"A"。 3. `Integer.toBinaryString(int i)` 和 `...
要将十进制数转换为二进制字符串,可以使用 `Integer.toString(int i, int radix)`,其中 `radix` 是要转换的目标进制。例如,`Integer.toString(10, 2)` 将返回 "1010"。 2. **十进制转八进制**: 同样,用 `...
- `Integer.toString(int i, int radix)`:将十进制整数转换为指定基数的字符串。 - `Integer.toBinaryString(int i)`:将十进制整数转换为二进制字符串。 - `Integer.toOctalString(int i)`:将十进制整数转换为...
`Integer.valueOf(String s, int radix).toString()` 此方法用于将指定基数的字符串转换为整数,并返回其字符串表示形式。`radix` 参数指定了字符串所表示的进制。 - **示例**: ```java String hexStr = "FFFF...
* 使用 `Integer.toString()` 方法:`int i = 42; String str = Integer.toString(i);` * 使用字符串连接操作:`int i = 42; String str = "" + i;` 浮点型到字符串 将浮点型变量转换为字符串可以使用以下方法: ...
- 当使用`Integer.parseInt(String s, int radix)`时,`radix`参数表示输入字符串的基数,如2表示二进制,8表示八进制,16表示十六进制。 - 对于`Integer.toBinaryString`, `Integer.toOctalString`, 和 `Integer....
- `toString(int i)`:将一个`int`类型的值转换为字符串。 ##### 3. Float类 `Float`类也是`Number`类的一个实现,主要处理`float`类型的数值。 - **属性**:`Float`类有一个实例方法`floatValue()`,用于将`...
int i = Integer.parseInt((String) obj); // 将对象转换为 String 后使用 parseInt() ``` - **使用反射**:如果对象的类型是动态确定的,可以使用反射机制获取对象的实际类型,并根据类型进行转换。但这种方式...