Что делает эта строка кода Java?

Пожалуйста, рассмотрите этот фрагмент кода Java. Это работает, но я пытаюсь понять, что он делает.

char str   = 'foo'
long prime = 503;
long hash  = 0;
hash = prime + str.charAt(1);

Я запутался, потому что это математическое сложение разных типов данных. Был бы я прав, если бы думал, что символ был преобразован в его значение ASCII для целей этой математической операции?

Спасибо!

«Был бы я прав, если бы думал, что символ был преобразован в его значение ASCII для целей этой математической операции?» char - это числовой тип данных, преобразование отсутствует.

tkausl 23.05.2018 00:23

Этот код не компилируется. str должен быть строкой, а не char

Malt 23.05.2018 00:23

Ваша первая строчка char str = 'foo'; не имеет смысла. Может вы имеете в виду String str = "foo";

Thomas Fritsch 23.05.2018 00:26

@DyZ Это не дубликат этого вопроса: здесь нет конкатенации строк

C.Champagne 23.05.2018 00:34
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
140
3

Ответы 3

Во-первых, у вас неправильный синтаксис. Я исправил это (см. Код ниже). Теперь значение hash будет 614. Поскольку hash = prime + str.charAt(1) означает, что вы добавляете значение ASCII символа в индекс 1 строки str, то есть o. Значение ASCII для o - 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, значение символа не ограничивается только значением ASCII в Java. Поэтому лучше использовать здесь термин кодовая точка Unicode вместо значения ASCII. Для получения более подробной информации, пожалуйста, обратитесь к В чем разница между ASCII и Unicode?

строго говоря, это не значение ASCII, а кодовая точка Unicode символа (пока она находится в BMP). Оба согласны в диапазоне ASCII, но в Java можно использовать гораздо больше символов.

Henry 23.05.2018 06:57

Фактически, это кодовая единица UTF-16, одна или две из которых образуют кодовую точку Unicode. Попробуйте String foo = "?";.

Tom Blodget 23.05.2018 12:40

Да. Согласно Спецификация языка Java, §5.6.2,, когда вы применяете операцию сложения + к long и char, «расширяющее примитивное преобразование» будет выполнено на char, и сложение будет выполнено с двумя значениями long.

Можно сказать несколько иначе: char и long на самом деле не являются разными типами. Оба они целые. Точно так же, как вы можете сложить int и byte вместе (и байт расширяется до int), и вы можете добавить int и long (int расширяется до long), чтобы вы могли добавлять char к другим типам целых чисел. (И целые числа могут быть преобразованы в числа с плавающей запятой, поэтому вы также можете добавлять их в char и другие целые числа.)

markspace 23.05.2018 00:41

Я буду гудеть здесь и добавлю ссылку на другой вопрос, на который я ответил, который включает арифметику для типов char: stackoverflow.com/questions/33770180/…

markspace 23.05.2018 00:46

Would I be correct if I thought the character was converted to its ASCII value for the purposes of this math operation?

Да (за исключением того, что вам нужно изменить вашу первую строку на String str = "foo";. В основном char - это целочисленный тип, который можно использовать в арифметических выражениях.

Javadoc говорит:

charAt

public char charAt(int index)

Returns the char value at the specified index.

JLS (спецификация языка Java) говорит:

Chapter 4. Types, Values, and Variables

The numeric types are the integral types byte, short, int, long, and char

а также

4.2. Primitive Types and Values:

char, whose values are 16-bit unsigned integers representing UTF-16 code units (§3.1)"

а также

4.2.1. Integral Types and Values

For char, from '\u0000' to '\uffff' inclusive, that is, from 0 to 65535

а также

5.6.2. Binary Numeric Promotion

When an operator applies binary numeric promotion to a pair of operands, each of which must denote a value that is convertible to a numeric type, the following rules apply, in order:

...

Widening primitive conversion (§5.1.2) is applied to convert either or both operands as specified by the following rules:

...if either operand is of type long, the other is converted to long.

а также

15.18.2. Additive Operators (+ and -) for Numeric Types

The binary + operator performs addition when applied to two operands of numeric type, producing the sum of the operands.

Binary numeric promotion is performed on the operands (§5.6.2).

Вам не хватает очень важного 4.2. Примитивные типы и значения: «char, значения которого представляют собой 16-битовые целые числа без знака, представляющие единицы кода UTF-16 (§3.1)», чтобы правильно ответить на вопрос о "значении ASCII".

Andreas 23.05.2018 01:08

@andreas, который был неявным из 4.2.1, но хорошо, я добавил его, спасибо

Jean-Baptiste Yunès 23.05.2018 06:50

Другие вопросы по теме