Списки на java

1.1 Контейнеры и коллекции

Контейнерами или коллекциями называют классы, которые позволяют хранить и обрабатывать много объектов сразу. Вы уже знаете две разновидности контейнеров — массивы и списки.


В Java есть несколько десятков коллекций, каждая из которых хранит элементы своим специфическим способом. Вот некоторые из них:

Тип коллекции Класс Описание
Список
Связный список
Вектор
Стэк (стопка)
Множество
Очередь
Карта/Словарь

Тут есть некоторая неоднозначность с именами. Хотя в большинстве языков программирования все эти структуры данных принято называть коллекциями, в Java это не так. В языке Java некоторые из этих классов реализуют интерфейс , в то время как другие — нет.

Поэтому коллекции разделились на коллекции в широком смысле и коллекции в узком смысле (только те, которые реализуют интерфейс ).

Поэтому, чтобы не путаться, коллекциями называют только коллекции в узком смысле (классы должны реализовывать интерфейс ). Это все коллекции типа , и . Коллекции же в широком смысле принято называть контейнерами. К ним относятся классы типа и массивы.

4.3 Знакомство с классами

Думаю, вы уже убедились, что использовать классы, написанные другими программистами, очень удобно. А как насчет написания собственных классов?

Как понять, когда и где вам нужен собственный класс и как его сделать?

Программисты обычно создают свои классы, когда хотят ввести в программу новую сущность. Звучит не очень понятно? Тогда попробую объяснить, но начну издалека.

Группировка данных

Если немного упростить, можно сказать, что объект в Java — это область памяти, которая содержит переменные, объявленные в классе (поля класса). Или по-другому — переменные, объединенные в группы.

Допустим, в вашей программе нужно хранить координаты точек и метод, чтобы вывести их на экран. Это можно сделать с помощью массивов. Например, так:

Было бы намного удобнее, если бы у нас сразу был тип для хранения всей информации по точкам: , , . Ну а если в Java такого типа нет, можно его создать самостоятельно.

Для этого напишем код создания класса :

Тогда код выше можно переписать в виде:

А теперь давайте добавим в класс метод, который будет выводить информацию об объекте:

Тогда класс примет вид:

Мы красиво спрятали внутрь точки (класс ) информацию о ее координатах и метод, который выводит состояние объекта-точки на экран.

Классы — это ответ на управление сложностью программы. Большая программа становится проще, когда ее разбивают на много маленьких классов.

Конструкторы ArrayList

  1. ArrayList()

    Пустой конструктор с начальной емкостью внутреннего массива = 10.

    В угловых скобках желательно указать тип хранимых значений. В примере выше — .

  2. ArrayList(Collection <? extends E> c)

    Конструктор принимает другую коллекцию, создавая новый массив с элементами переданной коллекции:

    Порядок элементов в новом списке будет совпадать с исходным.

  3. ArrayList(int initialCapacity)

    В качестве параметра конструктора выступает значения начального размера внутреннего массива.

    Если в массиве, который лежит в основе ArrayList, закончилось место при добавлении новых элементов, создается новый массив большего размера, и данные копируются в него. Если при написании кода заранее известно, что в массиве будет обрабатываться большое количество элементов, в целях оптимизации следует указать большее значение.

Searching for an element in a list

    • boolean contains(Object): returns trueif the list contains the specified element.
    • int indexOf(Object): returns the index of the first occurrence of the specified element in the list, or -1 if the element is not found.
    • int lastIndexOf(Object): returns the index of the last occurrence of the specified element in the list, or -1 if the element is not found.
if (listStrings.contains("Hello")) {
	System.out.println("Found the element");
} else {
	System.out.println("There is no such element");
}
int firstIndex = linkedNumbers.indexOf(1234);
int lastIndex = listStrings.indexOf("Hello");

equals()equals()

Concurrent lists

ArrayList LinkedListCollections.synchronizedList()

List<Object> unsafeList = new ArrayList<Object>();
List<Object> safeList = Collections.synchronizedList(unsafeList); 
synchronized (safeList) {
	Iterator<Object> it = safeList.iterator();
	while (it.hasNext()) {
		System.out.println(it.next());
	}
} 

