c++的hash表和 java的hash表
一、C++的提供 set 和 map 两种哈希容器,有三种数据结构
set
集合 | 底层实现 | 是否有序 | 数值是否可以重复 | 能否更改数值 | 查询效率 | 增删效率 |
---|---|---|---|---|---|---|
std::set | 红黑树 | 有序 | 否 | 否 | O(log n) | O(log n) |
std::multiset | 红黑树 | 有序 | 是 | 否 | O(log n) | O(log n) |
std::unordered_set | 哈希表 | 无序 | 否 | 否 | O(1) | O(1) |
map
集合 | 底层实现 | 是否有序 | key是否可以重复 | 能否更改key | 查询效率 | 增删效率 |
---|---|---|---|---|---|---|
std::map | 红黑树 | key有序 | 否 | 否 | O(log n) | O(log n) |
std::multimap | 红黑树 | key有序 | 是 | 否 | O(log n) | O(log n) |
std::unordered_map | 哈希表 | key无序 | 否 | 否 | O(1) | O(1) |
二、java中的 Set 和 Map 两种哈希容器
Set
实现方式 | 底层实现 | 是否有序 | 数值是否可以重复 | 能否更改数值 | 查询效率 | 增删效率 |
---|---|---|---|---|---|---|
TreeSet | 红黑树 | 有序 | 否 | 否 | O(log n) | O(log n) |
HashSet | 哈希表 | 无序 | 否 | 否 | O(1) | O(1) |
Map
实现方式 | 底层实现 | 是否有序 | key是否可以重复 | 能否更改key | 查询效率 | 增删效率 |
---|---|---|---|---|---|---|
TreeMap | 红黑树 | key有序 | 否 | 否 | O(log n) | O(log n) |
HashMap | 数组+链表+红黑树 | key无序 | 否 | 否 | O(1) | O(1) |
IdentityHashMap | 哈希表 | key无序 | 是 | 否 | O(1) | O(1) |
三、Java代码
HashSet
无序不可重复
public void testHashSet(){
HashSet<Integer> set = new HashSet<>();
set.add(10);
set.add(20);
set.add(6);
set.add(7);
System.out.println(set);
//输出: [20, 6, 7, 10]
}
TreeSet
有序不可重复
public void testTreeSet(){
TreeSet<Integer> set = new TreeSet<>();
set.add(10);
set.add(20);
set.add(6);
set.add(new Integer(6));
set.add(7);
System.out.println(set);
//输出:[6, 7, 10, 20] ,原因:HashSet是用哈希表(散列表结构)实现的,排序按照hashcode的大小
}
HashMap
key无序不可重复
Map<String,Integer> map1 = new HashMap<>();
map1.put("aa",100);
map1.put("aaa",200);
map1.put("bb",60);
map1.put("ba",60);
map1.put("bc",600);
map1.put("cc",60);
System.out.println(map1);
//{aa=100, aaa=200, bb=60, cc=60, bc=600, ba=60} ,结果:无序
HashMap
key有序不可重复
public void TestTreeMap(){
Map<String,Integer> map1 = new TreeMap<>();
map1.put("aa",1);
map1.put("aaa",2);
map1.put("bb",3);
map1.put("ba",4);
map1.put("bc",5);
map1.put("cc",6);
//按照key的字典序排
System.out.println(map1);
//输出结果:{aa=1, aaa=2, ba=4, bb=3, bc=5, cc=6}
}
IdentityHashMap
key无序可重复
Map<Integer,String> map3 = new IdentityHashMap<>();
map3.put(1,"aa");
map3.put(2,"aaa");
map3.put(3,"bb");
map3.put(4,"ba");
map3.put(5,"bc");
map3.put(new Integer(2),"cc");
System.out.println(map3);
//输出结果:{3=bb, 4=ba, 2=cc, 2=aaa, 1=aa, 5=bc}