Java Map集合與Collection類的使用詳解
Map接口
Map接口的特點(diǎn)
1. 用于存儲(chǔ)任意鍵值對(duì)(key - value)
2. 鍵:無(wú)序、無(wú)下標(biāo)、不允許重復(fù)(唯一)
3. 值:無(wú)序、無(wú)下標(biāo)、允許重復(fù)
Map集合中的方法:
1. V put(K key, V value) 將對(duì)象存到集合中,關(guān)聯(lián)鍵值
2. Object get(Object key) 根據(jù)鍵獲得對(duì)應(yīng)的值
3. Set<K> 返回所有的Key
4. Collection<V> values() 返回包含所有值的Collection集合
5. Set<Map.Entry<K, V>> 鍵值匹配的Set集合
Map接口的使用:
package com.collections.map;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* Map父接口的使用
* 特點(diǎn):(1)存儲(chǔ)鍵值對(duì)(2)鍵不能重復(fù),值可以重復(fù)(3)無(wú)序
*/
public class Demo01 {
public static void main(String[] args) {
// 創(chuàng)建Map集合
// 添加 鍵不可重復(fù)
Map<String,String> map = new HashMap<>();
map.put("CN","中國(guó)");
map.put("USA","美國(guó)");
map.put("UN","英國(guó)");
map.put("CN","zhongguo");
map.put("ZH","中國(guó)");
System.out.println("元素個(gè)數(shù):"+map.size());
System.out.println(map.toString());
// 刪除 用鍵刪除
map.remove("CN");
System.out.println("刪除后:"+map.size());
// 3.遍歷
// 3.1使用keySet
// 把map的鍵key轉(zhuǎn)成Set集合,再用Set集合的遍歷方法遍歷出來(lái)
System.out.println("--------3.1使用keySet-------");
// Set<String> strings = map.keySet();
for (String key:map.keySet()) {
System.out.println(key+":"+map.get(key));//map.get(key) 取出map集合中對(duì)應(yīng)key的值
}
// 3.2使用entrySet
// 把map的鍵和值放進(jìn)Entry映射對(duì)中并放進(jìn)Set集合,再用Set集合的遍歷方法遍歷出來(lái)
System.out.println("----------3.2使用entrySet---------");
// Set<Map.Entry<String, String>> entries = map.entrySet();
for (Map.Entry<String, String> entry:map.entrySet()) {
System.out.println(entry.getKey()+":"+entry.getValue());
}
// 4.判斷
System.out.println(map.containsKey("CN"));
System.out.println(map.containsValue("中國(guó)"));
}
}遍歷可以用keySet和entrySet。
運(yùn)行結(jié)果:

HashMap
存儲(chǔ)結(jié)構(gòu):哈希表(數(shù)組+鏈表+紅黑樹)
使用key可使hashcode和equals作為重復(fù)
HashMap的使用:
package com.collections.map;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
/**
* HashMap集合的使用
* 存儲(chǔ)結(jié)構(gòu):哈希表(數(shù)組+鏈表+紅黑樹)
*/
public class Demo02 {
public static void main(String[] args) {
// 創(chuàng)建集合
// 剛創(chuàng)建HashMap時(shí),table=null,size=0 目的:節(jié)省空間
// 添加第一個(gè)元素的時(shí)候,table=16, size=16*0.75=12
// 當(dāng)元素個(gè)數(shù)超過(guò)閾值12時(shí),會(huì)進(jìn)行擴(kuò)容,每次擴(kuò)容時(shí)原來(lái)的兩倍
HashMap<Student,String> students = new HashMap<>();
// 添加元素
Student s1 = new Student("孫悟空",100);
Student s2 = new Student("豬八戒",101);
Student s3 = new Student("沙和尚",102);
students.put(s1,"北京");
students.put(s2,"上海");
students.put(s3,"杭州");
// 鍵不可重復(fù),鍵重復(fù)了值會(huì)被替換掉,不存在新增操作
// students.put(s3,"西安");
students.put(new Student("沙和尚",102),"南京");
System.out.println("元素個(gè)數(shù)"+students.size());
System.out.println(students.toString());
// 遍歷
// 1.KeySet
System.out.println("--------------KeySet----------------");
Set<Student> students1 = students.keySet();
for (Student key: students1) {
System.out.println(key+":"+students.get(key));
}
// 2.entrySet
System.out.println("------------entrySet------------------------");
Set<Map.Entry<Student, String>> entries = students.entrySet();
Iterator<Map.Entry<Student, String>> iterator = entries.iterator();
while (iterator.hasNext()){
Map.Entry<Student, String> key = iterator.next();
System.out.println(key);
}
}
}Student類:
package com.collections.map;
import java.util.Objects;
public class Student {
private String name;
private int stuNo;
public Student() {
}
public Student(String name, int stuNo) {
this.name = name;
this.stuNo = stuNo;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getStuNo() {
return stuNo;
}
public void setStuNo(int stuNo) {
this.stuNo = stuNo;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", stuNo=" + stuNo +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return stuNo == student.stuNo &&
Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, stuNo);
}
}運(yùn)行結(jié)果:

