プログラミング自主学習 DAY67 List/Set
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はオブジェクト(要素)の検索に優れているが、要素の追加と削除には優れていない。
特定のオブジェクトを削除すれば、後のインデックスがそのインデックスを埋めるため、インデックスに変更があるためだ。
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()メソッドを実行することができない。
そのため、マルチスレッド環境では安全にオブジェクトを追加・削除することができる。
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/
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も同じ値を比較するようにオーバーライドされている。
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"をカウントせずに、一つのみ保存した。
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;
}
}
}
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