Related Java List tutorials:

  • Sorting List Collections Examples
  • Sorting a list by multiple attributes example
  • Java Collections Utility Examples for Changing Order and Content of a List
  • Class diagram of List API

Other Java Collections Tutorials:

  • Java Set Collection Tutorial and Examples
  • Java Map Collection Tutorial and Examples
  • Java Queue Collection Tutorial and Examples
  • 18 Java Collections and Generics Best Practices

Notify me of follow-up comments

Send Cancel

Comments 


123

#14Harmeet Singh2020-04-19 02:42int firstIndex = linkedNumbers.indexOf(1234);int lastIndex = listStrings.indexOf(«Hello»);Please check the lastindex method, i think it should use lastIndexOf(Object) method Quote

#13manu2020-03-26 02:00bcz 1) as we know we can not create an object for interface2) we can use super class referance to teh sub class objects Quote

#12Rajababu2019-07-01 07:50Beacause list is interface we can use multiple classes with list interface.With ArrayList:ArrayList al = new ArrayList();With List:Listaa=new ArrayList();Lista1=new LinkedList();Lista2=new Vector();List a3=new Stack();we can use all this with list interface Quote

#11Batuhan2019-06-05 06:37I have a question. A bit irrelevant. A polymorphism question.In the first example the code goesList listStrings = new ArrayList();Why do we do that? Why declaring a List object and creating an ArayList objectWhy is thisAnimal cat = new Cat();Why don’t we say ArrayList arrayList = new ArrayList();I would really appreciate if anyone explained it to me. Quote

#10Anil Chaurasiya2018-11-29 16:10I loved it. The way you wrote and explained was amazing…Last but not least, good job. Quote

123

Refresh comments list

Sorting a list

Collections.sort()

List<String> listStrings = new ArrayList<String>();
listStrings.add("D");
listStrings.add("C");
listStrings.add("E");
listStrings.add("A");
listStrings.add("B");
System.out.println("listStrings before sorting: " + listStrings);
Collections.sort(listStrings);
System.out.println("listStrings after sorting: " + listStrings); 
listStrings before sorting: 
listStrings after sorting: 

ComparablecompareTo()sort()ArrayList LinnkedList

listStrings.sort(null);	// sort by natural ordering of the elements

Sorting List Collections Examples

Overview of List collection

Java Collections FrameworkInteger java.util.ListListArrayListLinkedListList

    • ArrayList: An implementation that stores elements in a backing array. The array’s size will be automatically expanded if there isn’t enough room when adding new elements into the list. It’s possible to set the default size by specifying an initial capacity when creating a new ArrayList. Basically, an ArrayList offers constant time for the following operations: size, isEmpty, get, set, iterator, and listIterator; amortized constant time for the add operation; and linear time for other operations. Therefore, this implementation can be considered if we want fast, random access of the elements.
    • LinkedList: An implementation that stores elements in a doubly-linked list data structure. It offers constant time for adding and removing elements at the end of the list; and linear time for operations at other positions in the list. Therefore, we can consider using a LinkedList if fast adding and removing elements at the end of the list is required.

ArrayListLinkedList,VectorListVectorArrayListLinkedListListArrayListLinkedList

  • ArrayList  quick example:
    List<String> listStrings = new ArrayList<String>();
    listStrings.add("One");
    listStrings.add("Two");
    listStrings.add("Three");
    listStrings.add("Four");
    System.out.println(listStrings);
     
  • LinkedList  quick example:
    List<String> listStrings = new LinkedList<String>();
    listStrings.add("Five");
    listStrings.add("Six");
    listStrings.add("Seven");
    listStrings.add("Eight");
    System.out.println(listStrings); 

ArrayList LinkedList.

