人生苦短我學Java-14-HashSet/Map等實現類
阿新 • • 發佈:2022-03-13
一、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); // 空指標異常 } }