Java Collection Framework съдържа много полезни интерфейси и класове, които ги реализират за работа със структури от данни. Може да се каже, че това е една от най-важните JDK рамки. Интерфейсът List е много популярен. защото без всяHowви списъци в програмирането е незаменим. В тази статия ще разгледаме този интерфейс, методите и реализациите на Java List.
Java списък интерфейс
Най-важното нещо за списъка е, че той е подредена колекция. Можете също да го наречете последователност. В Java списъците са хомогенни, тоест елементите на списъка са от един и същи тип данни. Интерфейсът на Java List наследява от Collection, той наследява всички негови операции. Освен тях в List са възможни и следните операции:- Позиционен достъп. Всеки елемент има индекс и може да бъде манипулиран въз основа на тяхната позиция. в списъка. Тоест можете да добавяте, изключвате и модифицирате елементи.
- Търсене. Можете да намерите елемент в списък по съдържанието му и да върнете индекса му.
- Повторение. Последователният характер на List позволява използването на итерационни методи (listIterator).
- Обхват-изглед. Методът подсписък изпълнява операции с произволен диапазон върху списъка.
Списъчни методи на Java
Горните операции са изложени в методите на интерфейса на Java List. Ето някои от тях:Метод | Описание |
---|---|
добавяне (E елемент) | Този метод добавя element елемент в края на този списък. |
add(int индекс, елемент) | Методът добавя елемент към определен индекс в списъка. Ако бъде подаден необходим параметър, той добавя елемента в края на списъка. |
addAll(int индекс, колекция колекция) | Добавя всички елементи в дадената колекция към списъка. Ако бъде подаден един параметър, той добавя всички елементи от дадената колекция в края на списъка. |
размер () | Връща размера на списъка (количеството елементи в списъка). |
get(int индекс) | Връща елемента с посочения индекс. |
набор (int индекс, елемент) | Заменя елементи с даден индекс с новия елемент и връща елемента, който е заменен с нов елемент. |
премахване (индекс) | Премахва елемент от посочения индекс. |
премахване (елемент) | Премахва първото срещане на дадения елемент в списъка. |
ясно() | Премахва всички елементи от списъка. |
indexOf(елемент) | Връща първото срещане на дадения елемент. Ако елементът не присъства в списъка, връща -1 . |
lastIndexOf(елемент) | Връща последното срещане на дадения елемент. Ако елементът не присъства в списъка, връща -1 . |
равно на (елемент) | Сравнете equalsството на дадения елемент с елементите от списъка. |
хеш code() | Връща стойността на хеш codeа на дадения списък. |
празно е() | Проверява дали списъкът е празен. Връща true, ако списъкът е празен. |
съдържа (елемент) | Проверява дали списъкът съдържа елемента . Връща true, ако списъкът съдържа елемента. |
съдържа всички (Колекция колекция) | Проверява дали списъкът съдържа цялата колекция от елементи. |
сортиране (компаратор за сравнение) | Сортира елементите от списъка на базата на дадения компаратор. |
subList(int fromIndex, int toIndex) | Връща изглед на частта от този списък между посочения fromIndex, включително, и toIndex, изключителен. |
Изпълнение на списък
Тъй като List е интерфейс, програмите трябва да създадат конкретна реализация на него. Можете да избирате между следните изпълнения на списък в API за колекции на Java:- java.util.ArrayList
- java.util.LinkedList
- java.util.Vector
- java.util.Stack
Декларация за интерфейс на списък
Можете да декларирате списък в Java програма по един от следните начини:
List<String> myList = new ArrayList();
List myList1 = new ArrayList();
List myList3 = new ArrayList<String>();
ArrayList arrayList = new ArrayList();
Най-добре е да декларирате нов списък чрез интерфейс. По подобен начин можете да декларирате други реализации на List. Най-краткият път:
Vector myVector = new Vector;
LinkedList linkedList = new LinkedList();
Stack stack = new Stack();
С такава декларация типът данни на елементите на такива списъци се определя по време на инициализацията на списъка, тоест когато елементите се добавят там.
List myList = new ArrayList<String>();
Vector myVector = new Vector();
LinkedList linkedList = new LinkedList();
Stack stack = new Stack();
stack.add("Paul");
linkedList.add(1);
myVector.add(1.2f);
myList.add('a');
Сега към нашия стек могат да се добавят само низове, цели числа към linkedList , плаващи към myVector и myList е списък от знаци.
Как работи ArrayList
Ако вече сте запознати с обикновените масиви, донякъде сте запознати и с ArrayList. Всъщност ArrayList е динамичен масив, а вътре в него е обикновен масив. Този масив действа като хранorще на данни. ArrayList съхранява само референтни типове, всяHowви обекти, включително класове на трети страни, низове, изходни потоци и други колекции. Класовете Wrapper се използват за съхраняване на примитивни типове данни в ArrayList. Когато създаваме списък, можем веднага да зададем размера му, но в повечето случаи не го правим. По подразбиране размерът на ArrayList = 10. Как изглежда добавянето на нов елемент към ArrayList? Първо се започва проверка дали има достатъчно място във вътрешния масив и дали ще се побере още един елемент. Ако има място, новият елемент се добавя в края на списъка, тоест в клетката, която следва последния елемент. Неговият индекс ще бъде arraylist.size(). Ако току-що сме създали нашия списък и той е празен, това означава, че arrayList.size() = 0. Съответно към клетката ще бъде добавен нов елемент с индекс 0. Ако се окаже, че няма достатъчно място, нов вътре в ArrayList се създава масив с размер (размера на OldArray * 1.5) + 1. По същия принцип вмъкването се извършва в средата на списъка, но в същото време всички елементи, които следват вмъкнатия елемент, се изместен надясно. Така че, ако имаме 5 елемента в масива и трябва да вмъкнем елемент в клетка номер 2 (т.е. третата), тогава 0 и 1 елемент от масива остават на мястото си, нов елемент се появява в клетка 2 и неговият предшественик отива в третата клетка и т.н. ще бъде добавен нов елемент към клетката с индекс 0. Ако се окаже, че няма достатъчно място, в ArrayList се създава нов масив с размер (размера на OldArray * 1.5) + 1. По същия начин принцип, вмъкването се извършва в средата на списъка, но в същото време всички елементи, които следват вмъкнатия елемент, се изместват надясно. Така че, ако имаме 5 елемента в масива и трябва да вмъкнем елемент в клетка номер 2 (т.е. третата), тогава 0 и 1 елемент от масива остават на мястото си, нов елемент се появява в клетка 2 и неговият предшественик отива в третата клетка и т.н. ще бъде добавен нов елемент към клетката с индекс 0. Ако се окаже, че няма достатъчно място, в ArrayList се създава нов масив с размер (размера на OldArray * 1.5) + 1. По същия начин принцип, вмъкването се извършва в средата на списъка, но в същото време всички елементи, които следват вмъкнатия елемент, се изместват надясно. Така че, ако имаме 5 елемента в масива и трябва да вмъкнем елемент в клетка номер 2 (т.е. третата), тогава 0 и 1 елемент от масива остават на мястото си, нов елемент се появява в клетка 2 и неговият предшественик отива в третата клетка и т.н. възниква вмъкване в средата на списъка, но в същото време всички елементи, които следват вмъкнатия елемент, се изместват надясно. Така че, ако имаме 5 елемента в масива и трябва да вмъкнем елемент в клетка номер 2 (т.е. третата), тогава 0 и 1 елемент от масива остават на мястото си, нов елемент се появява в клетка 2 и неговият предшественик отива в третата клетка и т.н. възниква вмъкване в средата на списъка, но в същото време всички елементи, които следват вмъкнатия елемент, се изместват надясно. Така че, ако имаме 5 елемента в масива и трябва да вмъкнем елемент в клетка номер 2 (т.е. третата), тогава 0 и 1 елемент от масива остават на мястото си, нов елемент се появява в клетка 2 и неговият предшественик отива в третата клетка и т.н.Пример за списък на Java (реализация на Arraylist)
import java.util.*;
public class ArrayListExample2 {
public static void main(String[] args) {
List<String> myFriendsList = new ArrayList();
//we created list of some objects
System.out.println( "the size of myList before init = " + myFriendsList.size());
myFriendsList.add("Alex");
myFriendsList.add("Tanya");
myFriendsList.add("Veloxy");
myFriendsList.add("Alex");
myFriendsList.add("Andrew");
System.out.println(myFriendsList);
System.out.println( "the size of myList after init = " + myFriendsList.size());
myFriendsList.add("Ihor");
System.out.println(myFriendsList);
System.out.println("the size of my list = " + myFriendsList.size());
//here the program will print out the first appearance of "Alex" element
System.out.println(myFriendsList.indexOf("Alex"));
//program will print out the first appearance of "Alex" element starting from the element 0
myFriendsList.remove(3);
System.out.println(myFriendsList.get(3));
System.out.println("after removing one of Alex's there is only one Alex: " + myFriendsList);
System.out.println(myFriendsList.get(1));
myFriendsList.clear();
System.out.println("the size of the vector after clear method = " + myFriendsList.size());
}
}
Ето резултата от тази програма:
размерът на myList преди init = 0 [Alex, Tanya, Veloxy, Alex, Andrew] размерът на myList след init = 5 [Alex, Tanya, Veloxy, Alex, Andrew, Ihor] размерът на моя списък = 6 0 Andrew след премахване на един от Alex има само един Alex: [Alex, Tanya, Veloxy, Andrew, Ihor] Tanya размерът на вектора след изчистване на метода = 0 Процесът завърши с изходен code 0
Как работи LinkedList
В LinkedList елементите всъщност са връзки в една и съща верига. Всеки елемент, освен данните, които съхранява, има връзка към предишния и следващия елемент. Тези връзки ви позволяват да навигирате от един елемент към друг. Итераторът поддържа преминаване в двете посоки. Внедрява методи за получаване, премахване и вмъкване в началото, средата и края на списък. Позволява ви да добавяте всяHowви елементи, включително null. LinkedList имплементира два интерфейса — не само List, но и Deque. Това осигурява възможност за създаване на двупосочна опашка от всяHowви елементи, дори нула. Всеки обект, поставен в свързания списък, е възел (възел). Всеки възел съдържа елемент, връзка към предишния и следващия възел. Всъщност свързаният списък се състои от поредица от възли, всеки от които е проектиран да съхранява обект от типа, дефиниран при създаването му.Пример за code
import java.util.*;
public class LinkedListTest {
public static void main(String args[]){
List myLinkedList= new LinkedList<Integer>();
myLinkedList.add(1);
myLinkedList.add(2);
myLinkedList.add(4);
System.out.println("three added elements: " + myLinkedList);
myLinkedList.add(5);
myLinkedList.remove(1);
System.out.println(myLinkedList);
myLinkedList.size(); //3
//add new element at the specified position:
myLinkedList.add(2,7);
System.out.println(myLinkedList);
}
}
Резултатът е тук:
три добавени елемента: [1, 2, 4] [1, 4, 5] [1, 4, 7, 5]
Пример за векторен code
Vector също е реализация на динамичен масив и е много подобен на ArrayList, но е синхронизиран и има някои наследени методи, които рамката за събиране не съдържа. Ето прост пример за използване на този клас.
import java.util.Vector;
public class VectorExample1 {
public static void main(String[] args) {
Vector vector = new Vector();
System.out.println("the size of the empty vector = " + vector.size());
vector.add("Alex");
vector.add("Tanya");
vector.add("Andrew");
System.out.println(vector);
vector.add("Alex");
vector.add("Ihor");
System.out.println(vector);
System.out.println("the size of the vector = " + vector.size());
System.out.println("the first element of the vector = " + vector.firstElement());
//here the program will print out the first appearance of "Johnny" element
System.out.println(vector.indexOf("Andrew"));
//program will print out the first appearance of "Johnny" element starting from the element 1
System.out.println(vector.indexOf("Alex", 1));
System.out.println(vector);
vector.clear();
System.out.println("the size of the vector after clear method = " + vector.size());
}
}
Резултатът е:
размерът на празния вектор = 0 [Алекс, Таня, Андрю] [Алекс, Таня, Андрю, Алекс, Игор] размерът на вектора = 5 първият елемент на вектора = Алекс 2 3 [Алекс, Таня, Андрю, Alex, Ihor] размерът на вектора след изчистване на метода = 0 Процесът завърши с изходен code 0
Пример за code на клас Java Stack
import java.util.Stack;
public class StackTest {
public static void main(String[] args) {
Stack stack = new Stack();
System.out.println(stack.isEmpty());
stack.add("Paul");
stack.add("Johnny");
stack.add("Alex");
System.out.println(stack.isEmpty());
stack.push("Andrew");
System.out.println(stack);
stack.pop();
System.out.println(stack);
}
}
Stack има не само add() и remove() методи, но и push и pop, те са класически за такава структура на данните. Стекът се подчинява на правилото „първи влязъл, последен излязъл“ — това е такава анти-опашка. Следователно операцията pop изважда елемента, който последно е бил поставен в стека. Ето резултата от нашия пример:
вярно невярно [Пол, Джони, Алекс, Андрю] [Пол, Джони, Алекс]
GO TO FULL VERSION