Java Types¶
Контракт equals/hashCode¶
{Равные по ссылке пары объектов} являются подмножеством {Равные по equals пары объектов} являются подмножеством {Равные по hashCode пары объектов}
Для одного и того-же объекта, хеш-код всегда будет одинаковым
Если объекты одинаковые, то и хеш-коды одинаковые
Если хеш-коды равны, то входные объекты не всегда равны
Если хеш-коды разные, то и объекты гарантированно разные
Классы-обертки¶
Автоупаковка¶
При присвоении значения примитивного типа переменной соответствующего класса-обёртки.
При передаче примитивного типа в параметр метода, ожидающего соответствующий ему класс-обёртку.
Автораспаковка¶
При присвоении экземпляра класса-обёртки переменной соответствующего примитивного типа. Если класс-обёртка содержит null, при распаковке возникнет исключение NPE.
В выражениях, в которых один или оба аргумента являются экземплярами классов-обёрток (кроме операции == и !=). Арифметические операторы и операторы сравнения (исключение == и !=) применяются только к примитивным типам. При сравнении классов-обёрток оператором == или !=, происходит сравнение по ссылкам.
При передаче объекта класса-обёртки в метод, ожидающий соответствующий примитивный тип. Если для метода реализована перегрузка с соответствующим классом-обёрткой, вызовется именно он.
IntegerCache¶
IntegerCache инициализируется во время загрузки класса.
Integer содержит приватный внутренний класс IntegerCache, содержащий объекты типа Integer, для диапазона от -128 до 127 (изменяется параметрами запуска из коммандной строки).
Когда код боксится в Integer, и имеет значение из этого диапазона, рантайм использует кэш вместо создания нового Integer.
StringPool¶
StringPool - специальная область памяти, где Strings хранятся в JVM.
internБлагодаря неизменности Strings в Java, JVM может оптимизировать объем памяти, выделенный для них, сохраняя только одну копию каждого литерала String в пуле. Этот процесс называется interning .
Когда создается переменнаю String и присваивается ей значение, JVM ищет в пуле String с равным значением.
Note
Java String хранится в пространстве Heap
newКогда мы создается String с помощью оператора new, компилятор Java создаст новый объект и сохранит его в пространстве кучи, зарезервированном для JVM.
Каждая строка String, созданная таким образом, будет указывать на другую область памяти со своим собственным адресом.
Comparator¶
Интерфейс Comparator содержит ряд методов, ключевым из которых является метод compare()
public interface Comparator<E> {
int compare(T a, T b);
// остальные методы
}
Метод compare также возвращает числовое значение - если оно отрицательное, то объект a предшествует объекту b, иначе - наоборот. А если метод возвращает ноль, то объекты равны.