Java 常用Set集合和常用Map集合

2022-07-06 09:05:26

常用Set集合

Set集合的特點

​ Set介面下的集合都會有以下特點

  • 不能儲存重複元素
  • 沒有索引

HashSet

HashSet集合的特點

  • 底層資料結構是雜湊表
  • 儲存元素的順序和遍歷獲取出來的順序可能不一致
  • 沒有索引
  • 集合中不能儲存重複元素

建立物件

HashSet<元素資料型別> set = new HashSet<>();
public static void main(String[] args) {
    HashSet<String> set = new HashSet<>();
}

常用方法

方法 解釋
boolean add(E e) 新增元素,如果元素新增不成功 返回值代表是否新增成功
boolean remove(Object o) 刪除元素 ,返回值代表刪除元素是否成功
boolean contains(Object o) 判斷元素是否存在
int size() 獲取集合的大小
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        //新增元素
        boolean f = set.add("愚");
        set.add("生");
        set.add("淺");
        set.add("末");
        System.out.println(f);
    }

我們打斷點偵錯一下:

可以看到愚生淺末四個字元已經裝入set,且f為true證明新增成功。

我們再試試刪除:

 public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        //新增元素
        set.add("愚");
        set.add("生");
        set.add("淺");
        set.add("末");
        boolean f = set.remove("生");
    }

可以看到set已經沒有生了,且f為true代表刪除成功。

判斷是否存在:

    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        //新增元素
        set.add("愚");
        set.add("生");
        set.add("淺");
        set.add("末");
        boolean f = set.contains("末");
    }


末是存在於set的,所以返回值為true。
獲取集合的大小:

 public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        //新增元素
        set.add("愚");
        set.add("生");
        set.add("淺");
        set.add("末");
         //獲取集合的大小
        int size = set.size();


新增了愚生淺末四個字元,所以可以得到size是4.

遍歷

1.轉換為陣列遍歷

 public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        set.add("愚");
        set.add("生");
        set.add("淺");
        set.add("末");
        String[] strings = set.toArray(new String[0]);
        for (int i = 0; i < strings.length; i++) {
            System.out.println(strings[i]);
        }
    }

結果:

前面說過:儲存元素的順序和遍歷獲取出來的順序可能不一致。

2.使用迭代器遍歷

    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        set.add("愚");
        set.add("生");
        set.add("淺");
        set.add("末");
        Iterator<String> it = set.iterator();
        while (it.hasNext()){
            String s = it.next();
            System.out.println(s);
        }
    }

結果:

3.foreach遍歷

 public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        set.add("愚");
        set.add("生");
        set.add("淺");
        set.add("末");
        for (String s : set) {
            System.out.println(s);
        }
    }

結果:

常用Map集合

Map集合的概述

Map介面是雙列集合的頂層介面,下面是Map介面的定義

interface Map<K,V>  K:鍵的型別;V:值的型別

​ 儲存的資料必須包含key和value。

​ key和value在Map集合中是一一對應的關係。一個key對應一個value。

​ key在map集合中是不會重複的。

HashMap

HashMap集合的特點

  • 底層資料結構是雜湊表
  • 儲存元素的順序和遍歷獲取出來的順序可能不一致
  • key不會重複

建立物件

HashMap<key的資料型別,value的資料型別> map = new HashMap<>();

例如:

    public static void main(String[] args) {
        HashMap<String,String> map = new HashMap<>();
        HashMap<String,Integer> map = new HashMap<>();
    }

常用方法

方法 解釋
V put(K key, V value) 新增元素,如果key不存在就新增,如果key
V get(Object key) 根據key獲取對應的value值返回。如果key不存在就返回null
V remove(Object key) 根據key刪除map中對應的鍵值對。並且把刪除的value返回
boolean containsKey(Object key) 判斷key是否存在
int size() 集合中鍵值對的對數
void clear() 清空集合中的所有鍵值對
    public static void main(String[] args) {
        HashMap<String,String> map = new HashMap<>();
//        map.put()
        //新增元素
        map.put("name", "愷龍");
        map.put("age", "20");
        String v = map.put("name", "愚生淺末");//將原來的愷龍替換為愚生淺末
        String name = map.get("name");//獲取名字:愷龍
        String age = map.get("age");//獲取age:20
        //刪除元素
        String delV = map.remove("age");//返回值為20
        //判斷key是否存在
        if(map.containsKey("name")){
            String agea = map.get("name");//null
            System.out.println(agea.length());
        }
        //size
        int size = map.size();
        map.clear();
    }

遍歷

1.使用entrySet遍歷

​ map集合的entrySet方法可以獲取一個Set集合,集合中存放的是Entry物件,一個Entry物件相當於一個鍵值對。我們可以遍歷set集合拿到Entry物件,然後獲取出裡面的鍵和值。

使用迭代器遍歷entrySet

    public static void main(String[] args) {
        HashMap<String,String> map = new HashMap<>();
        map.put("name","愷龍");
        map.put("age","20");
        Set<Map.Entry<String, String>> entries = map.entrySet();
        //使用迭代器遍歷entrySet
        Iterator<Map.Entry<String, String>> it = entries.iterator();
        while (it.hasNext()){
            Map.Entry<String, String> entry = it.next();
            System.out.println(entry.getKey()+"="+entry.getValue());
        }
    }

結果:

使用foreach遍歷entrySet

    public static void main(String[] args) {
        HashMap<String,String> map = new HashMap<>();
        map.put("name","愷龍");
        map.put("age","20");
        Set<Map.Entry<String, String>> entries = map.entrySet();
        //使用foreach遍歷entrySet
        for (Map.Entry<String, String> entry : entries) {
            System.out.println(entry.getKey()+"="+entry.getValue());
        }
    }

結果:

2.使用keySet遍歷

​ map集合的keySet方法可以獲取一個Set集合,集合中存放的是所有的key。我們可以遍歷set集合拿到key物件,然後通過key獲取對應的value。

    public static void main(String[] args) {
        HashMap<String,String> map = new HashMap<>();
        map.put("name","愷龍");
        map.put("age","20");
        Set<String> keys = map.keySet();
        for (String key : keys) {
            System.out.println(key+"="+map.get(key));
        }
    }

結果:

HashMap的key去重原理

​ HashMap在新增元素的時候會判斷集合中是否有key和本次存入的key相同。判斷的時候主要是通過hashCode方法和equals方法來進行判斷的。hashCode相同,並且equals判斷也相同就會認為是同一個key。

​ 所以如果我們要儲存到HashMap中的key是一個自定義的型別。就需要根據情況判斷下是否需要重寫下hashCode方法和equals方法。重寫的時候使用IDEA的提示即可。

public class Student {
    private int age;
    private String name;
    public String getName(){
        return name = this.name;
    }
    public void setName(String name){
        this.name = name;
    }
    public int getAge(){
        return age = this.age;
    }
    public void setAge(int age){
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age &&
                Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(age, name);
    }
}

注意:HashSet儲存資料其實也是使用了HashMap。所以如果往HashSet中儲存自定義物件也要看情況是否需要重寫hashCode方法和equals方法。

如圖片失效等情況請參閱公眾號文章:https://mp.weixin.qq.com/s/NLKGamezcB3nnQ3BgEDc9g

歡迎關注我的公眾號:愚生淺末,一起交流學習。