java集合(二)
Map集合
- Map集合是键值对集合,Map集合主要用于存储“key-value”键值对的数据,key可以看作是value的索引,通过key,查找到value值, key不能重复。
- 需要存储一一对应的数据时,就可以考虑使用Map集合来做
- Map是一个interface , 有多种实现类,比如hash表实现的HashMap ,排序二叉树实现的TreeMap等
- Map比较常用的实现类。
HashMap: 元素按照键是无序,不重复,无索引,值不做要求。
LinkedHashMap: 元素按照键是有序,不重复,无索引,值不做要求。
TreeMap:元素按照建是排序,不重复,无索引的,值不做要求。
Map的常用方法
Map是双列集合的祖宗,它的功能是全部双列集合都可以继承过来使用的。
在Java中,Map是一种用于存储键值对的集合类。Map接口定义了一组与键相关联的值,并且键不会重复。
下面是Map接口的一些常用方法的介绍:
- put(key, value):将指定的键值对添加到Map中。如果键已经存在,则会替换对应的值,并返回之前与该键相关联的值。示例代码如下:
Map<String, Integer> map = new HashMap<>();
map.put("apple", 10);
map.put("banana", 5);
map.put("orange", 8);
- get(key):返回与指定键相关联的值,如果不存在则返回null。示例代码如下:
Integer quantity = map.get("apple");
System.out.println("苹果的数量是:" + quantity); // 输出:苹果的数量是:10
- containsKey(key):检查Map中是否包含指定的键,返回true或false。示例代码如下:
boolean contains = map.containsKey("banana");
System.out.println("是否包含香蕉:" + contains); // 输出:是否包含香蕉:true
- containsValue(value):检查Map中是否包含指定的值,返回true或false。示例代码如下:
boolean contains = map.containsValue(8);
System.out.println("是否包含值8:" + contains); // 输出:是否包含值8:true
- remove(key):从Map中移除指定键及其相关的值,并返回之前与该键相关联的值。示例代码如下:
Integer removedQuantity = map.remove("orange");
System.out.println("移除的橙子数量是:" + removedQuantity); // 输出:移除的橙子数量是:8
- size():返回Map中键值对的数量。示例代码如下:
int size = map.size();
System.out.println("Map的大小是:" + size); // 输出:Map的大小是:2
- keySet():返回Map中所有键的集合,可以迭代遍历所有的键。示例代码如下:
Set<String> keys = map.keySet();
for (String key : keys) {
System.out.println("键:" + key);
}
- values():返回Map中所有值的集合,可以迭代遍历所有的值。示例代码如下:
Collection<Integer> values = map.values();
for (Integer value : values) {
System.out.println("值:" + value);
}
遍历Map集合
- 使用Iterator遍历Map的EntrySet:
Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);
Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, Integer> entry = iterator.next();
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key + " = " + value);
}
- 使用For-Each遍历Map的EntrySet:
for (Map.Entry<String, Integer> entry : map.entrySet()) {
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key + " = " + value);
}
- 遍历Map的KeySet,然后通过key获取对应的value:
for (String key : map.keySet()) {
Integer value = map.get(key);
System.out.println(key + " = " + value);
}
HashMap集合
1、HashMap的特点和底层原理?
-
由键决定:无序、不重复、无索引。HashMap底层是哈希表结构的。
-
基于哈希表。增删改查的性能都较好。
2、HashMap如何实现键的唯一性的?
- 依赖hashCode方法和equals方法保证键的唯一。
- 如果键要存储的是自定义对象,需要重写hashCode和equals方法。
LinkedHashMap集合
- 底层数据结构依然是基于哈希表实现的,只是每个键值对元素又额外的多了一个双链表的机制记录元素顺序(保证有序)
- 实际上:原来学习的LinkedHashSet集合的底层原理就是LinkedHashMap。
TreeMap集合
- 特点:不重复、无索引、可排序(按照键的大小默认升序排序,只能对键排序)
- 原理:TreeMap跟TreeSet集合的底层原理是一样的,都是基于红黑树实现的排序。
TreeMap集合同样也支持两种方式来指定排序规则 - 让类实现Comparable接口,重写比较规则。
- TreeMap集合有一个有参数构造器,支持创建Comparator比较器对象,以便用来指定比较规则。
HashMap和TreeMap的异同
相同点
键不可重复
只能通过迭代器和foreach遍历键,然后获取值
不支持手动排序(不能修改元素间的位置关系)
元素顺序和加入顺序无关
不同点
HashMap底层使用Hash算法计算键的存储位置,键的顺序不可预知,保存的键没有特殊要求,可以插入null。
TreeMap底层使用二叉树存储键,键的顺序和键的排序规则有关,加入的键必须实现Comparable接口,不能插入null。
List , Set , Map集合的比较
- List集合:
- List是一个有序的集合,它允许重复元素。
- List中的元素可以根据索引位置进行访问和操作。
- List中可以插入、删除和修改元素,且可以根据元素的索引进行操作。
- 常见的List实现类有ArrayList和LinkedList。
示例:
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Orange");
list.add("Apple");
System.out.println(list); // 输出:[Apple, Banana, Orange, Apple]
- Set集合:
- Set是一个无序的集合,不允许重复元素。
- Set中的元素没有索引,不能直接访问和操作。
- Set中的元素是唯一的,如果试图添加重复元素,则添加操作会被忽略。
- 常见的Set实现类有HashSet和TreeSet。
示例:
Set<String> set = new HashSet<>();
set.add("Apple");
set.add("Banana");
set.add("Orange");
set.add("Apple"); // 重复元素,被忽略
System.out.println(set); // 输出:[Apple, Banana, Orange]
- Map集合:
- Map是一个键值对的集合,每个键对应一个值。
- Map中的键是唯一的,但值可以重复。
- 通过键可以快速查找对应的值。
- 常见的Map实现类有HashMap和TreeMap。
示例:
Map<String, Integer> map = new HashMap<>();
map.put("Apple", 2);
map.put("Banana", 3);
map.put("Orange", 5);
map.put("Apple", 4); // 键重复,值会被替换
System.out.println(map); // 输出:{Apple=4, Banana=3, Orange=5}
通过比较List、Set和Map,可以看到它们在存储元素的方式和允许的操作上有所不同。如果需要有序、允许重复元素并且需要根据索引进行操作,可以使用List;如果需要元素唯一且无需保持顺序,可以使用Set;如果需要通过键值对进行访问和操作,可以使用Map。