🐷

プログラミング自主学習 DAY68 Map

2023/08/03に公開

Map

keyとvalueに構成されたEntry(エントリー) というオブジェクトを保存する。
keyはvalueを区別するものであるため、中腹を許さないが、valueは中腹保存ができる。
配列の場合は、一つのindexuに一つの値しかこめないが、keyは異なるイメージだ。


https://slideplayer.com/slide/6125273/

Mapを具象したクラスは、HashMap, HashTable, LinkedHashMap, Properties, TreeMapなどがある。

機能 メソッド 説明
Create & Update put(K key, V value) keyとvalueを追加し、valueをリターン
Read boolean containsKey(Object o) 指定したkeyがあるかをチェック
boolean containsValue(Object o) 指定したvalueがあるかをチェック
Set<Map.Entry<K,V>>entrySet Keyとvalueに構成されたすべてのMap.entryオブジェクトSetに込めてリターン
V get(object key) 指定したkeyのvalueをリターン
Set<K>keySet 全てのkeyをSetに込めてリターン
boolean isEmpty() コレクションが空いているかをチェック
int size() 保存されたkeyの総数をリターン
Collection<V>values() 保存されたすべてのvalueCollectionに込めてリターン
Delete void clear() 保存されたすべてのMap.Entryを削除する
V remove(Object key) 指定したkeyと一致したMap.Entryを削除、削除ができれば、valueをリターン

HashMap

HashSetのように、HashCode()と戻り値が同じで、equals()がtrueであれば、同じkeyとしてみなされ、重複保存はされない。

Map<String, Integer> map = new HashMap<String, Integer>();	
Map<String, Integer> map = new HashMap<>();	
HashMapExample
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Iterator;
import java.util.Set;

public class HashMapExample {
public static void main(String[] args) {
		
   //Key: String value:Integer
   Map<String, Integer> map = new HashMap<>();
		
   map.put("jack", 85);
   map.put("Adam", 50);
   map.put("Nick", 50);
   map.put("jack", 50);   //"jack" 80 -> 50 
   System.out.println("total Entry:" + map.size());
   System.out.println();
		
   //get value from key
   String key = "jack";
   int value = map.get(key);
   System.out.println(key + ": " + value);
   System.out.println();
		
   //get keys from Set and get value from key
   Set<String> keySet = map.keySet();
   Iterator<String> keyIterator = keySet.iterator();
     while(keyIterator.hasNext()) {
         String k = keyIterator.next();
	 Integer v = map.get(k);
	 System.out.println(k +" :" +v);
	 }
    System.out.println();
		
   //get entry from Set and get key and value from iterate
   Set<Entry<String, Integer>> entrySet = map.entrySet();
   Iterator<Entry<String, Integer>> entryIterator = entrySet.iterator();
      while(entryIterator.hasNext()) {
	    Entry<String, Integer> entry = entryIterator.next();
	    	String k = entry.getKey();
		Integer v = entry.getValue();
		System.out.println(k +" :" +v);
		  }
    System.out.println();	
		
		
    map.remove("jack");
    System.out.println("total Entry:" + map.size());
    System.out.println();
  }
		
}			
	
total Entry:3

jack: 50

Adam :50
Nick :50
jack :50

Adam :50
Nick :50
jack :50

total Entry:2	

HashTable

通常は、HashMapの方が効率が良い方だが、
マルチスレッド環境では、HashTableが安全にデーターを処理する。

HashtableExample
import java.util.Hashtable;
import java.util.Map;

public class HashTableExample {

public static void main(String[] args) {

Map<String,Integer> map = new Hashtable<>();
		
	Thread threadA = new Thread() {
	@Override
	public void run() {
		for(int i=1; i<=1000; i++) {
		map.put(String.valueOf(i), i);
		}
	  }
	};
	  
	Thread threadB = new Thread() {
	@Override
	public void run() {
		for(int i=1001; i<=2000; i++) {
		map.put(String.valueOf(i), i);
		}
	  }
	};
	
	
	threadA.start();
	threadB.start();
	
	
	try {
		threadA.join();
		threadB.join();
	} catch (Exception e) {
	}
	
	
	int size = map.size();
	System.out.println("Total entry: " + size);
	System.out.println();
	
	
	}

}
	
Total entry: 2000	

Vectorのように、無事に作業が終わった。

Properties

PropertiesはHashTableのサブクラスで、KeyとvalueがStringに制限されている。
.propertiesというファイルを読み取る際に使用するクラスだ。
Properties ファイルは、基本的にはISO 8859-1にエンコーディングされる。
しかし、韓国語はUnicodeに保存されるため、読みにくい。

driver=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:orcl	
username=scott
password=tiger
admin=\uD64D\uAE38\uB3D9    //<-韓国語はUnicodeに表現される	

この場合は、Propertiesクラスのオブジェクトを生成し、コンソールから読み取ることができる。Propertiesの場合、固有のメソッド load() があるため、アップキャストをせずに、直接インスタンス化する。

Properties properties = new Properties();<br>
Properties.load(Xxx.class.getResourseAsStream("database.properties");

https://zenn.dev/eldorado215/articles/5649cf1875a992#リフレクション(reflection)

PropertiesExample
	
import java.util.Properties;

public class PropertiesExample {
public static void main(String[] args) throws Exception {
		
Properties properties = new Properties();
properties.load(PropertiesExample.class.getResourceAsStream("database.properties"));
		
	String driver = properties.getProperty("driver");
	String url = properties.getProperty("url");
	String username = properties.getProperty("username");
	String password = properties.getProperty("password");
	String admin = properties.getProperty("admin");
		
	System.out.println("driver : " + driver );
	System.out.println("url : " + url );
	System.out.println("username : " + username );
	System.out.println("password : " + password );
	System.out.println("admin : " + admin );
    }
}
driver : oracle.jdbc.OracleDriver
url : jdbc:oracle:thin:@localhost:1521:orcl	
username : scott
password : tiger
admin : エンジニア	

Discussion