这行 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 值,即oo 的 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 章。类型、值和变量

数字类型是 整数类型byteshortintlongchar

4.2.原始类型和值:

char,其值为代表 UTF-16 的 16 位无符号整数 代码单元 (§3.1)"

4.2.1。积分类型和值

对于char,从'\u0000''\uffff'(含),即从065535

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,,当你对一个longchar应用加法运算+时,会在char上进行一次“加宽原语转换”,并与两个long进行加法运算价值观。

【讨论】:

一种稍微不同的说法是charlong 实际上并不是不同的类型。它们都是整数。因此,就像您可以将intbyte 一起添加(并且字节加宽为int),您可以添加intlong(int 加宽为long),因此您可以将char 添加到其他类型的整数。 (并且整数可以转换为浮点数,因此您也可以将它们添加到char 和其他整数。) 我会在这里吹响自己的号角,并添加指向我回答的另一个问题的链接,该问题涉及char 类型的算术:***.com/questions/33770180/…

以上是关于这行 Java 代码在做啥?的主要内容,如果未能解决你的问题,请参考以下文章

这段代码在做啥[重复]

这段代码在做啥?

Opencv 代码 - 有人可以帮我理解代码在做啥吗

这个 C++ 强制转换代码在做啥?

这段代码中的 lambda 函数在做啥? [复制]

属性别名自引用?这个 QML 代码在做啥?