使用方法 增、刪、遍歷、判斷與上述一致
HashMap原碼分析總結(jié):
- HashMap剛創(chuàng)建時(shí),table是null,節(jié)省空間,當(dāng)添加第一個(gè)元素時(shí),table容量調(diào)整為16
- 當(dāng)元素個(gè)數(shù)大于閾值(16*0.75 = 12)時(shí),會(huì)進(jìn)行擴(kuò)容,擴(kuò)容后的大小為原來(lái)的兩倍,目的是減少調(diào)整元素的個(gè)數(shù)
- jdk1.8 當(dāng)每個(gè)鏈表長(zhǎng)度 >8 ,并且數(shù)組元素個(gè)數(shù) ≥64時(shí),會(huì)調(diào)整成紅黑樹,目的是提高效率
- jdk1.8 當(dāng)鏈表長(zhǎng)度 <6 時(shí) 調(diào)整成鏈表
- jdk1.8 以前,鏈表時(shí)頭插入,之后為尾插入
Hashtable和Properties:
Hashtable線程安全,運(yùn)行效率慢;不允許null作為key或是value。
Properties是hashtable的子類,要求key和value都是string,通常用于配置文件的讀取。
TreeMap:
使用方式參考TreeSet:必須實(shí)現(xiàn)Comparable接口或者使用Compator比較器。
package com.collections.map;
import java.util.Comparator;
import java.util.TreeSet;
/**
* TreeSet的使用
*/
public class Demo03 {
public static void main(String[] args) {
TreeSet<Student> treeSet = new TreeSet<>(new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
int n1 = o1.getStuNo()-o2.getStuNo();
int n2 = o1.getName().compareTo(o2.getName());
return n1==0?n2:n1;
}
});
Student s1 = new Student("孫悟空",100);
Student s2 = new Student("豬八戒",101);
Student s3 = new Student("沙和尚",102);
treeSet.add(s1);
treeSet.add(s2);
treeSet.add(s3);
System.out.println(treeSet.toString());
}
}Student類:
package com.collections.map;
import java.util.Objects;
public class Student {
private String name;
private int stuNo;
public Student() {
}
public Student(String name, int stuNo) {
this.name = name;
this.stuNo = stuNo;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getStuNo() {
return stuNo;
}
public void setStuNo(int stuNo) {
this.stuNo = stuNo;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", stuNo=" + stuNo +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return stuNo == student.stuNo &&
Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, stuNo);
}
}運(yùn)行結(jié)果:

