java Set集合相关总结

Set:
无序存储,独一无二(值不能重复)

HashSet:
数组+链表的结构。数组中存放的是哈希值。HashSet存储值时不是按顺序来存,而是按照哈希值来存,取的时候同样是按照哈希值来取。HashSet也是不能存放相同的值,它是通过HashCode()和equals()来判断,如果HashSet中已存在相同的对象,则不存储(这与HashMap不一致,HashMap遇到对象相等则会覆盖,详细比较可以参考博文《 HashSet与HashMap比较》)。
对象相等:如果两个引用指向同一个对象,那么这两个引用是相等的,他们的hashcode方法返回的值一致。如果没有重写Object中hashcode方法,返回的是对象在内存中的地址(值中带有‘@’)。所以必须要要重写hashCode()方法,才能使得两个对象
都有相同的hashCode,并且还要重写equals()方法使得返回的值为true。满足这两个条件,那么证明两个对象在HashMap/HashSet中是相等的。

TreeSet:
红黑树结构。容器中存放的元素有序(左小右大),且不重复。
有序:Set是无序的,那么TreeSet是通过什么来给元素排序的呢?第一种,使用默认的排序规则,即元素实现Comparable接口中的compareTo方法;第二种,使用容器自身的排序规则,初始化时传入一个Comparator,实现该接口的compare方法。
compare的优先级高于compareTo。
重复:如何来判断元素是否重复呢?也是通过compareTo或者comopare方法中的return 0 来判断。

LinkedHashSet:
会保存插入的顺序。

区分这些集合的特点貌似有点困难,但是只要记住这几条黄金规则即可:

  • 看见array就想到下标
  • 看见hash就想到hashCode和equals
  • 看见tree就想到实现有序的两个接口:Comparable和Comparator
  • 看见linked就想到first和last

猜你喜欢

转载自blog.csdn.net/qq_28411869/article/details/81532692