JavaRush /Java 博客 /Random-ZH /Java 中的数组列表

Java 中的数组列表

已在 Random-ZH 群组中发布
开发时,通常很难预测需要什么大小的数组。因此,程序运行时动态分配内存的功能对于每一种编程语言都是必需的。动态数组是一种其大小在程序执行期间可以改变的数组。在Java中,有一个ArrayList类用于此目的。

什么是ArrayList类?

ArrayList 是 List 接口的可变数组实现,是 Collection Framework 的一部分,负责位于 java.utils 包中的列表(或动态数组)。此类实现所有可选列表操作,并提供控制用于存储列表的数组大小的方法。ArrayList基于动态数组的思想。即,能够添加和删除元素,同时根据需要增加或减少。

ArrayList存储什么?

仅引用类型、任何对象,包括第三方类。字符串、输出流、其他集合。包装类用于存储原始数据类型。

数组列表构造函数

  1. 数组列表()

    初始内部数组容量 = 10 的空构造函数。

    ArrayList<String> list = new ArrayList<>();

    建议在尖括号中指明存储值的类型。在上面的例子中 - String.

  2. ArrayList(集合 <? 扩展 E> c)

    构造函数接受另一个集合,使用传递的集合的元素创建一个新数组:

    ArrayList<String> list2 = new ArrayList<>(list);

    新列表中元素的顺序将与原始列表相同。

  3. ArrayList(int 初始容量)

    构造函数参数是内部数组的初始大小的值。

    ArrayList<String> list2 = new ArrayList<>(10000);

    如果添加新元素时底层 ArrayList 空间不足,则会创建一个更大的新数组并将数据复制到其中。如果您在编写代码时提前知道将在数组中处理大量元素,则应该指定一个更大的值以进行优化。

