Java常用集合之Set和Map的用法詳解
常用Set集合
Set集合的特點
? Set接口下的集合都會有以下特點
- 不能存儲重復元素
- 沒有索引
HashSet
HashSet集合的特點
- 底層數(shù)據(jù)結構是哈希表
- 存儲元素的順序和遍歷獲取出來的順序可能不一致
- 沒有索引
- 集合中不能存儲重復元素
創(chuàng)建對象
HashSet<元素數(shù)據(jù)類型> 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。
獲取集合的大?。?/p>
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.轉換為數(shù)組遍歷
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:值的類型
? 存儲的數(shù)據(jù)必須包含key和value。
? key和value在Map集合中是一一對應的關系。一個key對應一個value。
? key在map集合中是不會重復的。
HashMap
HashMap集合的特點
- 底層數(shù)據(jù)結構是哈希表
- 存儲元素的順序和遍歷獲取出來的順序可能不一致
- key不會重復
創(chuàng)建對象
HashMap<key的數(shù)據(jù)類型,value的數(shù)據(jù)類型> 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) | 根據(jù)key獲取對應的value值返回。如果key不存在就返回null |
V remove(Object key) | 根據(jù)key刪除map中對應的鍵值對。并且把刪除的value返回 |
boolean containsKey(Object key) | 判斷key是否存在 |
int size() | 集合中鍵值對的對數(shù) |
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", "愚生淺末");//將原來的愷龍?zhí)鎿Q為愚生淺末 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是一個自定義的類型。就需要根據(jù)情況判斷下是否需要重寫下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存儲數(shù)據(jù)其實也是使用了HashMap。所以如果往HashSet中存儲自定義對象也要看情況是否需要重寫hashCode方法和equals方法。
以上就是Java常用集合之Set和Map的用法詳解的詳細內容,更多關于Java Set Map集合的資料請關注腳本之家其它相關文章
相關文章
spring boot aop 記錄方法執(zhí)行時間代碼示例
這篇文章主要介紹了spring boot aop 記錄方法執(zhí)行時間代碼示例,分享了相關代碼,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下2018-02-02java實現(xiàn)無符號數(shù)轉換、字符串補齊、md5、uuid、隨機數(shù)示例
這篇文章主要介紹了java實現(xiàn)無符號數(shù)轉換、字符串補齊、md5、uuid、隨機數(shù)示例,需要的朋友可以參考下2014-04-04Spring Boot JPA如何把ORM統(tǒng)一起來
Spring Data JPA 是 Spring 基于 ORM 框架、JPA 規(guī)范的基礎上封裝的一套JPA應用框架,可使開發(fā)者用極簡的代碼即可實現(xiàn)對數(shù)據(jù)的訪問和操作,本文給大家詳細介紹了Spring Boot JPA如何把ORM統(tǒng)一起來,感興趣的朋友一起看看吧2018-04-04