CodeGym /Java Blog /무작위의 /자바 목록
John Squirrels
레벨 41
San Francisco

자바 목록

무작위의 그룹에 게시되었습니다
Java Collection Framework에는 데이터 구조 작업을 위해 이를 구현하는 매우 유용한 인터페이스와 클래스가 포함되어 있습니다. 가장 중요한 JDK 프레임워크 중 하나라고 할 수 있습니다. List 인터페이스는 매우 유명합니다. 프로그래밍에서 모든 종류의 목록이 없으면 필수 불가결하기 때문입니다. 이 기사에서는 이 인터페이스, Java List 메소드 및 구현에 대해 다룰 것입니다.

자바 목록 인터페이스

목록의 가장 중요한 점은 순서가 지정된 컬렉션이라는 것입니다. 시퀀스라고 부를 수도 있습니다. Java에서 목록은 동종입니다. 즉, 목록의 요소는 동일한 데이터 유형입니다. Java List 인터페이스는 Collection에서 상속되며 모든 작업을 상속합니다. 그 외에도 목록에서 다음 작업도 가능합니다.
  • 위치 액세스. 각 요소에는 인덱스가 있으며 위치에 따라 조작할 수 있습니다. 목록에서. 즉, 요소를 추가, 제외 및 수정할 수 있습니다.
  • 찾다. 콘텐츠로 목록에서 요소를 찾고 해당 인덱스를 반환할 수 있습니다.
  • 반복. List의 순차적 특성으로 인해 반복 방법(listIterator)을 사용할 수 있습니다.
  • 범위보기. sublist 메서드는 목록에서 임의의 범위 작업을 수행합니다.

자바 리스트 메소드

위의 작업은 Java List 인터페이스의 메서드에 노출됩니다. 다음은 그 중 일부입니다.
방법 설명
추가(E 요소) 이 메서드는 이 목록의 끝에 요소 요소를 추가합니다.
추가(int 인덱스, 요소) 이 메서드는 목록의 특정 인덱스에 요소를 추가합니다. 필요한 매개변수가 전달되면 목록 끝에 요소를 추가합니다.
addAll(int 인덱스, 컬렉션 컬렉션) 주어진 컬렉션의 모든 요소를 ​​목록에 추가합니다. 단일 매개변수가 전달되면 지정된 컬렉션의 모든 요소를 ​​목록 끝에 추가합니다.
크기() 목록의 크기(목록에 있는 요소의 수량)를 반환합니다.
get(정수 인덱스) 지정된 인덱스에 있는 요소를 반환합니다.
set(int 인덱스, 요소) 지정된 인덱스의 요소를 새 요소로 교체하고 새 요소로 교체된 요소를 반환합니다.
제거(정수 인덱스) 지정된 인덱스에서 요소를 제거합니다.
제거(요소) 목록에서 지정된 요소의 첫 번째 항목을 제거합니다.
분명한() 목록에서 모든 요소를 ​​제거합니다.
indexOf(요소) 주어진 요소의 첫 번째 항목을 반환합니다. 요소가 목록에 없으면 -1 을 반환합니다 .
lastIndexOf(요소) 주어진 요소의 마지막 항목을 반환합니다. 요소가 목록에 없으면 -1 을 반환합니다 .
같음(요소) 주어진 요소의 동등성을 목록의 요소와 비교하십시오.
해시 코드() 주어진 목록의 해시코드 값을 반환합니다.
비었다() 목록이 비어 있는지 확인합니다. 목록이 비어 있으면 true를 반환합니다.
포함(요소) 목록에 요소가 포함되어 있는지 확인합니다 . 목록에 요소가 포함되어 있으면 true를 반환합니다.
containsAll(컬렉션 모음) 목록에 모든 요소 컬렉션이 포함되어 있는지 확인합니다.
sort(비교 비교기) 주어진 비교자를 기준으로 목록의 요소를 정렬합니다.
하위 목록(int fromIndex, int toIndex) 지정된 fromIndex(포함)와 toIndex(배타적) 사이에 있는 이 목록 부분의 보기를 반환합니다.

