😸

プログラミング自主学習 DAY67 List/Set

2023/08/02に公開

Collection

データ構造(Data Structure)をもとに、オブジェクトを効率的に追加、削除、検索できるように、関連されているインタフェースとクラスをパッケージに含めている。これらをまとめて、
Collection Frameworkと呼ぶ。
Collectionは、Collection Frameworkの最上位インタフェースだ。

List

順序にそってインデックスを付けながら、データーを保存するインタフェース。
可変性があるため、配列に比べ、動的だ。

ListのCRUDメソッドリスト

機能 メソッド 説明
Create boolean add(E e) 一番、最後のインデックスにオブジェクトを追加
void add(int index, E element) 指定したインデックスにオブジェクト追加
Update set(int index, E element) 指定したインデックスにオブジェクトを新しいオブジェクトに変更
Read boolean contains(Object o) 指定したオブジェクトがあるかをチェック
E get(int index) 指定したインデックスのオブジェクトをリターン
isEmpty() コレクションが空いているかをチェック
int size() コレクションの全体オブジェクト数をリターン
Delete void clear() 保存されたすべてのオブジェクトを削除する
E remove(int idex) 指定したインデックスのオブジェクトを削除する
boolean remove(Object o) 指定したオブジェクトを削除する

ArrayList

ArrayListはオブジェクト(要素)の検索に優れているが、要素の追加と削除には優れていない。
特定のオブジェクトを削除すれば、後のインデックスがそのインデックスを埋めるため、インデックスに変更があるためだ。

ArrayListExample
import java.util.ArrayList;
import java.util.List;

public class ArrayListExample {
public static void main(String[] args) {
	
  List<Board> list = new ArrayList<>();

  list.add(new Board("title1", "content1","author1"));
  list.add(new Board("title2", "content2","author2"));
  list.add(new Board("title3", "content3","author3"));
  list.add(new Board("title4", "content4","author4"));
  list.add(new Board("title5", "content5","author5"));
	
	
  int size = list.size();
  System.out.println("How many object?: " + size);
  System.out.println();
	
  Board board = list.get(2);
  System.out.println(board.getSubject() + "\t" + board.getContent() +"\t" +     board.getWritter());
  System.out.println();
	
  for(int i=0; i<list.size(); i++) {
	Board b = list.get(i);
    System.out.println(b.getSubject() + "\t" + b.getContent() +"\t" + b.getWritter());
	}
  System.out.println();
	
 for(Board b: list) {
   System.out.println(b.getSubject() + "\t" + b.getContent() +"\t" +   b.getWritter());
	}
	
   
  }
}
How many object?: 5

title3	content3	author3

title1	content1	author1
title2	content2	author2
title3	content3	author3
title4	content4	author4
title5	content5	author5

title1	content1	author1
title2	content2	author2
title3	content3	author3
title4	content4	author4
title5	content5	author5



Vector

ArrayListと同一な仕組みだが、Vectorのメソッドはsynchronizedメソッドであるため、マルチスレッド環境では、同時にVector()メソッドを実行することができない。
そのため、マルチスレッド環境では安全にオブジェクトを追加・削除することができる。

VectorExample

import java.util.List;
import java.util.Vector;
import java.util.ArrayList;

public class VectorExample {

public static void main(String[] args) {
		
	List<Board> list = new Vector<>();
		
	//Worker thread1
	Thread threadA = new Thread() {
	@Override
	public void run() {
		for(int i =1; i<=1000; i++) {
			list.add(new Board("title"+i,"content"+i,"author"+i));
		  }
	    }
	};
		
	//Worker thread2
	Thread threadB = new Thread() {
	@Override
	public void run() {
		for(int i =1001; i<=2000; i++) {
			list.add(new Board("title"+i,"content"+i,"author"+i));
		   }
		 }
	};
		
	
	//Worker thread run
	threadA.start();
	threadB.start();
	
	
	try {
		threadA.join();
		threadB.join();
	} catch (Exception e) {
	}
		
		
	//get size
	int size = list.size();
	System.out.println("total size is " + size );
	System.out.println();
	}

}

total size is 2000

ThreadA,BにそれぞれBoardのオブジェクトを1000こずつ生成する作業を宣言した。
Vectorのオブジェクトを通して、Boardクラスの生成をランした結果、2000個のオブジェクトを無事に生成したことがわかる。

total size is 1980

Vectorのオブジェクトを通して、Boardクラスの生成をランした結果、結果がころなる。

LinkedList

