valueOf方法 创建Integer对象
文章讨论了Java中Integer类的valueOf方法,该方法用于创建Integer对象。
✍方法声明
public static Integer valueOf(int i);
- 📥入参:i为一个int值。
- 🪐返回值:表示i的Integer实例。
返回一个表示指定的int值的Integer实例。如果不需要新的Integer实例,则通常应优先使用该方法,而不是构造方法Integer(int),因为该方法有可能通过缓存经常请求的值而显著提高空间和时间性能。
public static void main(String[] args) {
// 使用 int 值创建 Integer 对象
Integer i1 = Integer.valueOf(6);
Integer i2 = Integer.valueOf(-1);
System.out.println(i1);
System.out.println(i2);
}
-1
✍方法声明
public static Integer valueOf(String s) throws NumberFormatException;
- 📥入参:s为要解析的字符串。
- 🪐返回值:保存字符串参数表示的值的Integer对象。
- 🐛抛出异常NumberFormatException:如果字符串不能解析为一个整数。
返回保存指定的String的值的Integer对象。,将该参数解释为表示一个有符号的十进制整数,就好像将该参数赋予parseInt(java.lang.String)
方法一样。结果是一个表示字符串指定的整数值的Integer对象。换句话说,该方法返回一个等于以下值的Integer对象:new Integere(Integer.parseInt(s)
。
public static void main(String[] args) {
// 使用 String 值创建 Integer 对象
Integer i1 = Integer.valueOf("66");
System.out.println(i1);
Integer i2 = Integer.valueOf("3M");
System.out.println(i2);
}
Exception in thread “main” java.lang.NumberFormatException: For input string: “3M”
✍方法声明
public static Integer valueOf(String s,int radix) throws NumberFormatException;
- 📥入参:s:要解析的字符串。radix:解释s时使用的基数。
- 🪐返回值:一个Integer对象,它含有字符串参数(以指定的基数)所表示的数值。
- 🐛抛出异常NumberFormatException:如果字符串不能解析为一个整数。
返回一个Integer对象,该对象中保存了用第二个参数提供的基数进行解析时从指定的String中提取的值。
该方法将第一个参数解释为用第二个参数指定的基数表示的有符号整数,就好像将这些参数赋予parseInt(java.lang.String,int)
方法一样。结果是一个表示字符串指定的整数值的Integer对象。换句话说,该方法返回一个等于以下值的Integer对象:new Integer(Integer.parseInt(s,radix))
。
public static void main(String[] args) {
// 使用 String 和 radix 创建 Integer 对象
Integer i1 = Integer.valueOf("100", 2);
System.out.println(i1);
Integer i2 = Integer.valueOf("100", 8);
System.out.println(i2);
Integer i3 = Integer.valueOf("100", 10);
System.out.println(i3);
Integer i4 = Integer.valueOf("100", 16);
System.out.println(i4);
}
64
100
256
Integer缓存
分别通过 valueOf 创建两个值为 12 的 Integer 对象。
public static void main(String[] args) {
Integer i1 = Integer.valueOf(12);
Integer i2 = Integer.valueOf("12");
System.out.println(i1.equals(i2));
System.out.println(i1 == i2);
}
true
在Java中,两个对象直接比较应该通过 equals 进行,值均为12 的 i1/i2 两个对象通过 equals 比较是相等的。
理论上,==
比较的是内存地址, i1/i2 两个对象不应该相等才是,但是结果却是相等的。
在 Integer 对象内部,维护了一个 IntegerCache 缓存,默认在 -128~127之间的 Integer 对象公用同一地址。
public static void main(String[] args) {
Integer i1 = Integer.valueOf(312);
Integer i2 = Integer.valueOf("312");
System.out.println(i1.equals(i2));
System.out.println(i1 == i2);
}
false
相同的代码,换了一个数值,结果就不同了。因为 312 超过了默认Integer缓存的范围,未能使用到这一优化手段。
📝总结
Integer类的valueOf方法提供了一种创建Integer对象的方式,特别是当涉及到频繁创建具有相同整数值的对象时,这种方法非常有用。通过内部缓存机制,valueOf(int i)方法可以显著提高性能,因为它重用已有的对象,而不是每次都创建新对象。
valueOf(String s)和valueOf(String s, int radix)方法则允许从字符串表示创建Integer对象,其中后者允许指定字符串的基数,从而支持二进制、八进制、十六进制等不同进制的整数解析。如果解析失败,这些方法会抛出NumberFormatException。开发者在使用这些方法时应该注意处理可能的异常,并根据需要选择合适的方法来创建Integer对象。