为啥数字字符的 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)的具体区别是什么?