hashset hashmap treeset treemap
时间: 2024-10-31 17:06:30 浏览: 27
哈希集合(HashSet)和哈希映射(HashMap)是数据结构中常见的两个类型,它们都基于哈希表实现。
1. HashSet:它是一个无序的不包含重复元素的集合,通过散列函数将元素存储在数组中。插入、删除和查找操作的时间复杂度通常是O(1),但在极端情况下,如果所有元素都哈希到同一个位置,性能会下降到线性。
2. HashMap:同样基于哈希表,但它允许键值对的形式存储数据。这里的键是唯一的,值可以重复。它的查找、插入和删除操作也是平均O(1)时间复杂度,但如果键冲突较多,可能会降低效率。
另一方面,树形集合和映射:
3. TreeSet(TreeSet其实是SortedSet的实现):它是有序的集合,内部使用红黑树实现。查找操作仍然保持高效,因为它是基于比较的有序结构,但是插入和删除操作会比HashSet稍慢,因为需要维护排序。
4. TreeMap(TreeMap其实是SortedMap的实现):与TreeSet类似,TreeMap是有序的键值对集合,通过键的自然顺序或提供的Comparator进行排序。查找、插入和删除操作的时间复杂度取决于树的高度,通常较慢于HashMap。
相关问题
java arraylist、linkedlist、treeset、hashset、hashmap、treemap的特点
1. ArrayList:
- ArrayList是基于数组实现的动态数组,可以自动扩容,可以存储任何对象类型。
- 数组的优点是可以随机访问元素,缺点是插入和删除元素时需要移动其他元素。
- ArrayList支持快速随机访问,但插入和删除元素的效率较低。
2. LinkedList:
- LinkedList是基于链表实现的,每个节点包含一个指向前驱和后继节点的指针,可以存储任何对象类型。
- 链表的优点是插入和删除元素时不需要移动其他元素,缺点是不能直接随机访问元素,需要遍历整个链表。
- LinkedList支持高效的插入和删除操作,但随机访问元素的效率较低。
3. TreeSet:
- TreeSet是基于红黑树实现的有序集合,不允许重复元素,可以存储任何对象类型。
- 红黑树的优点是能够自动排序,插入和删除元素的效率较高,缺点是随机访问元素的效率较低。
- TreeSet支持高效的插入、删除和查找操作,但随机访问元素的效率较低。
4. HashSet:
- HashSet是基于哈希表实现的无序集合,不允许重复元素,可以存储任何对象类型。
- 哈希表的优点是能够快速查找元素,缺点是元素的顺序是随机的。
- HashSet支持高效的插入、删除和查找操作,但不能保证元素的顺序。
5. HashMap:
- HashMap是基于哈希表实现的键值对集合,键和值都可以存储任何对象类型。
- HashMap的优点是能够快速查找元素,缺点是键和值的顺序是随机的。
- HashMap支持高效的插入、删除和查找操作,但不能保证键和值的顺序。
6. TreeMap:
- TreeMap是基于红黑树实现的有序键值对集合,键不能重复,值可以存储任何对象类型。
- 红黑树的优点是能够自动排序,插入和删除元素的效率较高,缺点是随机访问元素的效率较低。
- TreeMap支持高效的插入、删除和查找操作,并且按照键的顺序排列。
创建一个类,实现如下功能 1、测试set容器的功能,可以使用hashset和treeset,向容器中输入20个随机数,使用迭代器遍历输出 2、测试map容器的功能,可以使用hashmap和treemap,向容器中输入20个随机数,遍历输入map的key和value
下面是一个实现上述功能的Java类:
```java
import java.util.*;
public class ContainerTest {
public static void main(String[] args) {
// 测试set容器
Set<Integer> hashSet = new HashSet<>();
Set<Integer> treeSet = new TreeSet<>();
// 向set容器中输入20个随机数
Random random = new Random();
for (int i = 0; i < 20; i++) {
int num = random.nextInt(100);
hashSet.add(num);
treeSet.add(num);
}
// 使用迭代器遍历输出set容器中的元素
System.out.println("HashSet:");
Iterator<Integer> hashSetIterator = hashSet.iterator();
while (hashSetIterator.hasNext()) {
System.out.print(hashSetIterator.next() + " ");
}
System.out.println();
System.out.println("TreeSet:");
Iterator<Integer> treeSetIterator = treeSet.iterator();
while (treeSetIterator.hasNext()) {
System.out.print(treeSetIterator.next() + " ");
}
System.out.println();
// 测试map容器
Map<Integer, String> hashMap = new HashMap<>();
Map<Integer, String> treeMap = new TreeMap<>();
// 向map容器中输入20个随机数
for (int i = 0; i < 20; i++) {
int num = random.nextInt(100);
hashMap.put(num, "value" + num);
treeMap.put(num, "value" + num);
}
// 遍历输出map容器中的key和value
System.out.println("HashMap:");
for (Map.Entry<Integer, String> entry : hashMap.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
System.out.println("TreeMap:");
for (Map.Entry<Integer, String> entry : treeMap.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
}
}
```
上面的代码中,我们先创建了两个set容器(一个HashSet和一个TreeSet),并向其中输入了20个随机数。然后使用迭代器遍历输出了容器中的元素。
接下来,我们又创建了两个map容器(一个HashMap和一个TreeMap),并向其中输入了20个随机数。最后,使用entrySet()方法获取map容器中的key-value对,并遍历输出了它们。
阅读全文