Recommended Posts:

  • ArrayList of ArrayList in Java
  • Java.util.ArrayList.addall() method in Java
  • Java.util.Arraylist.indexOf() in Java
  • Java.util.ArrayList.add() Method in Java
  • Arraylist.contains() in Java
  • Array of ArrayList in Java
  • Arraylist lastIndexOf() in Java with example
  • How to get ArrayList from Stream in Java 8
  • ArrayList isEmpty() in Java with example
  • ArrayList trimToSize() in Java with example
  • Get first and last elements from ArrayList in Java
  • ArrayList vs. HashMap in Java
  • ArrayList vs LinkedList in Java
  • Array vs ArrayList in Java
  • Reverse an ArrayList in Java
  • Custom ArrayList in Java
  • Vector vs ArrayList in Java
  • Synchronization of ArrayList in Java
  • Initialize an ArrayList in Java
  • ArrayList spliterator() method in Java

5.3 Практические примеры работы со списком в Java

Давайте напишем несколько примеров работы со списками:

Занесём в список все четные числа от 1 до 20:

Код Примечания
Создаем объект-список цикл по всем числам 1..20 если число делится на 2 без остатка, то добавить его в список.

А теперь выведем все элементы списка на экран:

Код Примечания
Создаем объект-список

цикл по всем числам 1..20 если число делится на 2 без остатка, то добавить его в список.

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

Удаление элементов:

А теперь давайте удалим все элементы, которые делятся на 4

Обратите внимание, что сразу после удаления одного элемента из списка позиции остальных элементов меняются

Код Примечания
Создаем объект-список

цикл по всем числам 1..20 если число делится на 2 без остатка, то добавить его в список. цикл от нуля до размера списка

если элемент списка делится на 4 без остатка то а) удаляем элемент б) уменьшаем счетчик , чтобы на следующем витке цикла опять попасть на тот же элемент

Допустим, вам нужно удалить 3 последних элемента списка.

Как это сделать неправильно:

Код Примечания
Создаем объект-список

в списке у нас 10 элементов: 2,4, 6,… 20

(в списке осталось 9 элементов) (в списке осталось 8 элементов) (в списке осталось 7 элементов)

После удаления 7 и 8 элементов, в списке останется всего 8 элементов. Поэтому 9-й элемент удалить не получится — в программе возникнет ошибка.

Как нужно было удалить элементы:

Вариант 1 Вариант 2

Элементы нужно или удалять с конца, или просто в одном и том же месте, а после каждого удаления элементы будут сдвигаться на один.

Double-Brace Initialization

In several places, we can find a method called ‘double brace initialization’ which looks like:

The name ‘double brace initialization’ is quite misleading. The syntax may look compact and elegant but it dangerously hides what is going under the hood.

There isn’t actually a ‘double brace’ syntax element in Java, those are two blocks formatted intentionally this way.

With the outer braces, we declare an anonymous inner class which will be a subclass of the ArrayList. Inside these braces, we can declare the details of our subclass.

As usual, we can use instance initializer blocks and that is where the inner pair of braces come from.

The brevity of this syntax is tempting however it’s considered an anti-pattern.

To read more about double-brace initialization, have a look at our article here.

4.2 Оператор new

Чтобы создать объект определенного класса, нужно воспользоваться оператором . Вот как выглядит создание объекта в общем случае:

Где — это имя класса для объявления и имя класса создаваемого объекта. Переменная — это переменная, в которую сохраняется ссылка на созданный объект. А — это параметры метода создания объекта.

Какие именно могут быть параметры у объекта, решают программисты, которые пишут класс объекта.

Вы уже создавали объекты ранее, и даже пользовались именно этой конструкцией. Надеюсь, вы не забыли?

— это создание переменной типа . — это создание объекта типа . Ну а оператор присваивания заносит в переменную ссылку на новый созданный объект.


Во второй строке мы вызываем метод у объекта с помощью переменной , которая хранит ссылку на объект типа .

Примеры создания объектов:

Код Описание
Создает объект типа
Создает объект типа
Создает объект типа : контейнер на элементов типа

Созданные объекты называют объектом класса или экземпляром класса, а класс — классом объекта. Например: переменная хранит ссылку на экземпляр класса .

Create From a Stream (Java 8)

We can easily convert a Stream into any kind of Collection.

Therefore with the factory methods for Streams, we can create and initialize lists in one line:

