HashSet
在Java中,HashSet是一个实现了Set接口的类,它使用哈希表来存储元素,因此可以快速地执行添加、删除和查找操作。
HashSet中的元素是不重复的,它会自动去除重复元素,这是因为HashSet内部是使用HashMap来实现的,其中键(key)存储的就是集合中的元素,而值(value)则是一个任意的常量对象。当我们向HashSet中添加一个元素时,实际上是将该元素作为键(key)添加到HashMap中,而值(value)则固定为一个特殊的常量对象。因此,当我们尝试向HashSet中添加重复的元素时,HashMap会检测到这个元素已经存在于键(key)中,就会放弃这个操作,从而保证HashSet中的元素是不重复的。
HashSet具有快速查找元素的能力,它内部使用哈希表来存储元素,因此查找元素的速度非常快。但是,在进行遍历时,HashSet的元素是无序的,这是因为哈希表内部是按照哈希值来存储元素的,而哈希值是随机的,因此HashSet中的元素是没有顺序的。
总之,HashSet是一个非常常用的集合类,它具有快速添加、删除、查找元素的能力,可以自动去除重复元素,但是在遍历时元素是无序的。
常用方法:
add(E e):向集合中添加元素e,如果元素e已经存在于集合中,则添加失败。
remove(Object o):从集合中删除元素o,如果集合中不包含元素o,则删除操作失败。
contains(Object o):判断集合中是否包含元素o,如果包含返回true,否则返回false。
size():返回集合中元素的数量。
clear():清空集合中所有的元素。
isEmpty():判断集合是否为空,如果为空返回true,否则返回false。
iterator():返回一个迭代器,用于遍历集合中的元素。
toArray():将集合中的元素以数组的形式返回。
需要注意的是,HashSet中的元素是无序的,因此在遍历时元素的顺序是不确定的。此外,HashSet内部使用哈希表来实现,因此添加、删除和查找元素的时间复杂度都为O(1),但是在遍历时性能较差。因此,在使用HashSet时,应该根据实际需求来选择合适的数据结构。
HashMap
在Java中,HashMap是一种基于哈希表实现的Map接口,它允许我们存储键值对,并通过键来快速查找对应的值。
HashMap中的键和值都可以为null,但是一个HashMap中最多只能有一个键为null的映射关系,因为HashMap中的键是唯一的。HashMap中的元素是无序的,这是因为HashMap内部是使用哈希表来存储元素的,哈希表内部的存储顺序是随机的。
HashMap的基本操作包括添加元素、删除元素和查找元素,它们的时间复杂度都是O(1),因此HashMap非常适合用于存储大量的键值对,并需要快速地查找对应值的场景。
常用方法:
put(K key, V value):将键值对(key, value)添加到HashMap中,如果键已经存在,则更新其对应的值。
remove(Object key):从HashMap中删除指定键所对应的键值对,如果键不存在,则删除操作失败。
get(Object key):返回指定键所对应的值,如果键不存在,则返回null。
containsKey(Object key):判断HashMap中是否包含指定的键,如果包含则返回true,否则返回false。
containsValue(Object value):判断HashMap中是否包含指定的值,如果包含则返回true,否则返回false。
keySet():返回HashMap中所有键的Set视图。
values():返回HashMap中所有值的Collection视图。
entrySet():返回HashMap中所有键值对的Set视图。
需要注意的是,在多线程环境下,HashMap是不安全的,因为它不是线程安全的,因此在多线程环境下使用时,需要对其进行同步处理。此外,在使用HashMap时,应该根据实际需求来选择合适的数据结构,因为HashMap的元素是无序的。
HashMap顺序读取:
import java.util.LinkedHashMap;
import java.util.Map;
public class LinkedHashMapDemo {
public static void main(String[] args) {
LinkedHashMap<String, Integer> linkedHashMap = new LinkedHashMap<>(16, 0.75f, true);
// 添加元素
linkedHashMap.put("apple", 2);
linkedHashMap.put("banana", 3);
linkedHashMap.put("orange", 4);
linkedHashMap.put("peach", 5);
// 按照插入顺序遍历元素
System.out.println("按照插入顺序遍历元素:");
for (Map.Entry<String, Integer> entry : linkedHashMap.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
// 访问元素
linkedHashMap.get("banana");
linkedHashMap.get("apple");
// 按照访问顺序遍历元素
System.out.println("按照访问顺序遍历元素:");
for (Map.Entry<String, Integer> entry : linkedHashMap.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
}
}
结果:
按照插入顺序遍历元素:
apple: 2
banana: 3
orange: 4
peach: 5
按照访问顺序遍历元素:
orange: 4
peach: 5
banana: 3
apple: 2
LinkedList
LinkedList是Java中的一个双向链表实现的集合类,实现了List、Deque和Queue等接口,它可以在任意位置高效地插入和删除元素。
常用方法
add(E e):在链表末尾添加元素。
addFirst(E e):在链表头部插入元素。
addLast(E e):在链表末尾添加元素,等价于add(E e)。
remove():移除并返回链表的头节点。
removeFirst():移除并返回链表的头节点,等价于remove()。
removeLast():移除并返回链表的尾节点。
clear():清空链表。
get(int index):返回链表中指定位置的元素。
set(int index, E element):将链表中指定位置的元素替换为新元素。
size():返回链表中元素的个数。
isEmpty():判断链表是否为空。
contains(Object o):判断链表中是否包含指定元素。
indexOf(Object o):返回链表中第一次出现指定元素的位置,如果链表中不包含该元素,则返回-1。
lastIndexOf(Object o):返回链表中最后一次出现指定元素的位置,如果链表中不包含该元素,则返回-1。
toArray():将链表转换为数组。
需要注意的是,由于LinkedList底层实现是一个双向链表,因此在随机访问元素时效率较低,通常建议在需要经常随机访问元素的情况下使用ArrayList,而在需要经常插入、删除元素的情况下使用LinkedList。