목록 구현

List는 인터페이스이기 때문에 프로그램은 이를 구체적으로 구현해야 합니다. Java Collections API에서 다음 목록 구현 중에서 선택할 수 있습니다.
  • java.util.ArrayList
  • java.util.LinkedList
  • java.util.Vector
  • java.util.Stack
ArrayList라는 List 인터페이스의 가장 인기 있는 구현입니다. 빈도는 훨씬 적지만 실제 작업에서 LinkedList를 사용하는 것을 여전히 볼 수 있지만 벡터와 스택은 오랫동안 도덕적으로 쓸모없게 되었기 때문에 고대 레거시 코드가 있는 프로젝트에서만 찾을 수 있습니다.

목록 인터페이스 선언

다음 방법 중 하나로 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는 동적 배열이며 그 안에는 일반 배열이 있습니다. 이 배열은 데이터 저장소 역할을 합니다. ArrayList는 참조 유형, 타사 클래스, 문자열, 출력 스트림 및 기타 컬렉션을 포함한 모든 개체만 저장합니다. 래퍼 클래스는 기본 데이터 유형을 ArrayList에 저장하는 데 사용됩니다. 목록을 만들 때 크기를 즉시 설정할 수 있지만 대부분의 경우 그렇지 않습니다. 기본적으로 ArrayList 크기는 10입니다. ArrayList에 새 요소를 추가하는 것은 어떤 모습입니까? 우선, 내부 배열에 충분한 공간이 있는지와 하나 이상의 요소가 맞는지 확인하기 위해 검사가 시작됩니다. 공백이 있으면 목록의 끝, 즉 마지막 요소 다음에 오는 셀에 새 요소가 추가됩니다. 인덱스는 arraylist.size()가 됩니다. 목록을 방금 만들었는데 비어 있으면 arrayList.size() = 0을 의미합니다. 따라서 인덱스가 0인 셀에 새 요소가 추가됩니다. 공간이 충분하지 않으면 새 요소가 추가됩니다. 배열은 크기(OldArray의 크기 * 1.5) + 1로 ArrayList 내부에 생성됩니다. 동일한 원리로 목록 중간에 삽입이 발생하지만 동시에 삽입된 요소를 따르는 모든 요소는 오른쪽으로 이동했습니다. 따라서 배열에 5개의 요소가 있고 셀 번호 2(즉, 세 번째)에 요소를 삽입해야 하는 경우 0 및 1 배열 요소가 제자리에 남아 있고 새 요소가 셀 2에 나타납니다. 그 전임자는 세 번째 셀로 이동합니다. 인덱스가 0인 셀에 새 요소가 추가됩니다. 공간이 충분하지 않은 것으로 판명되면 크기(OldArray의 크기 * 1.5) + 1로 ArrayList 내부에 새 배열이 생성됩니다. 원칙적으로 목록 중간에 삽입이 발생하지만 동시에 삽입된 요소 뒤에 오는 모든 요소가 오른쪽으로 이동합니다. 따라서 배열에 5개의 요소가 있고 셀 번호 2(즉, 세 번째)에 요소를 삽입해야 하는 경우 0 및 1 배열 요소가 제자리에 남아 있고 새 요소가 셀 2에 나타납니다. 그 전임자는 세 번째 셀로 이동합니다. 인덱스가 0인 셀에 새 요소가 추가됩니다. 공간이 충분하지 않은 것으로 판명되면 크기(OldArray의 크기 * 1.5) + 1로 ArrayList 내부에 새 배열이 생성됩니다. 원칙적으로 목록 중간에 삽입이 발생하지만 동시에 삽입된 요소 뒤에 오는 모든 요소가 오른쪽으로 이동합니다. 따라서 배열에 5개의 요소가 있고 셀 번호 2(즉, 세 번째)에 요소를 삽입해야 하는 경우 0 및 1 배열 요소가 제자리에 남아 있고 새 요소가 셀 2에 나타납니다. 그 전임자는 세 번째 셀로 이동합니다. 목록 중간에 삽입이 발생하지만 동시에 삽입된 요소를 따르는 모든 요소가 오른쪽으로 이동합니다. 따라서 배열에 5개의 요소가 있고 셀 번호 2(즉, 세 번째)에 요소를 삽입해야 하는 경우 0 및 1 배열 요소가 제자리에 남아 있고 새 요소가 셀 2에 나타납니다. 그 전임자는 세 번째 셀로 이동합니다. 목록 중간에 삽입이 발생하지만 동시에 삽입된 요소를 따르는 모든 요소가 오른쪽으로 이동합니다. 따라서 배열에 5개의 요소가 있고 셀 번호 2(즉, 세 번째)에 요소를 삽입해야 하는 경우 0 및 1 배열 요소가 제자리에 남아 있고 새 요소가 셀 2에 나타납니다. 그 전임자는 세 번째 셀로 이동합니다.

