这行Java代码在做什么? 请考虑一下这个java代码。它是有效的,但我正在努力理解它的作用 char str = 'foo' long prime = 503; long hash = 0; hash = prime + str.charAt(1);

这行Java代码在做什么? 请考虑一下这个java代码。它是有效的,但我正在努力理解它的作用 char str = 'foo' long prime = 503; long hash = 0; hash = prime + str.charAt(1);,java,types,charat,Java,Types,Charat,我很困惑,因为这是不同数据类型的数学加法。如果我认为为了这个数学运算的目的,字符被转换为ASCII值,那么我是否正确 谢谢 首先,您的语法错误。我纠正了这一点(见下面的代码)。现在,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

我很困惑,因为这是不同数据类型的数学加法。如果我认为为了这个数学运算的目的,字符被转换为ASCII值,那么我是否正确


谢谢

首先,您的语法错误。我纠正了这一点(见下面的代码)。现在,
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并运行代码以查看输出

编辑

正如@Henry所指出的,字符的值在Java中不仅限于ASCII值。因此,这里使用的更好的术语是Unicode代码点,而不是ASCII值。要了解更多详细信息,请参阅是。根据将加法操作
+
应用于
long
char
时,将对
char
执行“加宽原语转换”,并使用两个
long
值执行加法


如果我认为该角色已转换为其角色,我是否正确 用于此数学运算的ASCII值

是(除非您需要将第一行更改为
String str=“foo”
char
基本上是一种整数类型,可以在算术表达式中使用

Javadoc说:

charAt

公共字符(整数索引)

返回当前位置的char值 指定的索引

JLS(Java语言规范)规定:

第4章类型、值和变量

数字类型是 整型
byte
short
int
long
char

4.2.基本类型和值:

char
,其值是表示UTF-16的16位无符号整数 代码单位(§3.1)”

4.2.1.积分类型和值

对于字符,从
'\u0000'
'\uffff'
包括在内,即从
0
65535

5.6.2.二进制数字升级

当运算符将二进制数字提升应用于一对操作数(每个操作数必须表示可转换为数字类型的值)时,以下规则依次适用:

加宽基元转换(§5.1.2)用于转换以下规则指定的一个或两个操作数:

…如果其中一个操作数的类型为long,则另一个操作数将转换为long

15.18.2.数字类型的加法运算符(+和-)

二进制+运算符应用于两个数字类型的操作数时执行加法,生成操作数之和

对操作数执行二进制数字提升(§5.6.2)


“如果我认为字符被转换为ASCII值用于此数学运算,我是否正确?“字符是一种数字数据类型,没有转换。该代码的可能副本将无法编译。
str
必须是字符串,而不是
char
您的第一行
char str='foo';
没有意义。您的意思可能是
String str=“foo”
@DyZ这并不是这个问题的重复:这里没有字符串连接。一种稍微不同的说法是,
char
long
实际上不是不同的类型。它们都是整数。所以就像你可以把
int
byte
加在一起一样(byte被加宽为int)您可以添加一个
int
和一个
long
(int被加宽为long),这样您就可以将
char
添加到其他类型的整数中。(整数可以转换为浮点,这样您就可以将它们添加到
char
和其他整数中。)我将在这里吹响自己的号角,并添加一个指向我回答的另一个问题的链接,该问题涉及
char
类型的算术:您缺少非常重要的:“
char
,其值是表示UTF-16代码单位(§3.1)”的16位无符号整数,以真正回答关于“ASCII值”的问题@andreas这是4.2.1中的隐式,但好吧,我添加了它。严格地说,它不是ASCII值,而是字符的Unicode代码点(只要它在BMP中)。两者在ASCII范围内一致,但Java中可以使用更多字符。实际上,它是UTF-16代码单元,其中一个或两个组成Unicode代码点。请尝试
String foo=”