Java常用集合之Set和Map的用法詳解
常用Set集合
Set集合的特點(diǎn)
? Set接口下的集合都會(huì)有以下特點(diǎn)
- 不能存儲(chǔ)重復(fù)元素
- 沒(méi)有索引
HashSet
HashSet集合的特點(diǎn)
- 底層數(shù)據(jù)結(jié)構(gòu)是哈希表
- 存儲(chǔ)元素的順序和遍歷獲取出來(lái)的順序可能不一致
- 沒(méi)有索引
- 集合中不能存儲(chǔ)重復(fù)元素
創(chuàng)建對(duì)象
HashSet<元素?cái)?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ǎn)調(diào)試一下:

可以看到愚生淺末四個(gè)字符已經(jīng)裝入set,且f為true證明添加成功。
我們?cè)僭囋噭h除:
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)沒(méi)有生了,且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();
添加了愚生淺末四個(gè)字符,所以可以得到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é)果:

前面說(shuō)過(guò):存儲(chǔ)元素的順序和遍歷獲取出來(lá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);
}
}結(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:值的類型
? 存儲(chǔ)的數(shù)據(jù)必須包含key和value。
? key和value在Map集合中是一一對(duì)應(yīng)的關(guān)系。一個(gè)key對(duì)應(yīng)一個(gè)value。
? key在map集合中是不會(huì)重復(fù)的。
HashMap
HashMap集合的特點(diǎn)
- 底層數(shù)據(jù)結(jié)構(gòu)是哈希表
- 存儲(chǔ)元素的順序和遍歷獲取出來(lái)的順序可能不一致
- key不會(huì)重復(fù)
創(chuàng)建對(duì)象
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獲取對(duì)應(yīng)的value值返回。如果key不存在就返回null |
| V remove(Object key) | 根據(jù)key刪除map中對(duì)應(yīng)的鍵值對(duì)。并且把刪除的value返回 |
| boolean containsKey(Object key) | 判斷key是否存在 |
| int size() | 集合中鍵值對(duì)的對(duì)數(shù) |
| void clear() | 清空集合中的所有鍵值對(duì) |
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", "愚生淺末");//將原來(lái)的愷龍?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方法可以獲取一個(gè)Set集合,集合中存放的是Entry對(duì)象,一個(gè)Entry對(duì)象相當(dāng)于一個(gè)鍵值對(duì)。我們可以遍歷set集合拿到Entry對(duì)象,然后獲取出里面的鍵和值。
使用迭代器遍歷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方法可以獲取一個(gè)Set集合,集合中存放的是所有的key。我們可以遍歷set集合拿到key對(duì)象,然后通過(guò)key獲取對(duì)應(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在添加元素的時(shí)候會(huì)判斷集合中是否有key和本次存入的key相同。判斷的時(shí)候主要是通過(guò)hashCode方法和equals方法來(lái)進(jìn)行判斷的。hashCode相同,并且equals判斷也相同就會(huì)認(rèn)為是同一個(gè)key。

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