Java List 예제(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());

   }
}
다음은 이 프로그램의 출력입니다.
init 이전의 myList 크기 = 0 [Alex, Tanya, Veloxy, Alex, Andrew] init 이후의 myList 크기 = 5 [Alex, Tanya, Veloxy, Alex, Andrew, Ihor] 내 목록의 크기 = 6 0 Andrew 이후 Alex 중 하나를 제거하면 Alex가 하나만 있습니다: [Alex, Tanya, Veloxy, Andrew, Ihor] Tanya clear method = 0 이후의 벡터 크기 종료 코드 0으로 프로세스 완료

LinkedList 작동 방식

LinkedList에서 요소는 실제로 동일한 체인의 링크입니다. 저장하는 데이터 외에도 각 요소에는 이전 요소와 다음 요소에 대한 링크가 있습니다. 이러한 링크를 사용하면 한 요소에서 다른 요소로 이동할 수 있습니다. 반복자는 양방향 순회를 지원합니다. 목록의 시작, 중간 및 끝에 가져오기, 제거 및 삽입을 위한 메서드를 구현합니다. null을 포함한 모든 요소를 ​​추가할 수 있습니다. LinkedList는 List뿐만 아니라 Deque라는 두 가지 인터페이스를 구현합니다. 이는 null을 포함하여 모든 요소에서 양방향 대기열을 생성하는 기능을 제공합니다. 연결 리스트에 있는 각 객체는 노드(노드)입니다. 각 노드에는 이전 노드와 다음 노드에 대한 링크인 요소가 포함되어 있습니다. 실제로 연결된 목록은 일련의 노드로 구성되며 각 노드는 생성될 때 정의된 유형의 객체를 저장하도록 설계되었습니다.

코드 예


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]

벡터 코드 예

벡터는 또한 동적 배열 구현이며 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 [Alex, Tanya, Andrew] [Alex, Tanya, Andrew, Alex, Ihor] 벡터의 크기 = 5 벡터의 첫 번째 요소 = Alex 2 3 [Alex, Tanya, Andrew, Alex, Ihor] 클리어 메소드 이후의 벡터 크기 = 0 프로세스가 종료 코드 0으로 종료됨

자바 스택 클래스 코드 예제


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);
   }
}
스택에는 add()remove() 메서드뿐만 아니라 푸시 및 팝도 있으며 이러한 데이터 구조에 대한 고전적입니다. 스택은 "선입선출" 규칙을 따릅니다. 이것은 앤티큐입니다. 따라서 팝 작업은 스택에 마지막으로 배치된 요소를 팝합니다. 다음은 예제의 출력입니다.
참 거짓 [Paul, Johnny, Alex, Andrew] [Paul, Johnny, Alex]
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION