Java常用集合之Set和Map的用法詳解
常用Set集合
Set集合的特點
? Set接口下的集合都會有以下特點
- 不能存儲重復(fù)元素
- 沒有索引
HashSet
HashSet集合的特點
- 底層數(shù)據(jù)結(jié)構(gòu)是哈希表
- 存儲元素的順序和遍歷獲取出來的順序可能不一致
- 沒有索引
- 集合中不能存儲重復(fù)元素
創(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);
}我們打斷點調(diào)試一下:

可以看到愚生淺末四個字符已經(jīng)裝入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已經(jīng)沒有生了,且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.轉(zhuǎn)換為數(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]);
}
}結(jié)果:

前面說過:存儲元素的順序和遍歷獲取出來的順序可能不一致。
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);
}
}結(jié)果:

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);
}
}結(jié)果:

常用Map集合
Map集合的概述
Map接口是雙列集合的頂層接口,下面是Map接口的定義
interface Map<K,V> K:鍵的類型;V:值的類型
? 存儲的數(shù)據(jù)必須包含key和value。
? key和value在Map集合中是一一對應(yīng)的關(guān)系。一個key對應(yīng)一個value。
? key在map集合中是不會重復(fù)的。
HashMap
HashMap集合的特點
- 底層數(shù)據(jù)結(jié)構(gòu)是哈希表
- 存儲元素的順序和遍歷獲取出來的順序可能不一致
- key不會重復(fù)
創(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獲取對應(yīng)的value值返回。如果key不存在就返回null |
| V remove(Object key) | 根據(jù)key刪除map中對應(yīng)的鍵值對。并且把刪除的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());
}
}結(jié)果:

使用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());
}
}結(jié)果:

2.使用keySet遍歷
map集合的keySet方法可以獲取一個Set集合,集合中存放的是所有的key。我們可以遍歷set集合拿到key對象,然后通過key獲取對應(yīng)的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));
}
}結(jié)果:

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的用法詳解的詳細內(nèi)容,更多關(guān)于Java Set Map集合的資料請關(guān)注腳本之家其它相關(guān)文章
相關(guān)文章
IntelliJ IDEA2023中運行Spring Boot找不到VM options進
這篇文章主要介紹了IntelliJ IDEA2023中運行Spring Boot找不到VM options進行端口的修改的問題解決,本文通過圖文并茂的形式給大家介紹的非常詳細,需要的朋友可以參考下2023-11-11
SpringBoot項目接入Nacos的實現(xiàn)步驟
SpringBoot項目使用nacos作為配置中心和服務(wù)注冊中心,同時兼容dubbo的注冊中心。 本Demo項目使用的SpringBoot版本是2.3.9.RELEASE2021-05-05
Java?Runnable和Thread實現(xiàn)多線程哪個更好你知道嗎
這篇文章主要為大家詳細介紹了Java?Runnable和Thread實現(xiàn)多線程哪個更好,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助<BR>2022-03-03
MyBatis-Plus中最簡單的查詢操作教程(Lambda)
這篇文章主要給大家介紹了關(guān)于MyBatis-Plus中最簡單的查詢操作的相關(guān)資料,文中通過實例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2022-03-03
Java 通過JDBC連接Mysql數(shù)據(jù)庫
本文給大家詳細介紹了java如何使用JDBC連接Mysql的方法以及驅(qū)動包的安裝,最后給大家附上了java通過JDBC連接其他各種數(shù)據(jù)庫的方法,有需要的小伙伴可以參考下。2015-11-11
SpringBoot AOP方式實現(xiàn)多數(shù)據(jù)源切換的方法
本篇文章主要介紹了SpringBoot AOP方式實現(xiàn)多數(shù)據(jù)源切換的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03

