Как будет много объектов в реальной разработке проекта. Java предоставляет структуру сбора для решения таких проблем Занятия находятся в пакете java.util, а список 1 описывает отношения между классом коллекции.
Листинг 1. Отношения между классом сбора
Коллекция
├List
│dlinkedList
│laarraylist
│orvector
│ KSTACK
└Set
Карта
Бхаштабл
Phashmap
Sweakhashmap
Интерфейс коллекции
Интерфейс коллекции
Коллекция является самым основным интерфейсом коллекции. Некоторые коллекции позволяют одни и те же элементы и поддерживают элементы сортировки, в то время как другие не работают. JDK не предоставляет классы, непосредственно унаследованные от коллекции. Все классы, которые реализуют интерфейс сбора, должны предоставлять два стандартных конструктора. Последний конструктор позволяет пользователям копировать коллекцию.
Как пройти каждый элемент в сборе?
Независимо от фактического типа сбора, он поддерживает метод итератора (). Типичное использование следующего:
Итератор IT = collection.iterator ();
Два интерфейса интерфейса коллекции являются списком и установлены.
Основной метод, предоставленный интерфейсом коллекции:
1. Boolean Add (Object o) Добавить объект в коллекцию;
2. Boolean удалить (объект o) Удалить указанный объект;
3. int size () возвращает количество элементов в текущей коллекции;
4. Boolean содержит (объект o) Найти, есть ли указанные объекты в наборе;
5. boolean isempty () определить, пуст ли набор;
6. Итератор итератор () вернуть итератор;
7. Boolean содержит (коллекция c) Найти, есть ли элементы в наборе C в наборе;
8. Boolean Addall (Collection C) добавляет все элементы в коллекции C в коллекцию;
9. void clear () удалить все элементы в наборе;
10. void Removeall (Collection C) Удалить элементы в наборе c -разбирательству из коллекции;
11. void retainall (collection c) Удалить элемент, который не включает в коллекцию C из коллекции.
Список интерфейса
Список - это упорядоченный сбор, который может точно управлять положением каждой вставки элемента с помощью этого интерфейса. Пользователи могут использовать индексы (позиция элементов в списке, аналогично ставкам массива) для доступа к элементам в списке, что аналогично массиву Java. В отличие от набора, который будет упомянут ниже, список позволяет одни и те же элементы.
В дополнение к методу итератор (), который необходим для интерфейса сбора, List также предоставляет метод ListIterator () для возврата интерфейса ListOtrator. По сравнению со стандартным интерфейсом итератора, Listotrator имеет некоторые методы, такие как add (), позволяя таким функциям, как добавление, удаление, настройка элементов, вперед или назад. Обычно используемые классы для реализации списков интерфейсы включают LinkedList, ArrayList, Vector и Stack.
Основной метод, предоставленный интерфейсом списка:
1. void add (int index, элемент объекта) добавляет объект в указанном месте;
2. Boolean Addall (Int Interns, Collection C) добавляет элемент набора C в указанную позицию;
3. Object get (int index) возвращает элемент, указанный в назначенной позиции в списке;
4. Индекс (объект o) возвращает положение первого элемента o;
5. Object RemoveInt (int index) Удалить элемент указанной позиции;
6. Набор объектов (int indexex, элемент объекта) Замените элементы на индексе положения элемента элемента, чтобы вернуть заменяемый элемент.
Карта интерфейс
Карта не унаследовала интерфейс Colleg. Карта обеспечивает отображение от ключа к значению. Интерфейс карты предоставляет 3 набора представлений.
Основной метод, предоставленный картой:
1.
2. Boolean удалить (объект o) удаляет объект;
3. Поместите (клавишу объекта, значение объекта) добавить клавишу и значение.
Случайный интерфейс
Интерфейс Randomaccess - это интерфейс логотипа, который не обеспечивает самого метода. Основная цель этого интерфейса - определить те реализации списков, которые могут поддерживать быстрый случайный доступ. Любая реализация списка на основе массива реализует интерфейс Raodomaccess, в то время как реализация связанного списка недоступна. Поскольку только массив может выполнять быстрый случайный доступ, случайный доступ к связанному списку должен пройти связанный список. Следовательно, преимущество этого интерфейса заключается в том, что в приложении вы можете знать, может ли обработанный объект списка, который обрабатывается быстрый и случайный доступ, чтобы выполнить различные операции для разных списков для повышения производительности программы.
Введение
LinkedList Class
LinkedList реализует интерфейс списка и разрешает нулевые элементы. Кроме того, LinkedList обеспечивает дополнительные GET, удалить, вставить и другие методы для использования данных в первом или хвосте LinkedList. Эти операции создают LinkedList, которые можно использовать в качестве стеков, очередей (очередь) или двух очередей. Обратите внимание, что LinkedList не имеет метода синхронизации. Одним из решений является построение синхронного списка при создании списка.
List List = collections.synchronizedlist (новый LinkedList (…));
Arraylist Class
ArrayList реализует массив переменной. Это позволяет всем элементам, включая NULL. Размер, Isempty, Get, Set и другие методы - это время работы, но накладные расходы Add - это постоянная обмена.
Каждый экземпляр ArrayList имеет емкость (емкость) для хранения размера массива элементов хранения. Когда необходимо вставить большое количество элементов, вы можете вызвать метод EncureCapacty, прежде чем вставить для увеличения емкости ArrayList для повышения эффективности вставки. Как и LinkedList, ArrayList также является темой -not -Synchronized (Unsynchronized).
Основной метод, предоставленный ArrayList:
1. Boolean Add (Object O) добавляет указанный элемент в конце списка;
2. Boolean Add (int indexex, элемент объекта), чтобы указать положение, чтобы добавить указанный элемент в список;
3. Boolean Addall (Collection C) добавляет указанный набор в конце списка;
4. Boolean Addall (int interleg, коллекция c) Добавить указанную коллекцию в указанном месте в списке;
5. Boolean Clear () Удалить все элементы в списке;
6. Boolean Clone () вернуться к копии списка списка;
7. Boolean содержит (объект o) определить, содержит ли он элементы в списке;
8. Boolean EnsureCapacity (int M) увеличивает способность списка.
9. Object get (int index) вернуть элемент, указанный в списке в списке;
10. Indexof (Object Elem) в списке обнаруживает торги указанного элемента;
11. int size () Возвращает количество элементов текущего списка.
Векторный класс
Вектор очень похож на ArrayList, разница в том, что вектор синхронизируется по потокам. Итератор, созданный Vector, хотя итератор, созданный ArrayList, представляет собой один и тот же порт, поскольку вектор синхронизируется, когда был создан и используется один итератор, другой поток изменил состояние вектора (например, добавление или удаление некоторых из некоторых из некоторых из Состояние элементы), когда называется метод итератора, будет выброшено condurentModificationException, поэтому исключение должно быть запечатлено.
Стекк класс
Stack унаследовал от вектора и реализовал стек, который впоследствии был продвинутым. Stack предоставляет 5 дополнительных методов для использования вектора в качестве стеков. В дополнение к основным методам Push и POP, есть также метод PEEK, чтобы получить элемент верхней части стека. куча. Обратите внимание, что стек - это пустой стек сразу после его создания.
Установить класс
SET - это коллекция без повторяющихся элементов, то есть любые два элемента E1 и E2 имеют e1.equals (e2) = false. Есть нулевой элемент в большинстве случаев. Очевидно, что конструктор набора имеет условие ограничения, и ввод параметров сбора не может включать дублирующие элементы. Обратите внимание, что вы должны тщательно управлять переменными объектами.
Хэштерный класс
Hashtable наследует интерфейс карты и реализует хэш-таблицу на основе картирования ключей. Любой не нулевой объект может использоваться в качестве ключа или значения. Добавьте данные для использования PUT (ключ, значение), и выберите данные для использования GET (ключ).
Hashtable регулирует производительность через два параметра начальной емкости и коэффициента нагрузки. Коэффициент загрузки по умолчанию 0,75 лучше достигает баланса времени и пространства. Увеличение коэффициента нагрузки может сэкономить пространство, но соответствующее время поиска увеличится, что повлияет на такие операции, как Get и Plat. Используйте простой пример хэштата, чтобы поместить три числа 1, 2 и 3 в хэштату.
Список 2. Хэш -пример
Hashtable numbers = new Hashtable (); ::::::::::::::::: ::::::::::::::::: :::::::: :::::::::);
Если нам нужно взять число, например, 2, мы можем использовать соответствующий ключ, чтобы его вывести, и код показан в списке 3.
Список 3. Прочтите данные из Hastable
Integer n = (integer) numbers.get ("два");
Поскольку объект ключа будет определяться путем вычисления ее функции распределения для определения положения соответствующего значения, любой объект в качестве ключа должен реализовать методы HashCode и равно. Hashcode и Equals Methods унаследованы корневой объект. = True, их хэшкод должен быть одинаковым, но если эти два объекта разные, их хэшкод не обязательно отличается. Метод hashcode (), который может ускорить работу хэш -таблиц.
Если один и тот же объект имеет различный хэшкод, будут неожиданные результаты для работы хэш -таблицы (с нетерпением ждем возвращения NULL). Вместо того, чтобы просто писать один из них.
Hashmap Class
HashMap похож на хэштату. Однако, когда HashMap рассматривается как метод сбора (значения () () может быть возвращен), он пропорционален итеративному подразделяющему времени и способности HashMap. Следовательно, если производительность операции итерации очень важна, не устанавливайте способность инициализации HashMap слишком высокой или устанавливайте слишком низкий в параметре коэффициента нагрузки.
Sleedhashmap Class
Sleedhashmap - это улучшенный хэшмап, который «слабый ссылка» для ключа.
Практика класса коллекции
ArrayList, Vector и LinkedList все реализованы из AbstractList, а AbstractList напрямую реализует интерфейс списка и расширяется от AbstarctCollection. ArrayList и Vector используют массивы для реализации. LinkedList использует круговую двухстороннюю структуру данных, которая подключена к серии элементов таблицы.
Когда спрос ArrayList на емкость превышает размер текущего массива, его необходимо расширить. В процессе расширения пропускной способности будет выполнено большое количество операций репликации массива, и когда массив будет воспроизведен, наконец будет вызван метод System.ArrayCopy (). Поскольку LinkedList использует структуру связанного списка, ему не нужно поддерживать размер емкости. Из -за непрерывности массива, когда элемент всегда увеличивается в конце, расширение массива и репликация массива могут генерироваться только тогда, когда пространство недостаточно.
ArrayList основан на массиве, а массив -это непрерывное пространство памяти. LinkedList не снижает производительность из -за вставки данных.
Каждый эффективный элемент ArrayList должен быть реорганизован после удаления операций, и чем выше позиционирование положения удаленного элемента, тем больше накладные расходы во время реорганизации массива. LinkedList должен удалить промежуточные данные для половины списка.
Список 4. ArrayList и LinkedList Используйте код
Import Java.Util.Arraylist; = New Object (); M -CurrentTimillis (); (); 0, obj2); 1000; D = System.currentttimemillis (); Начинать);}}
Список 5. Запустить вывод
639129669690015
HashMap - это сделать ключевой алгоритм, а затем сопоставить значение хэша по адресу памяти, чтобы напрямую получить данные, соответствующие ключу. В Hashmap, базовая структура данных использует массив, так называемый адрес памяти -это индекс метки массива. Высокая производительность HashMap должна быть обеспечена следующим образом:
1. Хэш -алгоритм должен быть эффективным;
2. Алгоритм хэша значения по адресу памяти (индекс массива) быстр;
3. Соответствующее значение может быть получено непосредственно на основе адреса памяти (индекс массива).
HashMap на самом деле является массивом связанных списков. Как упоминалось ранее, механизм реализации, основанный на связанном методе списка, основанном на HashMap, до тех пор, пока методы HashCode () и HASH () достигаются достаточно, чтобы максимально уменьшить возникновение конфликта, тогда операция HashMap Почти эквивалентно случайному доступу к массиву массивов. Однако, если метод hashcode () или hash () плохо достигнут, в случае большого количества конфликтов, HashMap фактически деградируется в нескольких связанных списках, что эквивалентно связанному списку для операции Hashmap На этот раз производительность очень плохая.
Функциональным недостатком HashMap является его расстройство, которое хранится в элементах в Hashmap. Если вы хотите сохранить порядок ввода, вы можете вместо этого использовать LinkedHashmap.
LinkedHashmap наследует от HashMap и имеет высокую эффективность.
HashMap может работать PUT () и get () так же быстро, как алгоритм хэш. TreeMap обеспечивает совершенно другую реализацию карты. С точки зрения функции, TreeMap имеет более мощную функцию, чем HashMap. Производительность TreeMap немного ниже, чем HashMap. Если вам нужно сортировать элементы в разработке, вы не можете реализовать эту функцию с помощью HashMap. LinkedHashmap основан на порядок элемента, введенного в сбору или последовательный порядок доступ к доступу.
LinkedHashmap отсортируется в соответствии с порядок увеличения или доступа элемента, в то время как TreeMap отсортируется в соответствии с ключом элемента.
Список 6 показывает, что код демонстрирует порядок бизнес -логики с использованием TreeMap.
Листинг 6. TreeMap реализует сортировку
Импорт Java.util.iterator; name; (O.Score> this.score) {return -1;} return 0;} @OverridePublic String toString () {StringBuffer SB = new StringBuffer (); ; (); Студент S1 = новый студент ("1", 100); студент S2 = новый студент ("2", 99); студент S3 = новый студент ("3", 97); студент S4 = новый студент ("4 ", 91); map.put (s1, new StudentDetailInfo (s1)); map.put (s2, new studentdetailinfo (s2)); map.put (s3, new studentdetailinfo (s3)); map.put (s4, New StudentDetailInfo (S4)); Студент) iterator.next (); Карта). +map.get (key));} System.out.println ("formap End"); .hasNext ();) {Студент-ключ = (Студент) ITRATOR. );
Список 7. запустить вывод
Имя: 4 Оценка: 91-> 4 Подробная информация: 3 Оценка: 97-> 3 Подробная информация Ubmap EndName: 4 Оценка: 91-> 4. > 2 Подробная информация Ubmap EndName: 1 Оценка: 100-> 1 Detail InformationsUbmap End
Sleashhashmap характеризуется сами по себе, что, если в этом ключе нет другого Cither, за исключением его цитат, то эта карта автоматически отбросит значение. Как показано в листинге 8, код показывает два объекта карты, один из них является HashMap, а другой - SleedHashmap, одновременно поместите его в два объекта на две карты. Null, они указывают на NULL. Причина этой ситуации заключается в том, что для объекта A, когда хэшмап удаляется и A до нуля, в дополнение к SleedHashmap, нет указателя на A, кроме A, указывающего на NULL, есть указатель, указанный на B в HashMap, So Sleedhashmap сохранит объект B.
Список 8. Wieakhashmap Пример кода
Импорт java.util.hashmap; String ("A"); , B, B, B, B, B, B, B, B, B, B, B, B, B, B, "BBB"); , BBB "); .Entry en = (map.entry) izext (); . Итератор (); +En.getValue ());
Листинг 9. Запуск вывода
Карта: B: bbbweakmap: b: bbb
SleedHashmap в основном достигает цели удаления внутренних неиспользованных записей через EnsungestaleEntries, тем самым достигая цели автоматического выпуска памяти. По сути, до тех пор, пока доступ к содержанию Sleedhashmap, эта функция будет вызвана для достижения внутренней записи, на которую больше не упоминается. Но если предварительный мастер становится слабым, и он не получил доступ к Sleedhashmap ранее в GC, разве невозможно освободить память?
Список 10. SleedHashmaptest1
Импорт java.util.arraylist; ] [] >> maps = new ArrayList <SleedHashmap <byte [] [], byte [] [] >> (); byte [] []> d = new Sleedhashmap <byte [] [], byte [] []> (); .Add (D);
Не изменяйте какое -либо параметр JVM, работающий в списке 10, показанного в списке операций.
Список 11. Запустить вывод
241242243exctation в потоке "Main" java.lang.outofmemoryerror: Java Heap Spaceat Sleedhashmaptest1.main (Sleedhashmapst1.java:10)
Конечно же, Sleedhashmap не выпустил ненужную память в настоящее время. Код, показанный в листинге 12, не будет иметь переполнения памяти.
Список 12. SleedHashMaptest2
Импорт java.util.arraylist; ] [] >> maps = new ArrayList <SleedHashmap <byte [] [], byte [] [] >> (); byte [] []> d = new Sleedhashmap <byte [] [], byte [] []> (); .Add (D); .Get (j) .size ());}}}}
Результаты операции обнаружили, что тестовый выход был нормальным, а проблема переполнения памяти больше не произошла.
В целом, SleedHashmap не является объектом, который не используется внутри, если вы что -то делаете, но выпустите внутренний неиспользованный объект, когда вы получаете доступ к нему.
SleedHashmap осознает слабую ссылку, потому что его запись <K, V> унаследована от SleaseReference <k>
В определении класса и конструкторе SleaseHashmap $ intpring <K, V>, это показано в списке 13.
Список 13. Определение класса SleedHashmap
Частная статическая запись класса <K, v> Extends SleadReference <k> реализует map.entry <k, v> inpit (k -ключ, значение v, rewarequeue <k> queue, int hash, internation <K, v> Next) {Super (Key, queue);
Обратите внимание, что он строит заявление отца -класса: «Супер (ключ, очередь);»; В System.gc () массив байтов в ключе переработана, а значение остается (значение тесно связано с входом, вход связан в карте, а карта связана в ArrayList).
Каждый раз, когда у меня есть новый SleedHashmap каждый раз, после операции пута, хотя GC перерабатывает байтовый массив в ключе ShoodReference и уведомил о событии для ссылки, нет соответствующих действий, чтобы вызвать ShoodThashmap, чтобы обрабатывать Queue, поэтому SleaseReferer Ключ все еще существует в SleedHashmap, и его соответствующее значение также существует.
Когда значение будет очищено? ? Проверьте исходный код SleedHashmap. Следовательно, эффект заключается в том, что ключ был очищен, когда GC, а значение посещало SleedHashmap после того, как ключ был очищен.
Слабайский класс не -синхронизированный. Следовательно, независимо от того, находится ли это в картировании или за пределами отображения, ключ автоматически удаляется только после того, как повторный заряд мусора удаляет слабую ссылку на определенную клавишу. Следует отметить, что объект Value в SleedHashmap поддерживается общей привлекательностью. Следовательно, вы должны быть осторожны, чтобы убедиться, что объект Value не будет прямо или косвенно ссылаться на свои собственные ключи, потому что это предотвратит сброс напряжения. Обратите внимание, что объект значения может косвенно процитировать соответствующий ключ через сам SleedHashMap, что означает, что на объект определенного значения может быть сильно ссылаться другие объекты клавиш, а объект значения, связанный с объектом ключа, обращается к первым, чтобы ссылаться на первое Один из них.
Один из способов решить эту проблему - упаковать саму ценность в ShideReferens перед вставкой, например: M.Put (Key, New SleaseReference (значение)), а затем используйте Get to Dissection. "Оборочное устройство быстро не удалось. После создания итеративного устройства, если отображение изменено из структуры, если только собственный метод удаления или добавления итератора и итераторы будут изменены в любое время и в любом случае, и итератор будет Бросьте condurentModificationException. Следовательно, перед лицом одновременной модификации итератор быстро потерпел неудачу полностью, а не риск неопределенного поведения в произвольно в любое время в будущем.
Обратите внимание, что мы не можем гарантировать, что итератор не удается.
Подводя итог, чтобы подвести итог кода введения и экземпляра в предыдущей комплексной, мы можем знать, что если оно включает в себя стеки, очереди и т. Д., Мы должны рассмотреть возможность использования списка. Для таких операций, как быстрое вставка и удаление элементов, следует использовать LinkedList. Если вам нужно быстро и случайно получить доступ к элементам, вам следует использовать ArrayList. Если программа находится в одной резьбовой среде или доступ только в одном потоке, учитывая асинхронные классы, она более эффективна. Если несколько потоков могут использовать класс одновременно, следует использовать синхронизированный класс. Обратите особое внимание на работу хэш -таблиц. Попробуйте вернуть интерфейс вместо фактических типов, таких как возвратный список вместо ArrayList, поэтому, если ArrayList должен быть заменен на LinkedList в будущем, клиент не должен меняться.
Эта статья предназначена только для обмена уровнем приложения.