一、进制转换
1、十进制数转换为其他进制数
public static String toBinaryString(int i) // 转为二进制数
public static String toOctalString(int i) // 转为八进制数
public static String toHexString(int i) // 转为十六进制数
System.out.println(Integer.toBinaryString(2)); // 10 十进制数2转换为二进制
System.out.println(Integer.toOctalString(8)); // 10 十进制数8转换为八进制
System.out.println(Integer.toHexString(16)); // 10 十进制数16转换为十六进制
2、其他进制数转换为十进制数
// 将字符串参数解析为有符号十进制整数
public static int parseInt(String s) throws NumberFormatException
public static int parseInt(String s, int radix) throws NumberFormatException // 解析基数
// 将字符串参数解析为无符号十进制整数
public static int parseUnsignedInt(String s) throws NumberFormatException
public static int parseUnsignedInt(String s, int radix) throws NumberFormatException
System.out.println(Integer.parseInt("10",2)); // 二进制数10转为十进制,结果为2
System.out.println(Integer.parseInt("10",8)); // 八进制数10转为十进制,结果为8
System.out.println(Integer.parseInt("10",16)); // 十六进制数10转为十进制,结果为16
二、缓存机制
对于小的整数值(通常是-128到127之间,这个范围取决于JVM实现),Java会缓存这些Integer对象
因此在这个范围内的整数运算不会创建新的对象,超出这个范围的整数运算则会创建新的Integer对象
这个缓存机制只适用于Integer类型,对于其他的包装类(如Long、Double等),没有类似的缓存机制
程序更关心对象的实体,使用equals方法或者拆箱后的比较将始终基于值而不是引用,结果将是预期的
- 通过
Integer.valueOf(int i)
方法实现,在这个范围内的值会返回缓存中的对象
Integer i1 = 20 + 1;
Integer i2 = 20 + 1;
System.out.println(i1 == i2); // true
Integer i3 = 200;
Integer i4 = 200;
System.out.println(i3 == i4); // false
System.out.println(i3.equals(i4)); // true
Double d1 = 20.0;
Double d2 = 20.0;
System.out.println(d1 == d2); // false
注意事项:对于Long类型,并没有像Integer那样明确规定的缓存范围
对于小的整数值,由于自动装箱和拆箱的行为,可能会观察到类似于Integer缓存的行为
尽管这不是Long规范的一部分,观察到的行为可能因JVM实现和版本的不同而有所差异
- 自动装箱会调用
Long.valueOf(long l)
方法,方法内部可能会实现一个小的缓存
Long l1 = 20L + 1;
Long l2 = 20L + 1;
System.out.println(l1 == l2); // true
Long l3 = 200L;
Long l4 = 200L;
System.out.println(l3 == l4); // false
System.out.println(l3.equals(l4)); // true