Java 包装类,通过构造函数中的字符串参数创建对象时功能上的差异?

Java 包装类,通过构造函数中的字符串参数创建对象时功能上的差异?,java,string,integer,wrapper,Java,String,Integer,Wrapper,就包装类的实例而言,与int、double等相比,通过构造函数中的字符串创建实例时,实例的行为是否有所不同 例如,在以下方面是否存在差异: Integer wrapperInt= new Integer(33); Integer wrapperInt2= new Integer("33"); 不,没有。两个实例都表示整数33。如果有差异,它将被写在javadoc中 请注意,您应该更倾向于使用factory方法: Integer i = Integer.valueOf(33); i = Int

就包装类的实例而言,与
int
double
等相比,通过构造函数中的
字符串创建实例时,实例的行为是否有所不同

例如,在以下方面是否存在差异:

Integer wrapperInt= new Integer(33);

Integer wrapperInt2= new Integer("33");

不,没有。两个实例都表示整数33。如果有差异,它将被写在javadoc中

请注意,您应该更倾向于使用factory方法:

Integer i = Integer.valueOf(33);
i = Integer.valueOf("33");

不,没有。两个实例都表示整数33。如果有差异,它将被写在javadoc中

请注意,您应该更倾向于使用factory方法:

Integer i = Integer.valueOf(33);
i = Integer.valueOf("33");

最终结果将是相同的-您将有一个值为
33
Integer
对象

如果无法解析输入字符串,则采用
字符串的版本将抛出
NumberFormatException

注意:不需要编写像
Integer wrapperInt=newinteger(33)这样的语句。让编译器为您执行此操作(自动装箱):

如果出于某种原因,您不想使用自动装箱,则至少使用
Integer.valueOf(…)
而不是使用构造函数:

Integer wrapperInt = Integer.valueOf(33);

这样效率更高;
valueOf
方法可以返回一个缓存对象(这样就不必创建新的
Integer
对象)。

最终结果将是相同的-您将有一个
Integer
对象,其值为
33

如果无法解析输入字符串,则采用
字符串的版本将抛出
NumberFormatException

注意:不需要编写像
Integer wrapperInt=newinteger(33)这样的语句。让编译器为您执行此操作(自动装箱):

如果出于某种原因,您不想使用自动装箱,则至少使用
Integer.valueOf(…)
而不是使用构造函数:

Integer wrapperInt = Integer.valueOf(33);

这样效率更高;
valueOf
方法可以返回缓存对象(这样就不必创建新的
Integer
对象)。

唯一的区别是,在第二种方法中,您将不必要地创建一个string对象,它将尝试解析您传递给构造函数的字符串,如果无法解析字符串,则会抛出NumberFormatException。

唯一的区别是,在第二种方法中,您将不必要地创建一个string对象,它将尝试解析您传递给构造函数的字符串,如果无法解析字符串,则会抛出NumberFormatException。

答案是是的,两个语法之间可能存在差异。具体来说,语法

new Integer(33);
new Integer("33");
结果值33被编译器解释为整数常量,并作为文本存储在代码中。相比之下,语法

new Integer(33);
new Integer("33");
结果调用,该调用通过
Integer.parseInt(s,10)
路由字符串值。如果所讨论的值具有前导零字符,则这一点很重要;对于
int
literal,编译器将把literal计算为八进制:

new Integer(010); // equals 8
相反,字符串构造函数将始终以10为基数计算值:

new Integer("010"); // equals 10

在任何情况下,您几乎应该始终使用
Integer.valueOf()
,因为它通常效率更高。

答案是是的,两个语法之间可能存在差异。具体来说,语法

new Integer(33);
new Integer("33");
结果值33被编译器解释为整数常量,并作为文本存储在代码中。相比之下,语法

new Integer(33);
new Integer("33");
结果调用,该调用通过
Integer.parseInt(s,10)
路由字符串值。如果所讨论的值具有前导零字符,则这一点很重要;对于
int
literal,编译器将把literal计算为八进制:

new Integer(010); // equals 8
相反,字符串构造函数将始终以10为基数计算值:

new Integer("010"); // equals 10

在任何情况下,您几乎应该始终使用
Integer.valueOf()
,因为它通常效率更高。

为什么要这样做?你期望有什么不同的功能?你期望有什么不同?你不能检查JDK源代码吗?你所说的JDK源代码是什么意思?(例如)为什么要这样做?你期望有什么不同的功能?你期望有什么不同?你不能检查JDK源代码吗?你所说的JDK源代码是什么意思?(例如)对33正确,但在一般情况下不正确;有一个涉及八进制的边缘案件,你说的“涉及八进制的边缘案件”是什么意思?请解释。对33正确,但在一般情况下不正确;有一个涉及八进制的边缘案件,你说的“涉及八进制的边缘案件”是什么意思?请解释。阅读问题。问题不是“这些构造函数做同样的事情吗”。很明显,它们不是,因为一个接受int,另一个接受字符串。问题是:“实例的行为是否不同?”?答案是否定的:一个整数,无论是用一个构造函数还是另一个构造函数创建的,其行为都是相同的。问题不是“这些构造函数做同样的事情吗”。很明显,它们不是,因为一个接受int,另一个接受字符串。问题是:“实例的行为是否不同?”?答案是否定的:一个整数,无论是用一个构造函数还是另一个构造函数创建的,其行为方式都是一样的。