哈希表和有序表
-
哈希表
- 在c++中叫做UnOrderedSet(UnSortedMap),UnOrderedMap(UnSortedMap)
- 在java中叫做HashSet,HashMap
- set只有key,map是一个key带一个value,内部没有什么区别
- add(set)完成加,put(map)完成加入更新,remove删除,get查,containsKey查
- 可以认为增删查改都在O(1)完成,但常数项比较大,比数组大很多
- (key)基础类型在哈希表内部按值传递
- (key)不是基础类型在哈希表内按引用传递,占用一律8字节(内存地址),占用空间少了,只要内存地址不同,就可以认为key不一样
- java中的string属于基础类型
-
有序表
-
在c++中叫做SortedSet(OrderedSet),SortedMap(OrderedMap)
-
在Java中叫做TreeSet,TreeMap
-
内部根据key来组织,而且整体有序(key要求一定可以比较)
-
可以像哈希表一样实现增删查改
-
此外可以找出最小firstKey,最大lastKey,floorKey(小于等于最大),cellingKey(大于等于最小)
-
性能上比哈希表差一点,所有的操作是O(logN)
-
具体实现是红黑树,AVL树,size-balance-tree和跳表
-
(key)放入哈希表如果不是基础类型,必须提供比较器,按引用传递,通过比较器确定两者的先后关系
-
TreeSet<Node> treeSet = new TreeSet<>(new NodeComparator()); //红黑树
c++中新的重复的键会被忽略,Java中新的重复的键会覆盖旧的键