Что означает двойная Тильда ( ~ ~ ) в Java?
при просмотре исходного кода Guava, я наткнулся на следующий кусок кода (часть реализации hashCode для внутреннего класса CartesianSet):
int adjust = size() - 1;
for (int i = 0; i < axes.size(); i++) {
adjust *= 31;
adjust = ~~adjust;
// in GWT, we have to deal with integer overflow carefully
}
int hash = 1;
for (Set<E> axis : axes) {
hash = 31 * hash + (size() / axis.size() * axis.hashCode());
hash = ~~hash;
}
hash += adjust;
return ~~hash;
и adjust и hash are ints. из того, что я знаю о Java,~ означает побитовое отрицание, так adjust = ~~adjust и hash = ~~hash следует оставить переменные без изменений. Запуск небольшого теста (с включенными утверждениями, конечно),
for (int i = Integer.MIN_VALUE; i < Integer.MAX_VALUE; i++) {
assert i == ~~i;
}
подтверждает это. Предполагая, что гуава ребята знают, что они делают, для этого должна быть причина. Вопрос в чем?
EDIT как указано в комментариях, тест выше не включает случай, когда i равна Integer.MAX_VALUE. Так как i <= Integer.MAX_VALUE всегда верно, нам нужно будет проверить, что случай вне цикла, чтобы предотвратить его от цикла навсегда. Однако, линия
assert Integer.MAX_VALUE == ~~Integer.MAX_VALUE;
дает предупреждение компилятора "сравнение идентичных выражений", которое в значительной степени гвозди оно.
1 ответ:
в Java, это ничего не значит.
но в этом комментарии говорится, что строка предназначена специально для GWT, что является способом компиляции Java в JavaScript.
в JavaScript целые числа являются своего рода двойниками, которые действуют как целые числа. Они имеют максимальное значение 2^53, например. Но побитовые операторы обрабатывайте числа, как будто они 32-разрядные, что именно то, что вы хотите в этом коде. Другими словами,
~~hashговорит "лечитьhashкак 32-разрядное число" в JavaScript. В частности, он отбрасывает все, кроме нижних 32 бит (так как побитовое~операторы только смотрят на нижние 32 бита), что идентично тому, как работает переполнение Java.Если у вас этого не было, хэш-код объекта будет отличаться в зависимости от того, оценивается ли он в Java-land или в JavaScript land (через компиляцию GWT).
Comments