1. Из соображений производительности предпочтительны массивы.
Массивы используются все реже и реже при разработке проектов, особенно в бизнес-ориентированных разработках. Прежде всего, у массивов не так много методов, предоставляемых такими коллекциями, как List и Set. Алгоритмы поиска и сложения приходится писать самостоятельно, что является проблемой. чрезвычайно громоздко и хлопотно. Поскольку такие коллекции, как List и Set, используют универсальную поддержку, все они хранятся в классах-оболочках, а массивы могут использовать базовые типы данных. Скорость выполнения базовых типов данных намного выше, чем у типов-оболочек. и нижний уровень класса коллекции. Он также реализуется через массивы.
2. При необходимости используйте массивы переменной длины.
При изучении классов коллекций многим людям нравится сравнивать фиксированную длину массива с переменной длиной типа коллекции, но на самом деле такое сравнение неуместно. Наблюдая за реализацией классов коллекций, таких как ArrayList, мы действительно можем это увидеть. так называемая Коллекция становится длиннее. На самом деле она просто тактично расширяет исходный массив.
Скопируйте код кода следующим образом:
public static T[]expandCapacity(T[] data, int newLength) {
// Определяем, является ли это отрицательным значением
новаяДлина = новаяДлина <0 ? 0: новаяДлина;
// Генерируем новый массив, копируем исходное значение и указываем длину
return Arrays.copyOf(data, newLength);
}
Когда требования к производительности высоки, вы можете рассмотреть возможность инкапсуляции массивов. Постоянная длина массива не является для нас оправданием не использовать их.
3. Будьте осторожны с поверхностными копиями массивов.
Неглубокое копирование массива также является основой программирования на Java. Неглубокое копирование означает, что при копировании массива базовый тип копирует значение, а ссылочный тип копирует ссылочный адрес. В приведенном выше примере массив копируется с помощью Arrays.copyOf. — это неглубокая копия, поэтому при ее использовании нужно быть внимательным.
4. При четких сценариях укажите начальную емкость коллекции.
В нашем повседневном использовании, поскольку тип коллекции автоматически изменяется по длине, начальное значение не будет прикреплено к классу коллекции при создании объекта. Давайте возьмем в качестве примера наиболее часто используемый ArrayList. Сначала нам нужно знать, что при создании коллекции. емкость достигнута. В критической точке базовый массив будет Операция copyOf генерирует новый массив, емкость которого в 1,5 раза превышает емкость старого массива, а длина массива по умолчанию равна 10. Когда мы четко знаем, что объем данных, которые нужно поместить в контейнер, велик, мы должны указать начальное значение, чтобы избежать чрезмерных затрат на производительность, вызванных использованием времени copyOf.
5. Выберите подходящий оптимальный алгоритм.
Поиск максимального или минимального значения данных — это самые базовые знания о структуре данных. У нас также есть много способов реализовать его в Java. Вот два алгоритма:
Скопируйте код кода следующим образом:
public static int getMaxByArray(int[] data) {
//Самый простой самореализуемый метод поиска
интервал Макс = данные [0];
for (int i = 1, size = data.length; i < size; i++) {
Макс = Макс <я я: Макс;
}
возврат макс;
}
Скопируйте код кода следующим образом:
public static int getMaxByArray(int[] data) {
// Сначала сортируем, а затем получаем последний бит
Arrays.sort(данные);
вернуть данные [data.length - 1];
}
6. Ловушка преобразования массива базового типа!
Пожалуйста, соблюдайте следующий код
Скопируйте код кода следующим образом:
public static void main(String[] args) {
int[] nums = new int[] { 1, 2, 3, 4, 5 };
Список списка = Arrays.asList(nums);
System.out.println(list.size());
//Размер вывода в данный момент равен 1
}
Результатом, который мы ожидали, было преобразование элементов массива в класс-коллекцию через Arrays.asList, но вопреки ожиданиям мы лишь добавили сам массив и не разделяли значения в массиве. если коллекция Добавление дженериков в список выдаст сообщение об ошибке во время компиляции или изменение самого массива на Integer может решить проблему.
7. Объект List, созданный методом asList, не может быть изменен.
Из приведенного выше примера мы видим, что с помощью метода Arrays.asList можно преобразовать массив в список. Итак, что особенного в списке, возвращаемом методом asList? Обратите внимание, что возвращаемый список не поддерживает изменения, поскольку метод asList возвращает значение. не java.util.ArrayList, а Array Статический закрытый внутренний класс в классе инструмента s, хотя он имеет тот же родительский класс AbstractList, что и ArrayList, но при переопределении add и других методов создается исключение UnsupportedOperationException. Этот статический закрытый внутренний класс реализует только размер, toArray, Get, содержит их. методы
8. Используйте разные методы обхода для разных структур данных.
Пожалуйста, посмотрите следующий код
Скопируйте код кода следующим образом:
public static void main(String[] args) {
//Ниже приведен метод обхода коллекции ArrayList.
целое число = 80 * 10000;
Список arrayList = новый ArrayList (num);
for (int i = 0, size = arrayList.size(); i <size; i++) {
arrayList.get(я);
}
//Ниже приведен метод обхода коллекции LinkedList.
Список linkedList = новый LinkedList();
for (Целое число: linkedList) {
}
}
Зачем выбирать разные методы обхода для LinkedList и ArrayList?
1. Поскольку ArrayList реализует интерфейс RamdomAccess (интерфейс произвольного доступа), интерфейс RamdomAccess является тем же интерфейсом маркировки в Java, что и интерфейсы Serializable и Cloneable, что означает, что к этому классу можно получить произвольный доступ. Для ArrayList это означает, что между данными существует. нет корреляции, то есть две соседние позиции не имеют отношения взаимозависимости и доступны случайным образом.
2. Синтаксис foreach в Java — это вариант использования итератора (итератор). Мы знаем, что итератор — это один из 23 шаблонов проектирования, но итератору необходимо знать временную связь между двумя элементами, иначе как обеспечить поддержку hasNext. Что? Это связано с тем, что предыдущему элементу необходимо определить, существует ли следующий элемент, и эта связь устанавливается принудительно, что нарушает особые характеристики произвольного доступа ArrayList.
3. В LinkedList, поскольку он хранится в форме двусвязного списка, поддержка итераторов очень хороша. Поскольку между двумя соседними элементами в LinkedList существует внутренняя связь, для LinkedList и ArrayList необходимо использовать разные методы обхода. Заинтересованные читатели могут попробовать получить доступ к LinkedList в виде индексов и обнаружат, что между ними существует большой разрыв в эффективности.
8. Выберите ArrayList или LinkedList, если это необходимо.
Основные различия между ArrayList и LinkedList:
1. Базовая структура данных ArrayList представляет собой массив, а базовая структура LinkedList — двусвязный список.
2. При вставке данных, поскольку ArrayList необходимо перемещать элементы массива назад после каждой вставки, LinkedList нужно только изменить головной узел и хвостовой узел для завершения операции вставки, поэтому, когда операции вставки происходят чаще, предпочтительнее использовать LinkedList.
3. При удалении данных, поскольку ArrayList должен поддерживать порядок массива, элементы также необходимо сдвигать назад или вперед после удаления, в то время как LinkedList по-прежнему меняет головные и хвостовые узлы.
4. При обновлении, поскольку LinkedList будет использовать метод полуобхода для поиска позиционированного элемента и последующего его обновления, по сравнению с прямой заменой позиционированных элементов нижнего индекса в ArrayList, ArrayList более эффективен при обновлении.
5.LinkedList может моделировать очередь с помощью таких операций, как addFirst и addLast из LinkedList.
9. Когда списки равны, вам нужно заботиться только о данных элементов
Чтобы мы могли спокойно программировать такие интерфейсы, как List, Set и Map, Java переопределила equlas в классе коллекции, поэтому при сравнении равенства двух коллекций нам нужно только сравнивать, равны ли данные элемента. Это позволяет избежать исправления ошибочного кода Java, вызванного заменой класса реализации коллекции.
Скопируйте код кода следующим образом:
public static void main(String[] args) {
Список arrayList = новый ArrayList();
arrayList.add(1);
arrayList.add(2);
Список linkedList = новый LinkedList();
связанный список.добавить (1);
связанный список.добавить (2);
System.out.println(arrayList.equals(linkedList));
// Не обращайте внимания на конкретную реализацию, результат верен
}