jdk1.8.0_144 Скачать адрес: //www.vevb.com/softs/551512.html
AbstractMap Abstract Class реализует некоторые простые и общие методы, что само по себе не сложно. Но в этом абстрактном классе есть два метода, на которые стоит обратить внимание. Можно сказать, что реализация метода Keyset и значений является моделями в стиле учебника.
Абстрактные классы обычно реализуются как скелет для реализации общих методов для их соответствующих подклассов. В предыдущей статье мы объяснили интерфейс карты, и эта статья анализирует и изучает класс AbstractMap Abstract.
В Java довольно много структур данных типа карты. AbstractMap, как их реализация скелета, реализует некоторые методы интерфейса карты, то есть он предоставляет общественные методы для своих подклассов, и различная карта без реализации может быть различной.
Абстрактный класс не может напрямую создавать экземпляры абстрактных классов через новое ключевое слово, но он может иметь конструкторы. AbstractMap обеспечивает защищенный модифицированный конструктор без параметра, что означает, что только его подкласс может получить доступ (конечно, это сам абстрактный класс, а другие классы не могут быть созданы напрямую), то есть только его подкласс может назвать этот конструктор без параметра.
Интерфейс входа определяется внутри интерфейса карты. Этот интерфейс представляет собой внутреннюю реализацию карты карты для поддержания пары клавиш клавиш значения ключей, а значение ключа хранится в этой карте. AbstractMap реализует этот внутренний интерфейс, их всего два: один из них является изменчивым SimpleEntry, а другой - неизменная SimpleImmutableEntry.
Public Static Class SimpleTentry <K, V> реализует запись <K, V>, Java.io.serializable
Реализуется интерфейс Map.Entry <K, V> и сериализован (может быть сериализован).
Его метод относительно прост, все из которых являются операциями приема значений и хранения значений. Определение значения ключа является окончательной модификацией, что означает, что это неизменная ссылка. Кроме того, его метод setValue немного особенный. Значение, сохраненное не сохраненное значение, а старое значение возвращалось. Что вам нужно изучить, так это методы равных и хэшкодов, которые он переписывает.
public boolean equals (Object o) {if (! (o encessOf map.Entry)) // Чтобы определить, имеют ли параметры типа Map.Entry, если равны, первое, что нужно сделать, это быть тем же типом возврата false; Map.Entry <?,?> E = (map.Entry <?,?>) O; // Принудительное тип объекта к типу map.Entry, параметр использует "?" Вместо «k, V», потому что тип универсального будет стерта во время выполнения. Компилятор не знает, что такое тип K и V, return eq (key, e.getkey ()) && eq (value, e.getValue ()); // ключ и значение вызовывают метод эквалайзера для суждения соответственно, а равные равны при возврате туре. } Частный статический логический уравнение (объект O1, объект O2) {return o1 == null? O2 == NULL: O1.Equals (O2); // Этот трехместный оператор также очень прост, но следует отметить, что, хотя O1 и O2 являются типами объектов здесь, на методе Equals типа объекта ссылается «==», поэтому не думайте, что здесь есть проблема, потому что на самом деле тип O1 может быть строкой, хотя он преобразуется в объект, поэтому метод строки#по-прежнему вызывается, когда вызывает метод Equals. }Чтобы правильно переписать метод Equals и быть правильно использованным, вам обычно нужно переписать метод хэшкода.
public int hashcode () {return (key == null? 0: key.hashcode ()) ^ (значение == null? 0: value.hashcode ()); // Когда значения ключа и значения не являются нулевыми, хэшкод будет XORED. }Public Static Class SimpleImmutableEntry <K, V> реализует запись <K, V>, Java.io.serializable SimpleImmutableTentry
Запись, определенная как неизменная, на самом деле неизменна, поскольку она не обеспечивает метод setValue, и, естественно, не может быть изменен с помощью метода SetValue, когда доступ к нескольким потокам доступно одновременно. По сравнению с SimpleEntry, его переменные элемента ключа и значения определяются как конечные типы. Вызов метода SetValue выставит исключение UnsupportedOperationException.
Его равные и методы хэшкода соответствуют простому.
Затем проверьте, какие методы в интерфейсе карты реализованы AbstractMap Abstract Class.
Public Int Size ()
Метод входа определяется на карте, которая возвращает коллекцию SET Map.Entry. Метод размера сбора наборов называется напрямую, который составляет размер карты.
Общественный логический Isempty ()
Вызовите приведенный выше метод размера, равный 0, он пуст.
Общественный логический содержит (объектный ключ)
Реализация этого метода относительно проста. Призывая метод входа, итератор сбора SET получают и пересекают с ключом параметра. Карта может храниться как значение ключа NULL. Поскольку Key = NULL хранится на карте со специальным специальным хранилищем (значение HashCode не может быть рассчитано), мы также сделали способ определить, пуста ли клавиша параметра.
Общественный логический содержит Value (значение объекта)
Эта реализация метода согласуется с SontainsKey.
public v get (объектный ключ)
Эта реализация метода аналогична приведенным выше двум, разница в том, что вышеупомянутое равное логическому, и этот метод возвращает значение.
public v Put (k Key, V значение)
Метод хранения пар клавишных значений в карте не реализован подробно, и UnsupportedOperationException будет непосредственно брошено.
public v удалить (ключ объекта)
Удалите пару клавишных клавиш, указанную в карте, через клавишу параметра. Этот метод также очень прост. Он также пересекает сборку SET Map.Entry через итератор, находит соответствующее значение ключа и удаляет Map.Entry, вызывая метод удаления итератора#.
public void putall (map <? Extends k,? Extends v> m)
Этот метод также очень прост для пересечения входящей карты и просто вызовать метод PUT, чтобы сохранить ее.
Public void Clear ()
Вызовите метод входа, чтобы получить коллекцию SET, а затем вызовите метод set#clear (), чтобы очистить его.
public set <k> keyset ()
Возвращает набор коллекций значений ключей карты. AbstractMap определяет переменную члена «Transient Set <k> Keyset». В JDK7 переменная Keyset модифицирована летучими, но в JDK8 она не модифицирована летучей. В комментариях к переменной Keyset это объясняется, что метод доступа к этим полям не синхронизирован сам по себе, а нестабильный не может гарантировать безопасность потока. Реализация метода Keyset интересна.
Прежде всего, подумайте об этом методе, чтобы вернуть набор набора значений ключей. Естественно, мы можем подумать о простом методе реализации, пройти массив записей и взять значение ключа и поместить его в набор набора, аналогично следующему коду:
public set <k> keyset () {set <k> ks = null; for (map.Entry <k, v> inpit: intrySet ()) {ks.Add (entry.getKey ()); } вернуть ks;}Это означает, что каждый раз, когда называется метод Keyset, он будет пересекать массив входа, и эффективность будет значительно снижена, когда объем данных большой. Я должен сказать, что исходный код JDK очень хорошо написан, и он не принимает метод обхода. Если вы не пересекаете вход, как вы узнаете, что карта добавила в настоящее время пара клавишных значений ключей?
Ответ состоит в том, чтобы переосмыслить новую коллекцию пользовательских наборов внутри метода Keyset, а метод итератора переписан в этой коллекции пользовательских наборов. Вот ключ. Метод итератора возвращает интерфейс итератора, и здесь он переосмысливается. Вызывая метод входа, а затем вызывая его метод итератора. Ниже анализируется в сочетании с кодом:
public set <k> keyset () {set <k> ks = keyset; // Определенный набор переходных процессов <k> keyset if (ks == null) {// Первый вызов определенно нулевой, создайте набор примера через следующий код ks = new Abstractset <k> () {// Создать пользовательский набор публичный итератор <k> iterator () {// rewryte Метод итератор intertaitor iterator <k> {// reimple Iterator <intpirt <K, v >> i = intrySet (). Iterator (); // Создать набор коллекций итератор итератор public boolean hasnext () {return i.hasnext (); // Суждение о значении ключа является суждением вступления} public k next () {return i.next (). GetKey (); // Следующее значение ключа состоит в том, чтобы взять вход#getKey} public void remoad () {i.Remove (); // Удалить значение ключа, удалить запись}}; } public int size () {// Перезаписный набор#Метод размера возвращает AbstractMap.This.Size (); // Значение ключа состоит в том, насколько велика вся карта, поэтому просто вызовите метод размера этого класса. Это внутренний класс. Используйте это ключевое слово, чтобы представить этот класс напрямую. Это должно указывать, что метод размера в AbstractMap называется. Без этого это означает, что это статический статический метод} public boolean isempty () {// Переписываемый набор#isempty метод возвращает AbstractMap.This.isempty (); // Для того, есть ли значение ключа, это означает, является ли карта пустой, поэтому это просто для того, чтобы назвать метод Isempty этого класса} public void clear () {// Переписанный набор#clear method AbstractMap.This.Clear (); // очистить значение ключа, это просто для того, чтобы очистить карту, поэтому это просто для того, чтобы назвать прозрачный метод этого класса} public boolean содержит (Object k) {// Переписать набор#Содержит метод возврата AbstractMap.This.containSkey (k); // Судите, содержит ли установленные данные k, что означает, содержит ли карта значение ключа, поэтому просто вызовите метод содержимого в этом классе}}; keyset = ks; // Присвоить эту коллекцию пользовательских наборов с переменной Keyset. При вызове метода Keyset в будущем, потому что Keyset не нулевой, вам просто нужно вернуться напрямую. } вернуть ks;Я думаю, что это очень умная реализация. Хотя этот метод вращается вокруг значения ключа, он может быть фактически реализован в сочетании с входом без пересечения записи. В то же время упоминается выше, что вызов метода итератора входа#, который является наилучшей практикой метода шаблона. Поскольку входной комплекс не реализован в AbstractMap, но оставлен на его подкласс для завершения, но метод Keyset может быть реализован с помощью «алгоритма скелета», который является шаблоном метода шаблона.
Общественная коллекция <v> ценности ()
Для метода значений вы можете полностью обратиться к Keyset. Они имеют такой же эффект, поэтому я не буду повторять его здесь, чтобы сохранить пространство.
Общественный абстрактный набор <entry <K, v >> intrySet ()
Абстрактный метод передается его подклассу, что указывает на то, что этот метод не особенно «общий».
Общественный логический равен (объект o)
Карта предусматривает, что это только тогда, когда ключ и значение каждой пары клавиш на карте соответствуют одному за другим, вернуть true. В методе сначала судите простые условия. Если ссылки равны, верните истину напрямую. Если параметр o не является типом карты, верните False напрямую. Если число двух карт отличается, верните False напрямую. Только тогда будет перечислять массив входа и сравнить, соответствуют ли ключ и значение во входе одно за другим. Метод прост, но это дает нам вдохновение. В условном решении мы должны сначала судить о простых основных, а затем судить о сложных.
public int hashcode ()
Перепишите метод Equals в классе объекта, а также необходимо переписать хашкод. Реализация HashCode AbstractMap заключается в том, чтобы добавить значения HashCode All Map.Entry (здесь SimpleTentry или SimpleImmutableEntry) к концу, и конечная сумма используется в качестве значения хэшкода карты.
public String toString ()
Об этом методе нечего сказать, он должен извлечь все пары ключевых значений и использовать StringBuilder, чтобы их сплачивать.
защищенный объект клон () бросает клоненотсупорт
Реализуйте мелкую копию, поскольку это неглубокая копия переменной клавиши и значений, предотвращая проблемы, вызванные двумя мелкими копиями.