1. 程式人生 > 其它 >人生苦短我學Java-14-HashSet/Map等實現類

人生苦短我學Java-14-HashSet/Map等實現類

一、HashSet

1.特點:

  • 1.無序
  • 2.元素唯一
  • 3.無索引

2.常用方法:和set方法一樣
3.遍歷:

  • 1.轉陣列
  • 2.迭代器
  • 3.增強for

重寫 hashCode、equals是的去重,否則不會對自定義類去重

public class MyHashSet {
    public static void main(String[] args) {
        // 建立集合
        HashSet<Integer> h = new HashSet<Integer>();
        // 新增元素
        h.add(3);
        h.add(
1); h.add(2); // 遍歷 for (Integer i : h) { System.out.println(i); } HashSet<Pig> p = new HashSet<Pig>(); p.add(new Pig("ppl", 18)); p.add(new Pig("gsxl", 19)); p.add(new Pig("test", 18)); p.add(new Pig("ppl", 18));
for (Pig hp : p) { System.out.println(hp.getName() +":"+ hp.getAge()); } } } class Pig { private String name; private int age; public Pig() { } public Pig(String name, int age) { super(); this.name = name; this.age = age; }
public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } // 重寫 hashCode、equals是的去重,否則不會對自定義類去重 @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Pig pig = (Pig) o; return age == pig.age && Objects.equals(name, pig.name); } @Override public int hashCode() { return Objects.hash(name, age); } }

執行結果:

 4.底層結構如下:

 二、Map

1.Map 介面

  • -- HashMap 實現類
  • -- TreeMap 實現類
  • -- LinkedHashMap 實現類
  • -- Hashtable 實現類
  • -- Properties 實現類

特點

  • 1.無序的
  • 2.無索引
  • 3.元素唯一的,鍵唯一,值可以重複
  • 4.雙列的,key:value

2.Map

主要方法:

  • put:新增/修改元素
  • get:獲取key的value
  • remove:移除
  • size:map長度
  • entrySet:key,value集合
class CustomMap {
    public static void main(String[] args) {
        // 建立集合
        Map<String, String> map = new HashMap<>();
        // 新增元素,put:既是新增,相同key新增也可以是修改
        map.put("ppl", "18");
        map.put("gsxl", "19");
        System.out.println(map);
        map.put("ppl", "22");
        map.put("ppl2", "222");
        System.out.println(map);

        // get值
        System.out.println(map.get("ppl"));
        System.out.println(map.get("不存在呢")); // 不存在呢 返回null

        // remove:返回value
        String re = map.remove("gsxl");
        System.out.println(re);
        System.out.println(map);

        // map長度
        Integer size = map.size();
        System.out.println(size);

        // 判斷map中是否有指定的key
        boolean b = map.containsKey("ppl");
        boolean b1 = map.containsKey("ppl1");
        System.out.println(b);
        System.out.println(b1);

        // 判斷map中是否有指定的value
        boolean b2 = map.containsValue("22");
        boolean b3 = map.containsValue("23");
        System.out.println(b2);
        System.out.println(b3);

        // 獲取map中所有的key
        Set<String> set = map.keySet();
        for (String key : set) {
            // 獲取所有value
            String value = map.get(key);
            System.out.println("key:" + key + " value:" + value);
        }

        //獲取map中所有的value
        Collection<String> c = map.values();
        for (String s : c) {
            System.out.println(s);
        }

        // Entry 直接獲取key與value
        Set<Map.Entry<String, String>> set1 = map.entrySet();
        for (Map.Entry<String, String> entry : set1) {
            String key = entry.getKey();
            String value = entry.getValue();
            System.out.println("key:" + key + " value:" + value);
        }
    }
}

3.HashMap

特點和方法,與Map集合中的特點、方法一樣。

class CustomHashMap {
    public static void main(String[] args) {
        HashMap<String, String> map = new HashMap<>();
        // 新增元素
        map.put("ppl", "廣深小龍");
        map.put("gsxl", "小龍龍");
        // get
        String ppl = map.get("ppl");
        // 遍歷
        Set<Map.Entry<String, String>> set = map.entrySet();
        for (Map.Entry<String, String> entry : set) {
            String key = entry.getKey();
            String value = entry.getValue();
            System.out.println("key:" + key + " value:" + value);
        }
        // remove
        map.remove("ppl");
        System.out.println(map.get("ppl"));
    }
}

4.TreeMap

特點在map上多了:

  • 可以排序
  • 資料結構是:紅黑樹,TreeSet底層使用的就是TreeMap

方法和Map集合中的方法一樣。

自定義類排序報錯Comparable處理
         1.key類需重寫 compareTo 方法
         2.new TreeMap 時重寫 Comparator 方法

class CustomTreeMap {

    public static void main(String[] args) {
        TreeMap<MyMap, String> map = new TreeMap<>();
        // 新增元素
        map.put(new MyMap("tom", 18), "5566");
        map.put(new MyMap("jerry", 19), "5565");
        map.put(new MyMap("tom", 18), "5568");
        map.put(new MyMap("rose", 17), "5567");
        map.put(new MyMap("tony", 19), "5569");

        // 遍歷1
        Set<MyMap> set = map.keySet();
        for (MyMap key : set) {
            String value = map.get(key);
            System.out.println(key.getName() + " " + key.getAge() + " " + value);
        }
        /*
         --報錯Comparable處理
         1.key類需重寫 compareTo 方法
         2.new TreeMap 時重寫 Comparator 方法,如下
        */
        
        // new TreeMap 時重寫 Comparator 方法,如下
        TreeMap<MyMap, String> treeMap = new TreeMap<>(
                new Comparator<MyMap>() {
                    @Override
                    public int compare(MyMap o1, MyMap o2) {
                        // 比較規則,年齡從大到小
                        int i = o2.getAge() - o1.getAge();
                        // 比較規則,如果年齡相同,姓名從大到小
                        int ii = i == 0 ? o2.getName().compareTo(o1.getName()) : i;
                        return ii;
                    }
                }
        );
    }
}

自定義類重寫 compareTo

@Override
    public int compareTo(MyMap o) {
        // 比較規則,年齡從大到小
        int i = o.age - this.age;
        // 比較規則,如果年齡相同,姓名從大到小
        int ii = i == 0 ? o.name.compareTo(this.name) : i;
        return ii;
    }

5.LinkedHashMap

和TreeMap特點/方法一致

class CustomLinkedHashMap {
    public static void main(String[] args) {
        // 建立集合
        LinkedHashMap<String, String> map = new LinkedHashMap<>();
        map.put("a", "1");
        map.put("c", "2");
        map.put("b", "3");
        Set<String> set = map.keySet();
        for (String key : set) {
            String value = map.get(key);
            System.out.println("key:" + key + " value:" + value);
        }
    }
}

6.Hashtable

key和value不可以是null,只有hashMap可以。

class CustomHashTable {
    public static void main(String[] args) {
        // 只有HashMap key和value可以是null
        HashMap<String,Integer>hashMap=new HashMap<>();
        hashMap.put("ppl",5566);
        hashMap.put("gsxl",null);

        // Hashtable、TerryMap key和value不可以是null
        Hashtable<String, Integer> hashtable = new Hashtable<>();
        hashtable.put("ppl", 5566);
        System.out.println(hashtable.get("ppl"));
        hashtable.put("gsxl", null);    // 空指標異常
    }
}