List - Vector - LinkedList


リストセット


-リストは、オブジェクトを一列に並べた構造です.
-インデックス管理オブジェクトとして
:=保存可能順序、重複保存可能オブジェクト
:中央に削除がある場合は、後ろからドラッグ&ドロップします.
:インデックスを使用してオブジェクトを検索および削除する機能を提供します.
-頻繁に挿入を削除する場合は推奨されません
-nullも保存できます.この場合、インデックスはオブジェクトを参照しません.

ArrayList

  • リストインタフェースの実装クラス
  • 配列とArrayListは、インデックス管理オブジェクトを使用して類似しています.
    アレイのサイズは作成時に変更されませんが、ArrayListではストレージ容量を超えたときに自動的にストレージ容量が増加します.
  • new ArrayList<사용할 타입>(객체를 저장할 수 있는 용량)
    // String 타입을 30개 저장할 수 있게끔 생성
    List list = new ArrayList<String>(30);
    // 하지만 리스트는 자동으로 저장 용량이 늘어나기 때문에
    // 크기를 정하지 않고도 생성 가능하다
    List list1 = new ArrayList<String>();

    ArrayListの作成

    // List list = new List() -> 불가. List는 인터페이스이기 때문에
    // 다형성을 이용해 하위에 있는 ArrayList로 객체 생성해준다
    // ArrayList<리턴형태>
    // 아래 예시는 Integer형태의 값을 저장하는 ArrayList를 만들것이라는 선언
    List list = new ArrayList<Integer>();

    保存値はです。add

    list.add(10);
    list.add(20);
    // 중복으로 넣는것도 가능하다
    list.add(30);
    list.add(30);

    検索する内容は。contains/値を削除します。remove()

  • listにオレンジがあるかどうかを検索
  • オレンジがある場合は、2番インデックスの値
  • を削除します.
    if (list.contains("귤")) {
    	System.out.println("가게에 귤이 있습니다");
    	list.remove(2);
    } else {
    	System.out.println("가게에 귤은 없습니다");
    }

    インデックスにすでに値がある場合でも、挿入できます。

    list.add(2, 80);
    System.out.println("2번 인덱스가 다른 값으로 채워지고 값이 밀리는 것을 확인");
    for(int i=0; i<list.size(); i++) {
    	System.out.println("index " + i + "=" + list.get(i));
    }

    リストの大きさを確認したいのですが。size()

    System.out.println("ArrayList의 크기 : " + list.size());

    試用01

    // 사용하려면 객체 생성부터
    // List list = new List() -> 불가. List는 인터페이스이기 때문에
    // 다형성을 이용해 하위에 있는 ArrayList로 객체 생성해준다
    // ArrayList<리턴형태>
    List list = new ArrayList<Integer>();
    		
    // 값 넣어주기
    list.add(10);
    list.add(20);
    // 중복 가능
    list.add(30);
    list.add(30);
    		
    System.out.println("ArrayList의 크기 : " + list.size());
    // 2번 인덱스에 있는 값을 출력하겠다
    System.out.println("2번 인덱스의 값 : " + list.get(2));
    		
    System.out.println();
    		
    // 0번 인덱스의 값을 지우겠다
    list.remove(0);
    // 확인
    System.out.println("값을 지우면 빈 공간은 알아서 뒤에 값이 땡겨져와 채운다");
    for(int i=0; i<list.size(); i++) {
    	System.out.println("index " + i + "=" + list.get(i));
    }
    		
    System.out.println();
    
    // 2번 인덱스에 값 80을 넣어주겠다
    list.add(2, 80);
    System.out.println("2번 인덱스가 다른 값으로 채워지고 값이 밀리는 것을 확인");
    for(int i=0; i<list.size(); i++) {
    	System.out.println("index " + i + "=" + list.get(i));
    }
    		
    		
    System.out.println();
    		
    // 사과 배 귤 바나나
    // 를 넣고 귤이 있는지 확인
    List list1 = new ArrayList<String>();
    list1.add("사과");
    list1.add("배");
    list1.add("귤");
    list1.add("바나나");
    		
    // 있는지 확인하려면
    // .contains(검색할 내용)
    if (list1.contains("귤")) {
    	System.out.println("가게에 귤이 있습니다");
    	list1.remove(2);
    } else {
    	System.out.println("가게에 귤은 없습니다");
    }
    // 위 코드에서 귤이 있다면 귤이 있는 인덱스2번을 지우도록 했으니
    // 이 코드가 실행되면 else의 실행 코드가 수행된다
    if (list1.contains("귤")) {
    	System.out.println("가게에 귤이 있습니다");
    	list1.remove(2);
    } else {
    	System.out.println("가게에 귤은 없습니다");
    }
    				
    System.out.println();
    		
    // 배열에 있는 내용을 모두 삭제
    System.out.println("clear 하기 전 크기 : " + list.size());
    list.clear();
    System.out.println("clear() 후 크기 : " + list.size());
    		
    // 리스트가 비워져있는지 확인하려면
    // .isEmpty()
    boolean listE = list.isEmpty();
    System.out.println(listE);
    		
    System.out.println();
    
    // new ArrayList<사용할 타입>(객체를 저장할 수 있는 용량);
    // new ArrayList<Integer>(30); <= Integer형태의 객체를 30개 저장할 수 있는 용량을 가진다
    List list2 = new ArrayList<Integer>();
    list2.add("사과");
    list2.add("배");
    list2.add("귤");
    list2.add("바나나");
    list2.add("귤");
    		
    // "귤"이 여러개라면 마지막 인덱스를 출력한다
    System.out.println("마지막으로 귤이 들어있는 인덱스 : " + list.indexOf("귤"));
    // 2번인덱스 3번 인덱스 내용 뽑기
    System.out.println(list2.subList(2, 4));
    実行結果

    試用02

    List<String> list = new ArrayList<String>();
    
    // 객체를 순서대로 저장해준다
    list.add("Java");
    list.add("JDBC");
    list.add("Servlet/JSP");
    list.add(2, "Database");
    list.add("iBATIS");
    
    // 저장된 총 개수를 얻기
    int size = list.size();
    System.out.println("총 객체수: " + size);
    System.out.println();
    
    // 2번 인덱스의 객체 얻기
    String skill = list.get(2);
    System.out.println("2: " + skill);
    System.out.println();
    
    // 저장된 총 갯수만큼 돌아
    // 배열의 내용 뽑아오기
    for (int i = 0; i < list.size(); i++) {
    	String str = list.get(i);
    	System.out.println(i + ":" + str);
    }
    System.out.println();
    
    // 값 지워주기
    list.remove(2);
    list.remove(2);
    list.remove("iBATIS");
    
    // 지워진 인덱스는 뒤에있던 값들이 알아서 채워주는 모습
    for (int i = 0; i < list.size(); i++) {
    	String str = list.get(i);
    	System.out.println(i + ":" + str);
    }
    		
    System.out.println();
    
    // 이터레이터 사용해보기
    // 리스트 안에있는 모든 자료들이 출력되었다
    Iterator<String> it = list.iterator();
    // it에 다음 값이 있다면 true / 없다면 false
    // 토큰과 비슷한 느낌..?
    while(it.hasNext()) {
    	System.out.println(it.next());
    }
    実行結果

    試用03


    //学生クラス
    //質問の所定の内容を配列リストに入れる
    //2018学号があるかどうか
    public class A_ArrayListTest {
    	public static void main(String[] args) {		
    		List<Student> list = new ArrayList<Student>();
    		int hakbun = 0;
    		
    		// 값 넣는 곳에 객체 생성
    		list.add(new Student(2021, "홍길동"));
    		list.add(new Student(2020, "최수진"));
    		list.add(new Student(2018, "박현미"));
    		list.add(new Student(2021, "최수영"));
    
    		
    		for(int i=0; i<list.size(); i++) {
    			if (list.get(i).num == 2018) {
    				System.out.println(list.get(i).num);
    				hakbun += 1;
    			} else {
    				continue;
    			}
    		}
    
    		System.out.println("찾으시는 학번에 해당하는 인물은 " + hakbun + "명입니다");
    	}
    }
    
    class Student{
    	int num;
    	String name;
    	
    	public Student(int num, String name) {
    		this.num = num;
    		this.name = name;
    	}
    }
    実行結果
    2018
    찾으시는 학번에 해당하는 인물은 1명입니다

    vector


    ArrayListと同じ内部構造を持つ.
    // 생성 모양도 같다
    List<E> list = new Vector<E>();

    VectorとListの違い


    Vectorは同期メソッドで構成されているため、マルチスレッドはこれらのメソッドを同時に実行することはできません.他のスレッドを実行するには、1つのスレッドだけが実行を完了します.したがって、マルチスレッド環境でオブジェクトを安全に追加、削除できます.
    public class B_VectorEx {
    	public static void main(String[] args) {
    		List<Board> list = new Vector<Board>();
    		
    		list.add(new Board("제목1", "내용1", "글쓴이1"));
    		list.add(new Board("제목2", "내용2", "글쓴이2"));
    		list.add(new Board("제목3", "내용3", "글쓴이3"));
    		list.add(new Board("제목4", "내용4", "글쓴이4"));
    		list.add(new Board("제목5", "내용5", "글쓴이5"));
    		
    		// 내용 모두 출력해보기
    		Iterator<Board> it = list.iterator();
    		while(it.hasNext()) {
    			Board board = it.next();
    			System.out.println(board.subject + "\t" + board.content + "\t" + board.writer);
    		}
    		
    		System.out.println();
    		
    		// 먼저 2번 인덱스를 지워서 "제목3"번 내용이 사라짐
    		list.remove(2);
    		// 한칸씩 당겨와서 새롭게 인덱스 3번이 된 "제목 5"번 내용이 사라지게 된다
    		list.remove(3);
    		
    		for(int i=0; i<list.size(); i++) {
    			Board board = list.get(i);
    			System.out.println(board.subject + "\t" + board.content + "\t" + board.writer);
    		}
    	}
    }
    
    
    class Board {
    	String subject;
    	String content;
    	String writer;
    	
    	public Board(String subject, String content, String writer) {
    		this.subject = subject;
    		this.content = content;
    		this.writer = writer;
    	}
    }
    事実コード
    list.remove(2);
    list.remove(3);
    結果を見ると、この部分は少し混同されていますが、2番インデックス(タイトル3部分)と3番インデックス(タイトル4部分)が消えるべきかどうかは初めて感じました.
    しかし、コードの順序が進むにつれて、2番インデックスの内容が先に削除されるため、3番が自動的に2番に移動し、4番が自動的に3番に移動し、次の3番インデックスが削除される必要がある場合、タイトル5部分がその中にあります.
    実行結果

    LinkedList


  • 使用方法はArrayListと同じです

  • ArrayListは、オブジェクトを内部配列に格納し、インデックスとして管理する.
    LinkedListは前述のように隣接リンクによりチェーンのように管理されている.

  • 中間挿入と中間削除ではArrayListよりも性能が優れている.
  • ArrayList는 뒤쪽 인덱스들을 모두 1씩 증가 또는 감소시키는 시간이 필요하지만
    LinkedList는 앞 뒤 링크정보만 변경하면 되기 때문에
    ArrayList < LinkedList

    速度差の確認


    インデックス0でコンテンツの追加を続行します.
    List<String> list1 = new ArrayList<String>();
    List<String> list2 = new LinkedList<String>();
    		
    long startTime;
    long endTime;
    		
    // 0번 인덱스부터 넣어주기
    System.out.println("인덱스 0번에 계속 추가해주기");
    // 현재 시간을 나노초 단위로 받아온다
    startTime = System.nanoTime();
    for(int i=0; i<100000; i++) {
    	list1.add(0, String.valueOf(i));
    }
    endTime = System.nanoTime();
    System.out.println("ArrayList  걸린시간 : " + (endTime - startTime) + " ns");
    			
    startTime = System.nanoTime();
    for(int i=0; i<100000; i++) {
    	list2.add(0, String.valueOf(i));
    }
    endTime = System.nanoTime();
    System.out.println("LinkdeList 걸린시간 : " + (endTime - startTime) + " ns");
    		
    System.out.println();
    		
    // 마지막 부분에만 새로운 값 계속 붙여주기
    System.out.println("마지막 부분에 값 추가해주기");
    // 현재 시간을 나노초 단위로 받아온다
    startTime = System.nanoTime();
    for(int i=0; i<100000; i++) {
    	list1.add(String.valueOf(i));
    }
    endTime = System.nanoTime();
    System.out.println("ArrayList  걸린시간 : " + (endTime - startTime) + " ns");
    		
    		
    startTime = System.nanoTime();
    for(int i=0; i<100000; i++) {
    	list2.add(String.valueOf(i));
    }
    endTime = System.nanoTime();
    System.out.println("LinkdeList 걸린시간 : " + (endTime - startTime) + " ns");
    運転状態

    単純な計算ではあまり差はないようですが、実行内容が複雑であればあるほど差が大きくなると思います.