以前对C++的STL容器烂熟于心,两年没碰过C++了,现在已经很生疏了。工作原因转战java,对java的容器不甚了解,特别是每看到一种容器,不由自主地拿起和C++对比。C++中的set和java的hashset有何区别,其实我也不太明白,google搜不到现成的答案,查了下相关资料,自己尝试做个总结,正确与否有待讨论了。
以下set特指C++的set容器,hashset指java中的。
1、set和hashset都不允许元素重复,但是set是有序的,hashset无顺序,所以向set插入元素必须重载<操作符比较大小,而hashset只需重载equal(),比较是否相等即可。
2、set底层数据结构为红黑树,索引时间为log(n),而hashset基于哈希表,比set要快一些,log(1)。
至于各自的用法,其实C++中的set我一般用来排序,懒得自己写排序函数,一堆杂乱无章的数据塞进去,取出来人家已经帮排好序了很安逸啊。java的hashset虽然没有排序的作用,但是可以帮去重呀,如果不想自己写去重的方法,直接把数据扔到hashset中,取出来就是没有重复的了。还有一个用处,数据量很大时怎么快速判断某个数是不是存在,hashset可以在log(1)的时间帮你定位哟。其它的用处暂时没想到了,毕竟还是纸上谈兵,java中复杂点的容器我通通还没有用过!