使用方法和上面一致。
Collection工具類:
概念:集合工具類,定義了除了存取以外的集合常用方法
直接二分查找int i = Collections.binarySearch(list, x);成功返回索引、copy復(fù)制、reverse反轉(zhuǎn)、shuffle打亂
其他方法 : 數(shù)組轉(zhuǎn)成集合、集合轉(zhuǎn)成數(shù)組
package com.collections;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
* Collections類的使用
*/
public class Demo02 {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(10);
list.add(5);
list.add(20);
list.add(60);
list.add(1);
// sort 排序
System.out.println("排序之前"+list.toString());
Collections.sort(list);
System.out.println("排序之后"+list.toString());
// copy復(fù)制
ArrayList<Integer> arrayList = new ArrayList<>();
for (int i = 0; i <list.size() ; i++) {
arrayList.add(0);
}
Collections.copy(arrayList,list);
System.out.println(arrayList.toString());
// reverse反轉(zhuǎn)
Collections.reverse(arrayList);
System.out.println(arrayList.toString());
// shuffle 打亂
Collections.shuffle(arrayList);
System.out.println(arrayList.toString());
// 補(bǔ)充:集合轉(zhuǎn)成數(shù)組
Integer[] integer = list.toArray(new Integer[0]);
System.out.println(integer.length);
System.out.println(Arrays.toString(integer));
// 數(shù)組轉(zhuǎn)成集合
// 創(chuàng)建出來(lái)的集合是一個(gè)受限集合,無(wú)法添加和刪除元素
String [] s = {"張三","李四","王五","趙六",};
List<String> strings = Arrays.asList(s);
System.out.println(strings);
// 還要注意int類型的數(shù)組轉(zhuǎn)出的集合最好是Integer類型,否則就是int[]數(shù)組類型了
Integer[] i = {100,200,300,400};
List<Integer> ints = Arrays.asList(i);
System.out.println(ints);
}
}運(yùn)行結(jié)果:

到此這篇關(guān)于Java Map集合與Collection類的使用詳解的文章就介紹到這了,更多相關(guān)Java Map與Collection內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java 利用枚舉實(shí)現(xiàn)接口進(jìn)行統(tǒng)一管理
這篇文章主要介紹了Java 利用枚舉實(shí)現(xiàn)接口進(jìn)行統(tǒng)一管理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02
詳解在springboot中使用Mybatis Generator的兩種方式
這篇文章主要介紹了詳解在springboot中使用Mybatis Generator的兩種方式,本文將介紹到在springboot的項(xiàng)目中如何去配置和使用MBG以及MBG生成代碼的兩種方式,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-11-11
Java實(shí)現(xiàn)經(jīng)典游戲超級(jí)瑪麗的示例代碼
在你的童年記憶里,是否有一個(gè)蹦跳、頂蘑菇的小人?本文將用java語(yǔ)言實(shí)現(xiàn)經(jīng)典游戲《超級(jí)瑪麗》,文中采用了swing技術(shù)進(jìn)行了界面化處理,需要的可以參考一下2022-02-02
LinkedBlockingQueue鏈?zhǔn)阶枞?duì)列的使用和原理解析
這篇文章主要介紹了LinkedBlockingQueue鏈?zhǔn)阶枞?duì)列的使用和原理解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10
關(guān)于SpringCloud?Ribbon替換輪詢算法問(wèn)題
Spring?Cloud?Ribbon是基于Netlix?Ribbon實(shí)現(xiàn)的一套客戶端負(fù)載均衡的工具。接下來(lái)通過(guò)本文給大家介紹SpringCloud?Ribbon替換輪詢算法問(wèn)題,需要的朋友可以參考下2022-01-01
Java 多線程synchronized關(guān)鍵字詳解(六)
這篇文章主要介紹了Java 多線程synchronized關(guān)鍵字詳解(六)的相關(guān)資料,需要的朋友可以參考下2015-12-12
解決IDEA開發(fā)工具右側(cè)沒(méi)有Maven工具欄的問(wèn)題
這篇文章主要給大家解決了IDEA開發(fā)工具右側(cè)沒(méi)有Maven工具欄的問(wèn)題,文中有詳細(xì)的解決步驟,如果有遇到一樣問(wèn)題的小伙伴,可以參考閱讀本文2023-09-09

