Chapter 13. コレクションとジェニーンリック(2)

42013 ワード

Set


保存順序は保持されず、オブジェクトを繰り返し保存できません.
インデックスが管理されていないため、インデックスをパラメータとして使用する方法はありません.

Setインタフェースで実装されたクラス

  • HashSet
  • LinkedHashSet
  • TreeSet
  • Setインタフェースで実現する方法


    機能方法説明オブジェクトboolean add(E)指定されたオブジェクトeを追加して他のオブジェクト検索boolean contains(Object o)指定されたオブジェクトを格納するかどうかを示し、boolean isEmpty()セットが空()で格納されているオブジェクトの総数を、戻りオブジェクト[]toArray(オブジェクト[]Array)配列のオブジェクト[]toArray(Object[]a)としてチェックする指定した配列に変換されたクラスタイプのオブジェクトを、配列に格納されているすべてのオブジェクトを削除します.

    HashSet


    内部使用HashMap
    オブジェクトを順番なしに保存し、同じオブジェクトを繰り返し保存しない
    保存するオブジェクトのハッシュコードを保存したオブジェクトのハッシュコードと比較し、同じ値がない場合はオブジェクトを追加します.
    Set<E> set = new HashSet<E>();

    LinkedHashSet


    ハッシュ・テーブルへのデータの保存
    格納順序によって順序が決まります.
    追加順または最近アクセスした順でアクセス可能
    test.collection.TestLinkedHashSet.java
    01 package test.collection;
    02
    03 import java.util.LinkedHashSet;
    04
    05 public class TestLinkedHashSet {
    06
    07     public void testLinkedHashSet() {
    08         LinkedHashSet<String> set = new LinkedHashSet<String>();
    09
    10         set.add("Java");
    11         set.add("Oracle");
    12         set.add("JDBC");
    13         set.add("HTML5");
    14
    15         for(String text : set) { // HashSet과 다르게 값이 들어간 순서대로 출력된다.
    16             System.out.println(text);
    17         }
    18     }
    19 }
    test.main.Main.java
    01 package test.main;
    02
    03 import test.collection.TestLinkedHashSet;
    04
    05 public class Main {
    06     public static void main(String[] args) {
    07         new TestLinkedHashSet().testLinkedHashSet();
    08     }
    09 }
    ------
    Java
    Oracle
    JDBC
    HTML5

    TreeSet


    並べ替え機能が追加され、同じオブジェクトが重複して保存されません.
    ソート順にアーカイブしてソート方法を指定できます
    有効な範囲検索
    赤と黒のツリー構造の使用
    HashSetよりも性能的に遅いが、挿入位置合わせに使用する
    test.collection.TestTreeSet.java
    01 package test.collection;
    02
    03 import java.util.TreeSet;
    04
    05 public class TestTreeSet {
    06     public void testTreeSet() {
    07         TreeSet<String> tset = new TreeSet<String>();
    08
    09         tset.add("3. Mybatis");
    10         tset.add("1. Java");
    11         tset.add("5. HTML5");
    12         tset.add("4. Oracle");
    13         tset.add("2. JDBC");
    14
    15         for(String text : tset) { // 앞의 번호 순으로 자동 정렬되어 출력된다.
    16             System.out.println(text);
    17         }
    18     }
    19 }
    test.main.Main.java
    01 package test.main;
    02
    03 import test.collection.TestTreeSet;
    04
    05 public class Main {
    06     public static void main(String[] args) {
    07         new TestTreeSet().testTreeSet();
    08     }
    09 }
    ------
    1. Java
    2. JDBC
    3. Mybatis
    4. Oracle
    5. HTML5

    Map


    キーと値からなるエントリオブジェクトを格納します.キーと値はオブジェクトで、キーは重複できませんが、値は重複できます.既存のキーを使用して値を保存すると、その値は上書きされます.

    Mapインタフェースによって実装されるクラス

  • HashMap
  • Hashtable
  • Properties
  • Mapインタフェースで実装する方法


    機能方法は、オブジェクトV put(Kキー、V値所与のキーおよび値)の追加オブジェクト検索V get(オブジェクトキー)所与のキーおよび値がboolean contains value(オブジェクトキー)所与の値Set>EntrySet()指定されたキーと値のペアからなるすべてのエントリオブジェクトをセットに読み込み、BooleansEmpty()セットを返すのが空かどうかを調べ、Set keySet()オブジェクトを返すすべてのキーをCollection値を返す()Collectionオブジェクトをすべて読み込む戻るvoid clear()保存されたエントリオブジェクトを削除し、所与のキーv removeに一致するエントリオブジェクトを削除します.

    HashMap


    Mapインタフェースを実装する代表的なMapセット
    鍵は重複ストレージを許可せず、値は重複ストレージを許可する
    同じキーとなる条件はhashCode()の戻り値が同じであり,equals()メソッドの結果はtrueでなければならない.

    Hashtable


    HashMapと同じ内部構造を持つ
    HashMapとは異なり、マルチスレッド環境で同時に実装される方法を実行できる同期方法で構成されています.
    test.map.TestHashMap.java
    01 package test.map;
    02
    03 import java.util.HashMap;
    04 import java.util.Iterator;
    05
    06 public class TestHashMap {
    07     public void testMap() {
    08         HashMap<Integer,String> map = new HashMap<Integer,String>();
    09         map.put(1, "Apple");
    10         map.put(4, "Dandelion");
    11         map.put(3, "Com");
    12         map.put(2, "BlackBerry");
    13
    14         Iterator<Integer> iterKey = map.keySet().iterator();
    15
    16         while(iterKey.hasNext()) { // 작성한 map 객체를 목록화하여 각각 출력한다.
    17             int key = iterKey.next();
    18             System.out.println("key " + key + " : " + map.get(key));
    19         }
    20     }
    21 }    
    test.main.Main.java
    01 package.test.main;
    02
    03 import test.map.TestHashMap;
    04
    05 public class Main {
    06 public static void main(String[] args) {
    07 new TestHashMap().testMap();
    08 }

    09 }


    key 1 : Apple
    key 2 : BlackBerry
    key 3 : Com
    key 4 : Dandelion
    
    ### Properties
    >Hashtable의 하위 클래스로, 키와 값을 String 타입으로 제한
    애플리케이션의 옵션 정보, 데이터베이스 연결 정보, 다국어 정보가 저장된 프로퍼티(*.properties) 파일을 읽을 때 주로 사용하며, 예제에 관련 IO 클래스를 포함하여 작성하였다. IO 클래스는 이후 입출력 파트에서 자세히 다루도록 하겠다.
    
    test.map.PropertiesStudent.java
    ```java
    01 package test.map;
    02
    03 public class PropertiesStudent implements java.io.Serializable {
    04     private String no;
    05     private String name;
    06     private int score;
    07
    08     public Student() {}
    09     public Student(String no, String name, int score) {
    10     this.no = no;
    11     this.name = name;
    12     this.score = score;
    13     }
    14     @Override
    15     public String toString() {
    16     return no + ", " + name + ", " + score;
    17     }
    18     /*... Getter & Setter 작성부 ... */
    19 }
    test.map.StudentManager.java
    01 package test.map;
    02
    03 import.java.io.*;
    04 import.java.util.*;
    05
    06 public class StudentManager {
    07     private ArrayList<Student> list = new ArrayList<Student>();
    08     private Properties prop = new Properties();
    09
    10     public StudentManager() {}
    11     public void propertyInsert(Student st) {
    12         prop.setProperty(st.getNo(), st.toString());
    13         System.out.println(st.getName() + " 학생의 데이터 삽입 성공!");
    14     }
    15     public void propertyStore() {
    16         try { // 설정 파일 저장 시...
    17             prop.store(new FileWriter(new File("prop.properties")), "Ex_Student.properties");
    18             System.out.println("학생 데이터 저장 성공!");
    19         } catch(Exception e) {
    20             e.printStackTrace();
    21         }
    22     }
    23     public void propertyPrint() {
    24         try { // 설정 파일 불러올 시...
    25             prop.load(new FileReader(new File("prop.properties")));
    26             for(int i = 1; i <= prop.size(); i++) {
    27                 String index = String.valueOf(i); // String 형변환을 통한 key 값 도출
    28                 iist.add(parseStudent(prop.getProperty(index)));
    29             }
    30         } catch (Exception e) {
    31             e.printStackTrace();
    32         }
    33
    34         for(Student s : list) {
    35             System.out.println(s);
    36         }
    37         System.out.println("학생 데이터 출력이 완료되었습니다.");
    38     }
    39
    40     public Student parseStudent(String str) { // 넘겨 받은 데이터를 학생 객체로 변환
    41         String tmp[] = str.split(", ");
    42         return new Student(tmp[0], tmp[1], Integer.parseInt(tmp[2]));
    43     }
    44 }
    test.main.PropertiesMain.java
    01 package test.main;
    02
    03 import test.map.PropertiesStudent;
    04 import test.map.StudentManager;
    05
    06 public class PropertiesMain {
    07     public static void main(String[] args) {
    08         StudentManager stm = new StudentManager();
    09
    10         // properties 데이터 삽입
    11         stm.propertyInsert(new Student("1", "홍길동", 80));
    12         stm.propertyInsert(new Student("2", "김유신", 60));
    13         stm.propertyInsert(new Student("3", "신사임당", 95));
    14
    15         // properties 데이터 저장
    16         stm.propertyStore();
    17
    18         // properties 데이터 입출력
    19         stm.propertyPrint();
    20      }    
    21 }   
                                              >
    prop.properties
    01 #Ex_Student_properties
    02 1=1, 홍길동, 80
    03 2=2, 김유신, 60
    04 3=3, 신사임당, 95