java集合(二)

Map集合体系

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接口的一些常用方法的介绍:

  1. put(key, value):将指定的键值对添加到Map中。如果键已经存在,则会替换对应的值,并返回之前与该键相关联的值。示例代码如下:
Map<String, Integer> map = new HashMap<>();
map.put("apple", 10);
map.put("banana", 5);
map.put("orange", 8);
  1. get(key):返回与指定键相关联的值,如果不存在则返回null。示例代码如下:
Integer quantity = map.get("apple");
System.out.println("苹果的数量是:" + quantity); // 输出:苹果的数量是:10
  1. containsKey(key):检查Map中是否包含指定的键,返回true或false。示例代码如下:
boolean contains = map.containsKey("banana");
System.out.println("是否包含香蕉:" + contains); // 输出:是否包含香蕉:true
  1. containsValue(value):检查Map中是否包含指定的值,返回true或false。示例代码如下:
boolean contains = map.containsValue(8);
System.out.println("是否包含值8:" + contains); // 输出:是否包含值8:true
  1. remove(key):从Map中移除指定键及其相关的值,并返回之前与该键相关联的值。示例代码如下:
Integer removedQuantity = map.remove("orange");
System.out.println("移除的橙子数量是:" + removedQuantity); // 输出:移除的橙子数量是:8
  1. size():返回Map中键值对的数量。示例代码如下:
int size = map.size();
System.out.println("Map的大小是:" + size); // 输出:Map的大小是:2
  1. keySet():返回Map中所有键的集合,可以迭代遍历所有的键。示例代码如下:
Set<String> keys = map.keySet();
for (String key : keys) {
    System.out.println("键:" + key);
}
  1. values():返回Map中所有值的集合,可以迭代遍历所有的值。示例代码如下:
Collection<Integer> values = map.values();
for (Integer value : values) {
    System.out.println("值:" + value);
}

遍历Map集合

  1. 使用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集合的比较

  1. 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]
  1. 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]
  1. 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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值