Java容器-Map接口
程序员文章站
2022-06-16 23:37:54
...
1. Map 接口特点
Map 接口定义了双例集合的存储特征,它并不是 Collection 接口的子接口。双例集合的存储特征是以 key 与 value 结构为单位进行存储。
Map 与 Collecton 的区别:
- Collection 中的容器,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储。
- Map 中的容器,元素是成对存在的(理解为现代社会的夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的值。
- Collection 中的容器称为单列集合,Map 中的容器称为双列集合。
- Map 中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。
- Map 中常用的容器为 HashMap,TreeMap 等。
2. Map 的常用方法
方法 | 说明 |
---|---|
V put (K key,V value) | 把 key 与 value 添加到 Map 集合中 |
void putAll(Map m) | 从指定 Map 中将所有映射关系复制到此 Map 中 |
V remove (Object key) | 删除 key 对应的 value |
V get(Object key) | 根据指定的 key,获取对应的 value |
boolean containsKey(Object key) | 判断容器中是否包含指定的 key |
boolean containsValue(Object value) | 判断容器中是否包含指定的 value |
Set keySet() | 获取 Map 集合中所有的 key,存储到 Set 集合中 |
Set<Map.Entry<K,V>> entrySet() | 返回一个 Set 基于 Map.Entry 类型包含 Map 中所 |
有映射 | |
void clear() | 删除 Map 中所有的映射 |
3. HashMap 容器类
HashMap 是 Map 接口的接口实现类,它采用哈希算法实现,是 Map 接口最常用的实现类。 由于底层采用了哈希表存储数据,所以要求键不能重复,如果发生重复,新的值会替换旧的值。 HashMap 在查找、删除、修改方面都有非常高的效率。
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class HashMapTest01 {
public static void main(String[] args) {
//实例化HashMap容器
Map<String, String> map = new HashMap<>();
//添加元素
map.put("username", "张三");
map.put("age", "18");
map.put("sex", "男");
String value = map.put("username", "李四");
System.out.println(value); //张三 返回被覆盖的value
System.out.println(map); //{sex=男, age=18, username=李四}
//获取元素
String val = map.get("username");
System.out.println(val); //李四
//获取HashMap中所以的元素,可以使用 keySet 方法与 get 方法一并完成
Set<String> keys = map.keySet();
for (String key: keys){
String val2 = map.get(key);
System.out.println(key + "----" + val2);
}
//通过entrySet方法获取Map.Entry类型获取元素
Set<Map.Entry<String,String>> entrySet = map.entrySet();
for (Map.Entry<String,String> entry: entrySet){
String key = entry.getKey();
String val3 = entry.getValue();
System.out.println(key + "----" + val3);
}
//删除元素
String val4 = map.remove("age"); //返回被删除元素的value
//判断key或value是否存在
boolean flag1 = map.containsKey("username");
boolean flag2 = map.containsValue("20");
-----------------------------------------------------------------
//实例化HashMap容器
Map<String, String> map = new HashMap<>();
map.put("username", "张三");
map.put("age", "18");
map.put("sex", "男");
Map<String, String> map2 = new HashMap<>();
map2.put("id", "1001");
map2.put("age", "20");
//Map容器的并集操作
map.putAll(map2);
Set<String> keys = map.keySet();
for (String key: keys){
System.out.println(key+"====" + map.get(key));
}
}
}
4. TreeMap 容器类
TreeMap 和 HashMap 同样实现了 Map 接口,所以,对于 API 的用法来说是没有区别的。HashMap 效率高于 TreeMap;TreeMap 是可以对键进行排序的一种容器,在需要对键排序时可选用 TreeMap。TreeMap 底层是基于红黑树实现的。
在使用 TreeMap 时需要给定排序规则(同TreeSet):
- 元素自身实现比较规则
- 通过比较器实现比较规则
5. 迭代器的使用
5.1 Iterator 迭代器接口介绍
Collection接口继承了Iterable接口,在该接口中包含一个名为iterator的抽象方法,所有实现了Collection接口的容器类对该方法做了具体实现。iterator方法会返回一个Iterator接口类型的迭代器对象,在该对象中包含了三个方法用于实现对单例容器的迭代处理。
Iterator对象的工作原理:
Iterator接口定义了如下方法:
- boolean hasNext(); //判断游标当前位置是否有元素,如果有返回true,否则返回false;
- Object next(); //获取当前游标所在位置的元素,并将游标移动到下一个位置;
- void remove(); //删除游标当前位置的元素,在执行完next后该操作只能执行一次;
5.2 迭代器的使用
5.2.1 使用 Iterator 迭代 List 接口类型容器
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IteratorListTest {
public static void main(String[] args) {
//实例化容器
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
//获取元素
//方式一:在迭代器中,通过while循环获取元素
//获取迭代器对象
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()){
String value = iterator.next();
System.out.println(value);
}
System.out.println("--------------------------------");
//方法二:在迭代器中,通过for循环获取元素
for (Iterator<String> it = list.iterator();it.hasNext();){
String value = it.next();
System.out.println(value);
}
}
}
5.2.2 使用 Iterator 迭代 Set 接口类型容器
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class IteratorSetTest {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("a");
set.add("b");
set.add("c");
//获取元素
//方式一:通过 while 循环
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
System.out.println("-----------------------");
//方式二:通过 for 循环
for (Iterator<String> it = set.iterator();it.hasNext();){
System.out.println(it.next());
}
}
}
5.2.3 在迭代器中删除元素
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IteratorRemoveTest {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
//不要在一次循环中多次调用next方法
String value = iterator.next();
if (value.equals("c")){
iterator.remove();
}
}
//等价于
//list.removeIf(value -> value.equals("c"));
}
}
6. Collections 工具类
Collections 是一个工具类,它提供了对 Set、List、Map 进行排序、填充、查找元素的辅助方法。该类中所有的方法都为静态方法。
常用方法:
- void sort(List) //对 List 容器内的元素排序,排序的规则是按照升序进行排序。
- void shuffle(List) //对 List 容器内的元素进行随机排列。
- void reverse(List) //对 List 容器内的元素进行逆续排列 。
- void fill(List, Object) //用一个特定的对象重写整个 List 容器。
- int binarySearch(List, Object)//对于顺序的 List 容器,采用折半查找的方法查找特定对象。
6.1 对 List 类型容器进行排序处理
import java.util.*;
public class CollectionTest01 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("c");
list.add("b");
list.add("d");
list.add("a");
//通过 Collections 工具类中的 sort 方法完成排序
Collections.sort(list);
for(String str:list){
System.out.println(str);
}
}
}
6.2 对 List 类型容器进行随机排序
List<String> list2 = new ArrayList<>();
list2.add("a");
list2.add("b");
list2.add("c");
list2.add("d");
//洗牌处理
Collections.shuffle(list2);
for(String str:list2){
System.out.println(str);
}