数组列表方法

    下面是ArrayList的主要方法。

  • 添加(E e)

    将新元素添加到列表末尾。返回boolean值(true - 成功,false - 未添加):

    ArrayList<String> list = new ArrayList<>();
    list.add("Hello");
  • 添加(int索引,E元素)

    element在位置索引处添加一个元素。添加时,指定索引右侧的所有元素都向右移动 1 个位置:

    list.add(0, "Amigo");

    当您需要在列表中的任何位置插入元素时非常有用,但对于 ArrayList 的开头和中间的频繁插入操作可能不是一个很好的选择 - 您应该查看 LinkedList。

  • addAll(集合 <? 扩展 E> 集合)

    按照集合中出现的顺序将集合的所有元素添加到列表中。

  • addAll(int index, Collection <? extends E> 集合)

    Добавление всех элементов collection в список начиная с индекса index. При этом все элементы сдвинутся вправо на количество элементов в списке collection:

    ArrayList<String> secondList = new ArrayList<>();
    secondList.addAll(list);
    System.out.println("First addition: " + secondList);
    secondList.addAll(1, list);
    System.out.println("Second addition in the middle: " + secondList);

    Вывод:

    
    Первое добавление: [Amigo, Hello]
    Второе добавление в середину: [Amigo, Amigo, Hello, Hello]

    Методы addAll() также возвращают boolean-результат добавления элементов.

  • clear()

    Удаление всех элементов из списка.

  • clone()

    returns an object-копию массива:

    ArrayList<String> copyOfSecondList = (ArrayList<String>) secondList.clone();
    secondList.clear();
    System.out.println(copyOfSecondList);

    Вывод:

    
    [Amigo, Amigo, Hello, Hello]

    Следует обратить внимание, что метод clone() возвращает Object, так что после его вызова потребуется сделать приведение к необходимому классу.

    При клонировании создается новый независимый an object. В примере показано, How очищение клонированного an object не сказалось на составе его клона.

  • contains(Object o)

    Проверка наличие an object в списке, возвращает boolean-meaning.

    System.out.println(copyOfSecondList.contains("Hello"));
    System.out.println(copyOfSecondList.contains("Check"));

    Вывод:

    
    true
    false
  • ensureCapacity(int minCapacity)

    Увеличивает размер внутреннего массива, чтобы в него поместилось количество элементов, переданных в minCapacity. Если массив достаточно вместителен, ниHowие преобразования не производятся.

    Этот метод полезен, когда возникает потребность вместить большое количество элементов в несколько итераций. Например, при создании списка емкость его внутреннего массива — 10. При загрузке данных по сети они обрабатываются асинхронно порциями и результаты помещаются в массив. Если ожидается доставка 10 000 элементов, может быть неэффективно просто добавлять эти данные каждый раз: достаточно будет в начале обработки вызвать метод ensureCapaciry(10000) и записывать туда данные по мере необходимости.

  • forEach(Consumer<? super E> action)

    Обработать в цикле ArrayList можно стандартными способами, цикл for:

    // First way
    for(int i = 0; i< secondList.size(); i++) {
       System.out.println(secondList.get(i));
    }
    И цикл for-each:
    // Second way
    for(String s : secondList) {
       System.out.println(s);
    }

    В классе ArrayList есть метод для обработки каждого element, который называется также, forEach. В качестве аргумента передается реализация интерфейса Consumer, в котором нужно переопределить метод accept():

    secondList.forEach(new Consumer<String>() {
       @Override
       public void accept(String s) {
           System.out.println(s);
       }
    });

    Вывод:

    
    Amigo
    Amigo
    Hello
    Hello

    Метод accept принимает в качестве аргумента очередной элемент того типа, который хранит в себе ArrayList. Пример для Integer:

    ArrayList<Integer> integerList = new ArrayList<>();
    integerList.forEach(new Consumer<Integer>() {
       @Override
       public void accept(Integer integer) {
           System.out.println(integer);
       }
    });

    Метод action() будет выполнен для каждого element.

  • get(int index)

    returns элемент, который расположен в указанной позиции списка.

    Если index < 0 or index >= максимального количества элементов списка, будет выброшено исключение IndexOutOfBoundsException.

    Это основной метод получения element из списка, время извлечения element по индексу всегда будет одинаковым, независимо от размера ArrayList.

  • indexOf(Object o)

    Метод возвращает индекс первого вхождения element в списке. Если element не существует в списке, метод вернет -1.

  • isEmpty()

    Метод возвращает true, если список пустой, false в обратном случае.

    Если в списке содержатся только элементы null, метод вернет false. Иными словами, null элементы также учитываются этим методом.

  • iterator()

    returns итератор для списка для последующего использования в цикле or при любой другой обработке.

    Итератор для ArrayList — fail-fast. Это значит, что если коллекция изменится во время итерации, будет выброшено исключение ConcurrentModificationException. Подробнее об fail-fast и его противоположности fail-safe можно почитать здесь.

  • lastIndexOf(Object o)

    Функционал метода похож на indexOf(), отличие в том, что возвращается индекс последнего element в списке.

    Если элемент не найден, также возвращает -1.

  • remove(int index)

    Удаление element в указанной позиции индекса. После удаления сдвигает все элементы влево для заполнения освободившегося пространства.

    Если index<0 or >= количество элементов списка, будет выброшено исключение IndexOutOfBoundsException. В результате метод возвращает элемент, который был удален.

  • remove(Object o)

    Метод удаляет из списка переданный элемент o. Если элемент присутствует в списке, он удаляется, а все элементы смещаются влево. Если элемент существует в списке и успешно удален, метод возвращает true, в обратном случае — false.

  • removeAll(Collection<?> c)

    Если необходимо удалить несколько элементов, не стоит делать это в цикле по условию: гораздо удобнее и безопаснее воспользоваться методом removeAll(). Он принимает коллекцию элементов, которая будет удалена из списка.

    Коллекция должна содержать элементы того же типа, которые хранит целевой список. В обратном случае будет выброшен ClassCastException. Метод вернет true, если список был изменен в результате вызова метода.

  • set(int index, E element)

    Замена element в указанной позиции index на переданный element. Индекс также должен быть больше нуля и меньше индекса последнего element, иначе будет выброшено исключение IndexOutOfBoundsException.

  • size()

    Лучший способ (практически единственный) для того, чтобы узнать размер массива.

  • sort(Comparator<? super E> c)

    Сортировка списка по заданному правилу. Правило сортировки представляет собой реализованный интерфейс Comparator с переопределенным методом compareTo().

    Переопределение нужно, если коллекция содержит an objectы собственного класса. При работе со стандартными классами (Integer, String и так далее) переопределение compareTo() требуется только для нестандартной сортировки.

  • toArray()

    Превращает список в фиксированный массив. Обратите внимание, что метод возвращает массив an objectов (Object[]). Если необходимо привести список в массив an objectов определенного типа, в качестве параметра в метод можно передать массив, куда будут перемещены элементы списков.

    Пример:

    String[] array = new String[secondList.size()];
    secondList.toArray(array);
    for(int i = 0; i< array.length; i++) {
       System.out.println(array[i]);
    }

    Вывод:

    
    Amigo
    Amigo
    Hello
    Hello
Java 中的 ArrayList 方法是在 JavaRush 课程中学习的。第一次相识发生在 Java 语法任务的第七级,即“ArrayList 类”讲座中。在同一级别上有任务集合 -,其中您需要使用 ArrayList 方法,给出了使用 ArrayList 和泛型的其他示例,并解释了 ArrayList 和 LinkedList 之间的区别。这是一个广泛的研究主题,因此,以某种形式,Java 中的 Arraylist(该类的方法只是值得深入研究的整个知识体系的一部分)在以下级别的课程中回归培训内容 - 核心、集合、多线程。我们相信,日常编写代码的练习是编程成功的关键。因此,JavaRush 的 80% 由实践任务、迷你项目和游戏任务组成。所有这些都是数百小时的编码,将有助于提高您的技能。

进一步阅读的链接

  1. 一篇关于动态数组的详细文章,或者更准确地说是关于ArrayList和 的LinkedList文章,它们在 Java 语言中发挥着各自的作用。
  2. 关于从 ArrayList 中删除元素的文章。
  3. 关于在图表和图片中使用 ArrayList 的讲座。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION