Set集合和迭代器输出

Set集合(不允许数据重复)

      1.3.1 HashSet(无序存储)底层使用哈希表+红黑树,允许存放空值

      1.3.2 TreeSet(有序存储)底层使用红黑树,不允许出现空值(NullPointerException)

            要想将自定义类保存到TreeSet中,要么实现Comparable接口,要么向TreeSet中传入比较器(Comparator外部排序接口)

            java.lang.Comparable接口(内部比较器)-排序接口,只有一个参数,拿自己和别的比

               一个类如果实现了Comparable接口则说明该类支持排序

               排序方法:Collection.sortArrays.sort

            Comparator外部排序接口(外部比较器):若要控制某个自定义的顺序,而该类本身不支持排序(类本身没有实现Comparable接口)

                我们可以建立一个该类的比较器来进行类的排序。

                int compare(T o1,T o2);返回值与compareTo返回值完全一样,

                返回正数,表示o1>o2;返回0,表示o1=o2;返回小数,表示o1<o2;

                实现了Comparator接口进行第三方排序--策略模式,此方法更加灵活,可以轻松改变策略进行第三方的排序算法

重复元素的比较:TreeSetTreeMap依靠ComparatorComparable接口来区分重复元素。

              自定义想要保存在TreeSetTreeMap中;

              1.直接实现Comparable接口,覆写CompareTo方法

              2.实现一个比较器传入TreeSetTreeMap来进行外部比较

         而HashSetHashMap并不依赖比较接口,此时想要区分自定义的元素是否重复,同时覆写equalsHashCode方法。

         覆写equals方法的五个原则:

         自反性:对于任何非空引用值xx.equals(x)都返回true;

         对称性:对于任何非空的xy,当且仅当x.equals(y)返回true,y.equals(x)也返回true

         传递性:对于任何非空的x,y,z,如果x.equals(y)返回truey.equals(z)返回true,一定有x.equals(z)返回true;

         一致性:对于任何非空的x,y

         非空性:

         先调用hashCode(保证属性值相同的元素在一个桶中)计算出对象Hash码决定存放的数据桶,而后使用equals来比较元素是否相等,若相等,则不再放置元素,

         若equals(保证同一个桶中属性值相同不再设置)返回false,则在相同桶之后,使用链表将若干元素链起来

         若两个对象equals方法返回true,他们的hashCode必然要保证相等

         但是两个对象的hashCode相等,equals不一定相等

         当且仅当equalshashCode方法均返回true,才认为两个对象真正相等。

   1.4 集合输出(迭代器输出)

   1.4.1迭代器:未来遍历集合而生----迭代器模式,只能从前向后输出(只有Collection集合可以使用)

   调用Collection集合子类的Iterator方法取得内置的迭代器

       Iterator(Scanner implements Iterator)

       两个核心方法:boolean hasNext();判断是否还有下一个元素 E next();取得下一个元素

   1.4.2双向迭代接口:ListIteratorList接口提供,Set不支持

   除了hasNextnext方法外,还有:hasPrevious():判断是否有上一个元素;previous:取得上一个元素

   要想使用从后向前遍历输出,首先至少要从前向后遍历一次才可使用。

   1.4.3EnumerationJDK1.0)枚举输出-Vector类支持

   hasMoreElements():判断是否有下一个元素;nextElements():输出下一个元素

   1.4.4for-each各个集合都可以使用

   能用foreach输出的本质在于各个集合类都内置了迭代器

   fail-fast

   CurrentModificationException发生在Collection集合使用迭代器遍历时,使用了集合类提供的修改集合内容方法报错

   而如果使用Iterator迭代器的remove()不会出现此错误

   但是在迭代器遍历时,不要修改集合内容!!!

   不能直接list.remove();要在迭代器里list.remove()

   快速失败策略保证了所有用户在进行迭代遍历集合时,拿到的数据一定是最新的数据(避免脏读产生)

   fail-safe

   不产生ConcurrentModificationException异常

 

猜你喜欢

转载自blog.csdn.net/qq_43577380/article/details/89553502
今日推荐