大家好,今天我们来聊聊Java集合框架中的Set集合、Map集合以及Stream流,并分享一些实用案例。
Set集合:无序、不重复、无索引
Set集合主要包含三种实现类:
- HashSet:基于哈希表实现,无序、不重复、无索引。元素添加顺序和获取顺序不一致,适合快速查找。
- LinkedHashSet:基于哈希表和双向链表实现,有序、不重复、无索引。元素添加顺序和获取顺序一致,适合需要记住元素添加顺序的场景。
- TreeSet:基于红黑树实现,可排序、不重复、无索引。元素按照键的自然顺序或指定比较器排序,适合需要排序的场景。
底层原理:
- HashSet:底层使用哈希表(数组+链表+红黑树)存储元素,通过元素的哈希值确定元素在数组中的位置,从而实现快速查找。
- LinkedHashSet:在HashSet的基础上,使用双向链表记录元素的添加顺序,从而实现有序性。
- TreeSet:底层使用红黑树存储元素,红黑树是一种自平衡的二叉搜索树,能够保证元素的有序性,并提供高效的查找、插入和删除操作。
去重机制:
Set集合通过哈希值和equals方法来判断元素是否重复。如果希望Set集合认为两个内容相同的对象是重复的,必须重写对象的hashCode和equals方法。
Map集合:键值对集合
Map集合主要包含三种实现类:
- HashMap:基于哈希表实现,无序、不重复、无索引。键值对无序,键不重复,值可重复,适合快速查找。
- LinkedHashMap:基于哈希表和双向链表实现,有序、不重复、无索引。键值对有序,键不重复,值可重复,适合需要记住键值对添加顺序的场景。
- TreeMap:基于红黑树实现,可排序、不重复、无索引。键值对按照键的自然顺序或指定比较器排序,键不重复,值可重复,适合需要排序的场景。
常用方法:
- 添加元素:put(K key, V value)
- 获取大小:size()
- 清空集合:clear()
- 判断是否为空:isEmpty()
- 根据键获取值:get(Object key)
- 根据键删除元素:remove(Object key)
- 判断是否包含键:containsKey(Object key)
- 判断是否包含值:containsValue(Object value)
- 获取所有键的集合:keySet()
- 获取所有值的集合:values()
遍历方式:
- 键找值:通过keySet()方法获取所有键的集合,再遍历键集合,通过get方法获取对应的值。
- 键值对:通过entrySet()方法获取所有键值对的集合,再遍历键值对集合,通过getKey()和getValue()方法获取键和值。
- Lambda表达式:使用forEach方法结合Lambda表达式进行遍历。
Stream流:简化集合、数组操作
Stream流是JDK 8新增的API,可以用于操作集合或数组的数据。它结合了Lambda表达式,功能强大,性能高效,代码简洁,可读性好。
使用步骤:
- 获取Stream流
- 调用Stream流的方法对数据进行处理
- 获取处理的结果
常用方法:
- 获取Stream流:stream(), Arrays.stream(), Stream.of()
- 中间方法:filter(), sorted(), limit(), skip(), distinct(), map(), concat()
- 终结方法:forEach(), count(), max(), min(), collect()
收集Stream流:
Stream流可以将操作后的结果收集到集合或数组中,例如:
- collect(Collectors.toList())
- collect(Collectors.toSet())
- collect(Collectors.toMap())
Set集合示例
HashSet去重
import java.util.HashSet;public class HashSetExample {public static void main(String[] args) {HashSet<Integer> set = new HashSet<>();set.add(1);set.add(2);set.add(3);set.add(2); // 重复元素,不会添加到集合中set.add(4);System.out.println(set); // 输出: [1, 2, 3, 4]}
}
TreeSet排序
import java.util.TreeSet;public class TreeSetExample {public static void main(String[] args) {TreeSet<String> set = new TreeSet<>();set.add("banana");set.add("apple");set.add("cherry");System.out.println(set); // 输出: [apple, banana, cherry]}
}
LinkedHashSet有序
import java.util.LinkedHashSet;public class LinkedHashSetExample {public static void main(String[] args) {LinkedHashSet<String> set = new LinkedHashSet<>();set.add("banana");set.add("apple");set.add("cherry");System.out.println(set); // 输出: [banana, apple, cherry]}
}
Map集合示例
HashMap存储键值对
import java.util.HashMap;public class HashMapExample {public static void main(String[] args) {HashMap<String, Integer> map = new HashMap<>();map.put("apple", 1);map.put("banana", 2);map.put("cherry", 3);System.out.println(map); // 输出: {apple=1, banana=2, cherry=3}}
}
TreeMap排序
import java.util.TreeMap;public class TreeMapExample {public static void main(String[] args) {TreeMap<String, Integer> map = new TreeMap<>();map.put("apple", 1);map.put("banana", 2);map.put("cherry", 3);System.out.println(map); // 输出: {apple=1, banana=2, cherry=3}}
}
LinkedHashMap有序
import java.util.LinkedHashMap;public class LinkedHashMapExample {public static void main(String[] args) {LinkedHashMap<String, Integer> map = new LinkedHashMap<>();map.put("apple", 1);map.put("banana", 2);map.put("cherry", 3);System.out.println(map); // 输出: {apple=1, banana=2, cherry=3}}
}
Stream流示例
过滤、排序、去重
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class StreamExample {public static void main(String[] args) {List<String> list = Arrays.asList("apple", "banana", "cherry", "apple", "banana");List<String> result = list.stream().filter(s -> s.startsWith("a")) // 过滤以"a"开头的元素.sorted() // 排序.distinct() // 去重.collect(Collectors.toList()); // 收集结果System.out.println(result); // 输出: [apple]}
}
Map的键值对遍历
import java.util.HashMap;
import java.util.Map;public class MapStreamExample {public static void main(String[] args) {Map<String, Integer> map = new HashMap<>();map.put("apple", 1);map.put("banana", 2);map.put("cherry", 3);map.entrySet().stream().forEach(entry -> System.out.println(entry.getKey() + " = " + entry.getValue()));}
}
这些代码示例涵盖了Set集合、Map集合以及Stream流的基本操作,希望对你有所帮助!