JavaRush /Blog Java /Random-VI /Danh sách mảng trong Java

Danh sách mảng trong Java

Xuất bản trong nhóm
Khi phát triển, thường rất khó dự đoán kích thước mảng sẽ cần. Vì vậy, chức năng cấp phát bộ nhớ động trong khi chương trình đang chạy là cần thiết đối với mọi ngôn ngữ lập trình. Mảng động là mảng có kích thước có thể thay đổi trong quá trình thực hiện chương trình. Trong Java có lớp ArrayList cho mục đích này .

Lớp ArrayList là gì?

ArrayList là một triển khai mảng có thể thay đổi của giao diện Danh sách, một phần của Khung sưu tập, chịu trách nhiệm về danh sách (hoặc mảng động) nằm trong gói java.utils. Lớp này thực hiện tất cả các thao tác danh sách tùy chọn và cung cấp các phương thức để kiểm soát kích thước của mảng được sử dụng để lưu trữ danh sách. ArrayList dựa trên ý tưởng về mảng động. Cụ thể là khả năng thêm và xóa các phần tử, đồng thời tăng hoặc giảm khi cần thiết.

ArrayList lưu trữ những gì?

Chỉ các loại tham chiếu, bất kỳ đối tượng nào, kể cả các lớp của bên thứ ba. Chuỗi, luồng đầu ra, các bộ sưu tập khác. Các lớp Wrapper được sử dụng để lưu trữ các kiểu dữ liệu nguyên thủy.

Trình xây dựng danh sách mảng

  1. Lập danh sách()

    Hàm tạo trống có dung lượng mảng bên trong ban đầu = 10.

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

    Nên chỉ ra loại giá trị được lưu trữ trong dấu ngoặc nhọn. Trong ví dụ trên - String.

  2. ArrayList(Bộ sưu tập <? mở rộng E> c)

    Hàm tạo chấp nhận một bộ sưu tập khác, tạo một mảng mới với các phần tử của bộ sưu tập đã truyền:

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

    Thứ tự các phần tử trong danh sách mới sẽ giống như ban đầu.

  3. ArrayList(int intCapacity)

    Tham số hàm tạo là giá trị kích thước ban đầu của mảng bên trong.

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

    Nếu ArrayList cơ bản hết dung lượng khi các phần tử mới được thêm vào, một mảng mới lớn hơn sẽ được tạo và dữ liệu sẽ được sao chép vào đó. Nếu bạn biết trước khi viết mã rằng một số lượng lớn phần tử sẽ được xử lý trong mảng, bạn nên chỉ định giá trị lớn hơn cho mục đích tối ưu hóa.

Phương thức ArrayList

    Dưới đây là các phương thức chính của ArrayList.

  • thêm(E e)

    Thêm một phần tử mới vào cuối danh sách. Trả về boolean-value ( true - thành công, false - chưa được thêm):

    ArrayList<String> list = new ArrayList<>();
    list.add("Hello");
  • add(int chỉ mục, phần tử E)

    Thêm một phần tử elementvào vị trí chỉ mục. Khi thêm, tất cả các phần tử ở bên phải của chỉ mục đã chỉ định sẽ được dịch sang phải 1 vị trí:

    list.add(0, "Amigo");

    Rất hữu ích khi bạn cần chèn một phần tử vào bất kỳ đâu trong danh sách, nhưng đối với các thao tác chèn thường xuyên ở đầu và giữa ArrayList có thể không phải là lựa chọn tốt - bạn nên xem xét LinkedList.

  • addAll(Bộ sưu tập <? mở rộng E> bộ sưu tập)

    Thêm tất cả các thành phần của bộ sưu tập vào danh sách theo thứ tự chúng xuất hiện trong bộ sưu tập.

  • addAll(int chỉ mục, Bộ sưu tập <? mở rộng E> bộ sưu tập)

    Добавление всех элементов 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
Các phương thức ArrayList trong Java được học trong khóa học JavaRush. Lần làm quen đầu tiên diễn ra ở cấp độ thứ bảy của nhiệm vụ Cú pháp Java, tại bài giảng “Lớp ArrayList” . Ở cùng cấp độ, có các tập hợp nhiệm vụ - mộthai , trong đó bạn cần sử dụng các phương thức ArrayList, đưa ra các ví dụ bổ sung về cách làm việc với ArrayList và các generic, đồng thời giải thích sự khác biệt giữa ArrayList và LinkedList. Đây là một chủ đề nghiên cứu sâu rộng, do đó, dưới hình thức này hay hình thức khác, Danh sách mảng trong Java (các phương thức của lớp này chỉ là một phần của toàn bộ kiến ​​thức đáng để đào sâu) sẽ được đề cập lại trong khóa học ở các cấp độ sau đào tạo - Core, Bộ sưu tập, Đa luồng. Chúng tôi tin rằng thực hành viết mã hàng ngày là chìa khóa chính dẫn đến thành công trong lập trình. Do đó, 80% JavaRush bao gồm các nhiệm vụ thực tế, các dự án nhỏ và nhiệm vụ trò chơi. Tất cả điều này là hàng trăm giờ viết mã sẽ giúp cải thiện kỹ năng của bạn.

Liên kết để đọc thêm

  1. Một bài viết chi tiết về mảng động , hay chính xác hơn là về ArrayListLinkedList, thực hiện vai trò của chúng trong ngôn ngữ Java.
  2. Một bài viết về cách loại bỏ các phần tử khỏi ArrayList .
  3. Bài giảng làm việc với ArrayList bằng sơ đồ và hình ảnh .
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION