这行 Java 代码在做啥?
Posted
技术标签:
【中文标题】这行 Java 代码在做啥?【英文标题】:What is this line of Java code doing?这行 Java 代码在做什么? 【发布时间】:2018-11-01 18:52:12 【问题描述】:请考虑这段 Java 代码。它有效,但我试图了解它的作用。
char str = 'foo'
long prime = 503;
long hash = 0;
hash = prime + str.charAt(1);
我很困惑,因为这是不同数据类型的数学加法。如果我认为字符被转换为它的 ASCII 值是为了这个数学运算的目的,我会是正确的吗?
谢谢!
【问题讨论】:
“如果我认为字符被转换为它的 ASCII 值是为了这个数学运算的目的,我会是正确的吗?” char 是数值数据类型,没有转换。 Concat an integer to a String - use String literal or primitive from performance and memory point of view?的可能重复 该代码无法编译。str
必须是字符串,而不是 char
您的第一行 char str = 'foo';
没有意义。可能你的意思是String str = "foo";
@DyZ 这不是那个问题的重复:这里没有字符串连接
【参考方案1】:
首先,您的语法错误。我纠正了这一点(见下面的代码)。现在hash
的值将是 614。因为hash = prime + str.charAt(1)
意味着您在 str 的索引 1 处添加字符的 ASCII 值,即o
。 o
的 ASCII 值是 111
。所以hash
相加后的值为614。
String str = "foo";
long prime = 503;
long hash = 0;
hash = prime + str.charAt(1);
System.out.println(hash); // This line prints 614. Because value prime is 503 and the ASCII value of `o` is 111.
您可以使用这个 Ideone https://ideone.com/EcbP8x 并运行代码以查看输出。
编辑
正如@Henry 所指出的,字符的值不仅限于Java 中的ASCII 值。所以这里使用的更好的术语是 Unicode 代码点而不是 ASCII 值。了解更多详情请参考What's the difference between ASCII and Unicode?
【讨论】:
严格来说不是ASCII值而是字符的Unicode码位(只要在BMP中)。两者都在 ASCII 范围内一致,但在 Java 中可以使用更多字符。 其实就是UTF-16编码单元,其中一两个组成一个Unicode码位。试试String foo="?";
。【参考方案2】:
如果我认为字符已转换为 用于此数学运算的 ASCII 值?
是的(除非您需要将第一行更改为String str = "foo";
。基本上char
是可用于算术表达式的整数类型。
Javadoc 说:
charAt
public char charAt(int index)
返回 char 值 指定索引。
JLS(Java 语言规范)说:
第 4 章。类型、值和变量
数字类型是 整数类型
byte
、short
、int
、long
和char
和
4.2.原始类型和值:
char
,其值为代表 UTF-16 的 16 位无符号整数 代码单元 (§3.1)"
和
4.2.1。积分类型和值
对于char,从
'\u0000'
到'\uffff'
(含),即从0
到65535
和
5.6.2。二进制数字提升
当运算符对一对操作数应用二进制数值提升时,每个操作数都必须表示一个可转换为数值类型的值,按顺序适用以下规则:
...
加宽原语转换(第 5.1.2 节)适用于转换以下规则中指定的一个或两个操作数:
...如果其中一个操作数是 long 类型,则另一个将转换为 long。
和
15.18.2.数字类型的加法运算符(+ 和 -)
二进制 + 运算符在应用于两个数字类型的操作数时执行加法,产生操作数的和。
对操作数执行二进制数字提升(第 5.6.2 节)。
【讨论】:
你错过了非常重要的4.2. Primitive Types and Values:"char
,它的值是代表 UTF-16 代码单元的 16 位无符号整数(§ 3.1)”,真正回答“ASCII值”的问题。
@andreas 是从 4.2.1 隐含的,但好的,我添加了它,谢谢【参考方案3】:
是的。根据Java Language Specification, §5.6.2,,当你对一个long
和char
应用加法运算+
时,会在char
上进行一次“加宽原语转换”,并与两个long
进行加法运算价值观。
【讨论】:
一种稍微不同的说法是char
和long
实际上并不是不同的类型。它们都是整数。因此,就像您可以将int
和byte
一起添加(并且字节加宽为int),您可以添加int
和long
(int 加宽为long),因此您可以将char
添加到其他类型的整数。 (并且整数可以转换为浮点数,因此您也可以将它们添加到char
和其他整数。)
我会在这里吹响自己的号角,并添加指向我回答的另一个问题的链接,该问题涉及char
类型的算术:***.com/questions/33770180/…以上是关于这行 Java 代码在做啥?的主要内容,如果未能解决你的问题,请参考以下文章