JavaSE入門——Map


記事の目次
  • Map
  • hashMap
  • hashSetとhashMap
  • どのようにしてhashテーブルにデータを追加しますか?
  • TreeMap
  • Mapの巡回展示
  • 汎型
  • カスタム汎型
  • Map
    Mapは無秩序に重複することができます。彼はキーとしてentry(key、value)の形式で保存しています。キーは中のvalueに対して重複できます。keyは重複してはいけません。
    操作:put(key,value)、データclear()を追加して、空のsize()をクリアして、キーの値を調べて、個数isEmpty()に対して。空getかどうかを判断します。keyによってすべてのvalueを獲得し、集合形式で戻ります。この中は最終的にvalues vaulesです。すべてのvalueを取得し、containsValueを取得し、key containsValueを含むかどうかを判断し、value keySetを取得し、set形式で削除します。
    注意:
  • mapの中の操作とセットは似ていますが、両者の本質は違います。
  • mapは直接的に遍歴することができなくて、
  • mapはkeyが重複してはいけないので、valueは重複してもいいです。データを追加する場合、同じkey値がある場合、後に追加したこのキーの値を中のvalueに対して前のものを上書きすればいいです。
  • hashMap
    HashMapの一番下の階はハッシュ・テーブルともいう。
    ハッシュ表:またハッシュリストと呼ばれ、キーペアを保存するために使われます。元素のhash値によって、hashアルゴリズムによって、元素をリンクに追加することが確定できます。
    ハッシュアルゴリズム:一定の長さの値を一定の値に変更すると、その値の一意性が保証されます。
    ハッシュアルゴリズムはjavaでhashCode関数を指す。
    ターゲット:各オブジェクトに一意の識別子を生成する
    hashの目的:迅速さを調べるために、hash値は固定された値で、整数値です。したがって、一定の長さの場合、検索は非常に速いです。
    hashSetとhashMap
    HashSet  HashMap     ,    value    ,      key。
    
    どのようにhashテーブルにデータを追加しますか?
    保存するマッピング関係のkeyオブジェクトを呼び出し、keyオブジェクトのhashCode()方法を呼び出して、hash符号値を生成し、hash値に基づいてhashアルゴリズムでhashを行い、配列の下付きを得て、配列に要素を追加します。
  • 配列に対応するhashデータがない場合、配列空間を占有し、このkey-valueのマッピング関係を保存する
  • データがある場合は、keyのequalsメソッドを呼び出し、hash値と同じチェーンを一つずつ比較して、trueに戻ると、このkeyがあることを表します。このときkeyは追加されません。falseに戻ると、hash値だけが同じであると説明します。このオブジェクトをチェーンブロックに挿入すると、Hash Setは一つの要素HashMap保存ボタン値だけを保存します。
    注意:添加された要素はequals方法とhashCode方法を実現し、equalsは添加するかどうかを比較するために用いられ、hashCodeはhash値を計算するために用いられます。
    TreeMap
    TreeSetとほぼ同じで、TreeMapもSortedMapの実現クラスであり、TreeMapはコンパレータ類を使って並べ替えられます。
    しかし、TreeMapはキーの対中のkeyによってしか並べられません。valueによって並べ替えられません。valueによって並べ替えたいなら、listに変えられます。同理hashMapもlistに変えて並べ替えられますが、彼ら自身はこのような状況で並べ替えられないです。どのように変換したら、次のページに書きますか?
    TreeMapソート
    public class Collection_16_SortedMap_02 {
    
    	@SuppressWarnings({ "rawtypes", "unchecked" })
    	public static void main(String[] args) {
    		SortedMap products = new TreeMap();
    		Product2 p1 = new Product2("water", 1.3);
    		Product2 p2 = new Product2("apple", 4.5);
    		Product2 p3 = new Product2("banner", 3.5);
    		Product2 p4 = new Product2("coffer", 8.0);
    
    		// value            
    		products.put(p1, 1.0);
    		products.put(p2, 2.0);
    		products.put(p3, 3.0);
    		products.put(p4, 4.0);
    
    		Set keys = products.keySet();
    		for (Object key : keys) {
    			Product2 p = (Product2) key;
    			double value = (double) products.get(key);
    			System.out.println(p + "--->" + value + "kg    = " + (value * p.price));
    		}
    	}
    
    }
    
    @SuppressWarnings("rawtypes")
    class Product2 implements Comparable {
    	String name;
    	double price;
    
    	public Product2(String name, double price) {
    		super();
    		this.name = name;
    		this.price = price;
    	}
    
    	@Override
    	public String toString() {
    		return "Product2 [name=" + name + ", price=" + price + "]";
    	}
    
    	@Override
    	public int compareTo(Object arg0) {
    		double price1 = this.price;
    		double price2 = ((Product2) arg0).price;
    		if (price1 == price2) {
    			return 0;
    		} else if (price1 < price2) {
    			return -1;
    		} else {
    			return 1;
    		}
    	}
    
    }
    
    
    Mapの巡回展示
    前の文もMapに言及して直接的に遍歴することができません。
    もちろん、結果を確認したいですが、直接にmapのオブジェクトの名前を印刷できます。彼はコンソールで配列形式で、キーペアのkeyとvalueを接続します。
    しかし、foreachで直接印刷したいなら、だめです。
    //		     value
    		Collection values =map.values();
    		for (Object object : values) {
    			System.out.println(object);
    		}
    		
    		
    		System.out.println("-------------------");
    
    		//   map  key  ,  set
    		Set s =map.keySet();
    		for (Object object : s) {
    			//     ke'y     value
    			System.out.println(object+":"+map.get(object));
    		}
    		System.out.println("-------------------");
    
    		
    		//   map    entry  ,  set         entry   toString  ,  key=value     
    		Set set =map.entrySet();
    		for (Object object : set) {
    			System.out.println(object);
    		}
    		
    
    汎型
    一般型とは、記憶に指定されたタイプの記憶を与えて、指定された記憶しかできません。他の記憶はできません。集合のように、実際には配列と同じで、統一されたデータタイプしか記憶できません。Objectタイプにすぎません。すべての要素は上にシフトします。だから、何でも置けます。注意:汎型は基本データタイプを使用できません。参照データタイプのみ使用できます。
    長所:統一タイプ、減少タイプの転換短所:単一タイプの要素しか記憶できません。
    	public static void main(String[] args) {
    		A a =new A();
    		B b =new B();
    		C c =new C();
    		
    //		    ,  
    //		Set s=new HashSet();
    //		s.add(a);
    //		s.add(b);
    //		s.add(c);
    //		for (Object object : s) {
    //			if (object instanceof A ) {
    //				A d = (A) object;
    //				d.m1();
    //			}else if (object instanceof B) {
    //				B d = (B) object;
    //				d.m1();
    //			}else if(object instanceof C) {
    //				C d=(C) object;
    //				d.m1();
    //			}
    //		}
    		
    		List<D> ds =new ArrayList<D>();
    		ds.add(a);
    		ds.add(b);
    		ds.add(c);
    		for (D d : ds) {
    			d.m1();
    		}
    	
    	}
    
    }
    interface D{
    	public void m1();
    }
    class A implements D{
    
    	@Override
    	public void m1() {
    		System.out.println("A m1  ");
    	}
    	
    }
    class B implements D{
    	
    	@Override
    	public void m1() {
    		System.out.println("B m1  ");
    	}
    	
    }
    class C implements D{
    	
    	@Override
    	public void m1() {
    		System.out.println("C m1  ");
    	}
    	
    
    
    ユーザー定義の汎形
    もし汎型が規定されていたら、私たちは伝達タイプが使用されていない場合、汎型はobjectです。
    T(type)は具体的なJavaタイプK V(key,value)を表し、それぞれJavaキーの中のkey value E(element)はElementを表します。
    カスタム
    		List<User> users = new ArrayList<User>();
    		users.add(new User(12));
    		users.add(new User(11));
    		users.add(new User(15));
    		for (User user : users) {
    			System.out.println(user.age);
    		}
    		
    		
    		Map<String, Integer> map = new HashMap<String, Integer>();
    		map.put("sad", 2);
    	}
    
    }
    class User {
    	int age;
    
    	public User(int age) {
    		super();
    		this.age = age;
    	}
    	
    }