为啥数字字符的 Integer.valueOf 不返回其值?

Posted

技术标签:

【中文标题】为啥数字字符的 Integer.valueOf 不返回其值?【英文标题】:Why doesn't Integer.valueOf of a digit Character return its value?为什么数字字符的 Integer.valueOf 不返回其值? 【发布时间】:2019-11-15 15:59:14 【问题描述】:

我不得不说这是一个错误发现的,因为我试图将String转换为Integer,但我没有意识到它是Character类型而不是Integer .

但不知何故,Integer.valueOf 仍然可以使用Character 参数运行,尽管JDK documentation 中没有提到这一点?

System.out.println(Integer.valueOf("2"));  // >>> 2
System.out.println(Integer.valueOf('2'));  // >>> 50

虽然它适用于 "2"String 参数,但它不提供 '2'Character 参数的预期结果。为什么会这样?

我想了解我是否遗漏了什么?为什么返回 50 而不是 2?

谢谢


好的,我检查了 ASCII 表,它返回 50,因为 Character '2' 的索引是 50。

【问题讨论】:

char 是无符号的 16 位整数类型。 '2' 只是指定整数 50 的另一种方式。'2'==50 将返回 true。 '2' 被简单地提升为 Integer.valueOf(int) 的 int char 是数字类型,尽管它看起来不像数字类型。 【参考方案1】:

Integer.valueOf(char)) 给出 ASCII 值。

Integer.valueOf('2');  // >>> 50

如果你想得到数值那么,

Character.getNumericValue('2'));  // >>> 2

【讨论】:

你是对的,但我问为什么java允许Integer.valueOf(Character)?这没有写在 JDK 文档中。 docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/… 嗯,数字 2 作为字符而不是 int 传递。这样 Integer.valueOf 返回字符 '2' 的 ASCII 值。 @JamesKPolk,char 或 Character 在这里真的很重要吗? @Rowi:我不确定,也许不是自动拆箱。 @Code_Control_jxie0755 你是对的,但我问为什么 java 允许 Integer.valueOf(Character) 因为widening primitive conversion (JLS-5.1. 2 链接)(char 扩大到int)。至于为什么允许这样做,'a' + 1 == 'b'(希望对您有所帮助)。【参考方案2】:

ASCII 表示应该为您提供有关为什么会出现这种行为的线索。

请记住,Integer 和 Character 类是 int 和 char 原始类型的包装器。 Integer.valueOf() 与 Character 一起使用的原因是隐式转换为 Integer。当您将字符转换为整数时,整数将保存该字符的 ASCII 代码。原始类型也会发生同样的事情。例如

 Character yourChar = new Character('2');
 Integer yourInt = Integer.valueOf(yourChar);    //Implicit casting

 char biz = '2';
 int baz = (int)biz;                            //Explicit casting to int

 System.out.println(baz);
 System.out.println(yourInt);

这里,yourInt 和 baz 的值都是 50,因为那是 '2' 的 ASCII 码。隐式和显式转换做同样的事情。

如果您确实想将包含数字的字符转换为正确的整数,请使用 Character.getNumericValue()。例如

 char myChar = '2';
 int myInt = Character.getNumericValue(myChar);

现在 myInt 的值为 2。

就最佳实践而言,使用这种类型的隐式转换并不是一个好主意。它并没有使你想要做什么很明显。

【讨论】:

以上是关于为啥数字字符的 Integer.valueOf 不返回其值?的主要内容,如果未能解决你的问题,请参考以下文章

字符串和数字之间的相互转化

Integer.valueof(String s)和Integer.parseInt(String s)的具体区别是什么?

java中 字符串转数值要怎样做

强制类型转换 字符串和数字互相怎么转换

String和int之间的转换

Integer.valueOf