LinkedListは、ArrayListと使用方法は同じだが、内部の仕組みがことなる。
ArrayListは、内部にオブジェクトを保存するが、LinkedListはオブジェクトをチェーンのようにつないで管理する。
オブジェクトのデーター(データー)とお互いをインクするポインターがあり、このデーターとポインターのペアーをノード(node) を呼ぶ。
一番前のノードがHead、最後がTailだ。

<LinkedList vs ArrayList>


https://www.nextree.co.kr/p6506/

LinkedListExample
	
import java.util.List;
import java.util.LinkedList;
import java.util.ArrayList;

public class LinkedListExample {

public static void main(String[] args) {

    List<String> list1 = new ArrayList<>();
    List<String> list2 = new LinkedList<>();
		
    long startTime;
    long endTime;
		
    //ArrayList
    startTime = System.nanoTime();
    for(int i=0; i<10000; i++) {
	 list1.add(0,String.valueOf(i));
    }
    endTime = System.nanoTime();
    System.out.printf("%-17s %8d ns \n", "ArrayList runtime:",(endTime - startTime));
		
    //LinkedList
    startTime = System.nanoTime();
	for(int i=0; i<10000; i++) {
	    	list2.add(0,String.valueOf(i));
	   }
     endTime = System.nanoTime();
     System.out.printf("%-17s %8d ns \n", "LinkedList runtime:",(endTime - startTime));
		
		
	}

}	
	
ArrayList runtime: 10283900 ns 
LinkedList runtime:  2092400 ns 	

Set

順序を決めず、データーを保存するインタフェース。
同じ値は保存しないため、数学の「集合」と似ている。

機能 メソッド 説明
Create boolean add(E e) オブジェクトの保存を成功したらtrue, 中腹ならfalse
Read boolean contains(Object o) 指定したオブジェクトがあるかをチェック
Iterator<E> iterator() 保存されたオブジェクトを一度ずつリターンするイテレータをリターン
isEmpty() コレクションが空いているかをチェック
int size() コレクションの全体オブジェクト数をリターン
Delete void clear() 保存されたすべてのオブジェクトを削除する
boolean remove(Object o) 指定したオブジェクトを削除する

HashSet

HashSetは、同一なオブジェクトは保存しない。
ここでの同一オブジェクトは、同値性を意味し、HashCodeと値が同じオブジェクトを意味する。
Stringの場合、物理的同一性がことなっても値が同じであれば、同じHashCodeを割り当て、equalsも同じ値を比較するようにオーバーライドされている。

HashSetExample
	
import java.util.*;

public class HashSetExample {

public static void main(String[] args) {
		
	Set<String> set = new HashSet<>();
		
	set.add("Java");
	set.add("JDBC");
	set.add("JSP");
	set.add("Java");
	set.add("Spring");

	int size = set.size();
	System.out.println("Total object : " + size);
		
	}
}
	
Total object : 4	

以下のように、2つの"Java"をカウントせずに、一つのみ保存した。

Member
public class Member {
	public String name;
	public int age;
	
	public Member(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	//HashCode 
	@Override
	public int hashCode() {
		return name.hashCode()+ age;
	}
	
	//Equals
	@Override
	public boolean equals(Object obj) {
		if(obj instanceof Member) {
			Member target = (Member)obj;
			return (target.name.equals(name) && (target.age == age)); 
		}
		else {
			return false;
		}
	  }		
		
	}
	
	

HashSetExample

import java.util.*;

public class HashSetExample {

public static void main(String[] args) {
		
	Set<Member> set = new HashSet<>();
		
	set.add(new Member("홍길동",30));
	set.add(new Member("홍길동",30));
		
	System.out.println("Total object : " + set.size());

  }

}	
	

Setからデータを持ってくる際には、Iteratorを使用する。

リターンタイプ メソッド 説明
boolean hasNext() 持ってくるオブジェクトがあればtrue、なければfalse
E next() オブジェクトをランダムでもってくる
void remove next()でもってきたオブジェクトを削除する
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class HashSetExample {

	public static void main(String[] args) {
		//hashSet
		Set<String> set = new HashSet<String>();
		
		set.add("JAVA");
		set.add("JDBC");
		set.add("JSP");
		set.add("Spring");
		
		Iterator<String> iterator = set.iterator();
		while(iterator.hasNext()) {
			String element = iterator.next();
			System.out.println(element);
			if(element.equals("JSP")) {
				iterator.remove();
			}
		}
		System.out.println();
		
		set.remove("JDBC");
		
		for(String element : set) {
			System.out.println(element);
		}
	}

}
JAVA
Spring

iteratorを通して、得た値は、set上には存在している。
オブジェクトを除去した場合は、remove()メソッドで解決できる。

Discussion