We should mark here that Collectors.toList() doesn’t guarantee the exact implementation of the returned List.

There’s no general contract about the mutability, serializability or thread-safety of the returned instance. Therefore our code shouldn’t rely on any of these properties.

Some sources highlight that Stream.of(…).collect(…) may have larger memory and performance footprint than Arrays.asList() but in almost all cases, it’s such a micro-optimization that there is little difference.

3.1 Класс ArrayList

Сегодня мы изучим класс . Это первый класс из так называемых коллекций. Коллекции в Java — настолько обширная и полезная вещь, что ей посвящен целый квест на JavaRush.

Чтобы полностью понять, как устроены коллекции и все нюансы их работы, нужно сначала изучить ООП, интерфейсы, наследование, азы многопоточности и многое другое.

Поэтому сегодня мы просто познакомимся с самой простой коллекцией. Зато на достаточно глубоком уровне, чтобы вы понимали, как ей пользоваться и как она работает. Итак, встречайте: коллекция .

Предыстория

Начну с небольшой предыстории. Программистам очень не нравилось одно свойство массива — его размер нельзя изменять. Что делать, если нужно сохранить в массиве ещё три элемента, а свободное место только одно?

Единственным решением проблемы нехватки места в массиве было создание массива очень большого размера, чтобы все элементы туда точно поместились. Но это часто приводило к нерациональному расходу памяти. Если обычно в массиве хранилось два-три элемента, но был хотя бы мизерный шанс, что там их будет 100, приходилось создавать массив на 100 элементов.

И что же придумали программисты? Они написали класс (массив-список), который выполнял ту же работу, что и (массив), но мог изменять свой размер.

Класс ArrayList

Само название происходит из двух слов: Array + List. — это массив, а — список.

Внутри каждого объекта типа хранится обычный массив элементов. Когда вы считываете элементы из , он считывает их со своего внутреннего массива. Когда записываете — записывает их во внутренний массив.

У класса ArrayList отсутствуют все недостатки, которые есть у массивов. Он умеет:

  • Хранить элементы определенного типа
  • Динамически менять размер списка
  • Добавлять элементы в конец списка
  • Вставлять элементы в начало и середину списка
  • Удалять элементы из любого места списка

Подробнее — ниже:

Creating a new list

List<Object> listAnything = new ArrayList<Object>();
List<String> listWords = new ArrayList<String>();
List<Integer> listNumbers = new ArrayList<Integer>();
List<String> linkedWords = new LinkedList<String>(); 
List<Integer> listNumbers = new ArrayList<>();
List<String> linkedWords = new LinkedList<>(); 

infer the actual type parameterList List.of(e1, e2, e3…)

List<Integer> listNumbers = List.of(1, 2, 3, 4, 5, 6);

List List.of()var

var employees = new ArrayList<Employee>();

var ArrayList

List<Integer> listNumbers = new ArrayList<>(1000); 
List<Integer> listNumberOne;	// existing collection
List<Integer> listNumberTwo = new ArrayList<>(listNumberOne); 

listNumberTwo listNumberOne

Introduction

In this quick tutorial, we’ll investigate how can we initialize a List using one-liners.

2. Create From an Array

We can create a List from an array and thanks to array literals we can initialize them in one line:

We can trust the varargs mechanism to handle the array creation. By that, we can write more concise and readable code:

The result instance of this code implements the List interface but it isn’t a java.util.ArrayList nor a LinkedList. Instead, it’s a List backed by the original array which has two implications.

Although, the class’s name happens to be ArrayList but in the java.util.Arrays package.

2.2. Shared Reference

The original array and the list share the same references to the objects:

3. Create From a Stream (Java 8)

We can easily convert a Stream into any kind of Collection.

Therefore with the factory methods for Streams, we can create and initialize lists in one line:


We should mark here that Collectors.toList() doesn’t guarantee the exact implementation of the returned List.

There’s no general contract about the mutability, serializability or thread-safety of the returned instance. Therefore our code shouldn’t rely on any of these properties.

Some sources highlight that Stream.of(…).collect(…) may have larger memory and performance footprint than Arrays.asList() but in almost all cases, it’s such a micro-optimization that there is little difference.

