如何理解HashSet LinkedHashSet TreeSet的无序性和不可重复性

1,841 阅读1分钟

1. HashSet

无序性

  1. 无序性不等于随机性。
  2. 举个栗子,对同一个HashSet进行多次遍历打印,会发现输出的顺序都是一样的可以见得,这个地方的无序并不是随机性。
  3. 原因: 通过查看HashSet的构造方法源码可知:HashSet是基于HashMap实现的,而HashMap中有Hash桶等,根据Key的HashCode落在不同的哈希桶, 体现在HashSet上的时候,就是一种无序性。

不可重复性

  1. 同理, HashMap的key就是不可重复的
  2. 这里的不可重复性,是根据HashCode()和equals()方法来实现的, equals()方法不同就认为是不同的。

2. LinkedHashSet

无序性

  1. LinkedHashSet是可以按照存入的顺序,原样取出的。但这并不意味着就是有序的。因为这里的有序性,是指的在内存中,是无序存放的,LinkedHashSet底层基于数组和链表实现的,在数组中是无序存放的,不过因为链表的存在,可以按照存入的顺序取出,通过这一点,也可以去理解HashSet的无序。

不可重复性

同HashSet

3. TreeSet

无序性

同上

不可重复性

  1. TreeSet的不可重复性比较特殊,不是根据equals()方法判断的,而是通过compareTo()(也可根据第三条) 方法来判断的,如果compareTo结果为0,就认为相等(重复)
  2. 如果想要TreeSet里面的值按照想要的方式排序,需要实现comparble接口,重写compareTo()方法,自定义排序规则
  3. TreeSet也可以在构造方法中传入Comparator实现自定义排序