4. Factory Methods (Java 9)

In JDK 9, several convenient factory methods have been introduced for collections:

One important detail is the returned instances are immutable. Beyond that, the factory methods have several advantages in space efficiency and thread safety.

This topic is explored more in this article.

5. Double-Brace Initialization

In several places, we can find a method called ‘double brace initialization’ which looks like:

The name ‘double brace initialization’ is quite misleading. The syntax may look compact and elegant but it dangerously hides what is going under the hood.

There isn’t actually a ‘double brace’ syntax element in Java, those are two blocks formatted intentionally this way.

With the outer braces, we declare an anonymous inner class which will be a subclass of the ArrayList. Inside these braces, we can declare the details of our subclass.

As usual, we can use instance initializer blocks and that is where the inner pair of braces come from.

The brevity of this syntax is tempting however it’s considered an anti-pattern.

To read more about double-brace initialization, have a look at our article here.

6. Conclusion

Modern Java offers several options to create a Collection in one line. The method we chose is almost entirely down to personal preference, rather than technical reasoning.

An important takeaway is that, although it looks graceful, the anti-pattern of anonymous inner class initialization (a.k.a. ‘double brace’) has many negative side-effects.

As always, the code is available over on GitHub.

3.4 Поиск элементов в коллекциях

Метод

Метод возвращает минимальный элемент коллекции

Код Вывод на экран
На экран будет выведено:

Метод

Метод возвращает максимальный элемент коллекции

Код Вывод на экран
На экран будет выведено:

Метод

Метод подсчитывает? сколько раз в коллекции встречается элемент

Код Вывод на экран
На экран будет выведено:

Метод

Метод ищет в предварительно отсортированной коллекции элемент . Возвращает номер найденного элемента или число меньше нуля, если элемент не найден.

Код Вывод на экран
На экран будет выведено:

Метод

Метод возвращает , если у переданных коллекций вообще нет общих элементов.

Код Вывод на экран
На экран будет выведено:

Basic List operations: adding, retrieving, updating, removing elements

Adding elements to a List:add(Object)add(index, Object) addAll()

List<String> listStrings = new ArrayList<String>();
// OK to add Strings:
listStrings.add("One");
listStrings.add("Two");
listStrings.add("Three");
// But this will cause compile error
listStrings.add(123);
List<Number> linkedNumbers = new LinkedList<>();
linkedNumbers.add(new Integer(123));
linkedNumbers.add(new Float(3.1415));
linkedNumbers.add(new Double(299.988));
linkedNumbers.add(new Long(67000)); 
listStrings.add(1, "Four"); 
listStrings.addAll(listWords); 
listStrings.addAll(2, listWords); 

listWords rdlistStringsRetrieving elements from a Listget()ndth

String element = listStrings.get(1);
Number number = linkedNumbers.get(3); 

LinkedList

LinkedList<Number> numbers = new LinkedList<Number>();
// add elements to the list...
// get the first and the last elements:
Number first = numbers.getFirst();
Number last = numbers.getLast(); 

getFirst()getLast()LinkedList Updating elements in a Listset(index, element)

listStrings.set(2, "Hi"); 

rdRemoving elements from a Listremove(index)remove(Object)

    • Remove the element at the 3rd position in the list:
      listStrings.remove(2);
      If the specified index is out of range (index < 0 or index >= list size), a java.lang.IndexOutOfBoundsException is thrown.
    • Remove the String element “Two” in the list:
      listStrings.remove("Two"); 

Notes remove(Object)

    • It compares the specified object with the elements in the list using their equals() method, so if you use your own defined object type, make sure it implements the equals() method correctly.
    • It only removes the first occurrence of the specified element in the list (i.e. if a list contains duplicate elements, only the first element is removed).
    • It returns true if the list contained the specified element, or falseotherwise. Thus it’s recommended to check return value of this method, for example:
      if (listStrings.remove("Ten")) {
      	System.out.println("Removed");
      } else {
      	System.out.println("There is no such element");
      }
       

clear()

listStrings.clear(); 

С этим читают