为知笔记http://a36bf370.wiz03.com/share/s/2zq_dM1mlQS52P2klg35rzwa0z0Eah2zqkmk2UA-PM0OzNhV
Iterator接口主要用于Collection集合的遍历,被称之位迭代器。其实现原理: 先来看一下Iterator,定义了以下几个接口。
public interface Iterator<E> { boolean hasNext(); //是否有下一个元素 E next(); //获取下一个元素并返回 default void remove() { //移除元素 throw new UnsupportedOperationException("remove"); } default void forEachRemaining(Consumer<? super E> action) {} //Lambda相关 }而Collection下的具体集合呢,都会有一个内部类去实现这个接口。并且都会提供要给方法返回这个实现类。
public Iterator<E> iterator() { return new Itr();}利用多态的特性,对内每个集合类都有自己特有的迭代处理方式,但对外,使用者使用每个集合的迭代方式都得到了统一。List和set集合写法都差不多,如下所示:
List<String> names = new ArrayList<>(); Iterator<String> it = names.iterator(); while (it.hasNext()) { String name = it.next(); }Itertor迭代器采用的是快速失败(fail-fast)机制,一旦在迭代过程中检测到该集合已经被修改,程序立即引发ConcurrentModificationException异常。这样可以避免共享资源而引发的潜在问题。
Set集合的是否相等的比较规则:存储对象时,先对比哈希值,再用equals对比
先比哈希值不同,直接存对象哈希值相同,用equals比不同,存该对象哈希值相同,用equals比相同,不存储该对象HashSet按Hash算法来存储集合中的元素,具有很好的存取和查找性能。
不能保证元素的排列顺序。HashSet不是同步的。集合元素值可以是nullTreeSet采用红黑树的数据结构存储集合元素。以下简述Treeset的排序。
第一种排序,让元素自身实现Comparaable接口,并复写compareTo方法。如果compareTo直接返回正数,存的顺序就是取的顺序,单右边型二叉树。如果comparaTo直接返回负数,存和取得顺序相反,单左边型二叉树。如果compareTo返回0.那么只会存第一个树。第二种排序,当元素自身不具备比较性时,或者具备的比较性不是所需要的。这时就需要让集合自身具备比较性。定义比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。如果两种排序方式都存在,会使用第二种方式进行排序。 TreeSet(Comparator public interface Comparator<T> { int compare(T o1, T o2); boolean equals(Object obj); ....... } 默认情况下,Treeset采用自然排序。通过调用集合元素的compareTo(Object obj)方法来比较元素之间的大小关系,然后将集合按升序排序。向TreeSet集合中添加元素时,该元素必须是实现了Comparable接口的对象。并且TreeSet只能添加同一种类型的对象。##### List集合允许重复元素,可以通过索引来访问指定位置的集合元素,索引值从0开始递增。其判断两个对象是否相同是通过判断equals()方法比较返回true即可。 java8中List新增的方法 - void sort(Comparator c) 进行List的排序。 - void replaceAll(UnaryOperator operator) 根据operator指定的计算规则重新设置List集合的所有元素。 - ListIterator listIterator(),ListIterator接口zaiIterator接口的基础上增加了如下方法 - boolean hasPrevious() :是否有上一个元素 - Object previous() : 返回该迭代器的上一个元素 - void add(Object 0):在指定位置插入一个元素。
LinkedList实现了Deque接口和List接口,可以根据索引来随机访问集合中的元素,也被当成双端队列来使用,可以是当作栈,也可以当作队列来使用。
Map集合概述 : - Map用于保持具有映射关系的数据,key和value可以是任何引用类型的数据,Map的key不允许重复,value允许重复,即任何两个key通过equals方法比较总是返回false。新增key相同的键值对会覆盖原来的键值对。 - Map提供了一个Entry内部类来封装key-value对,而计算Entry存储时只考虑Entry封装的key。从java源码来看,java先实现了Map,然后通过包装一个所有value都是null的Map就实现了Set集合。
Map<String,String> map = new HashMap<String,String>(); ..... Set<String> keySet = map.keySet(); Iterator<String> it = keySet.iterator(); while(it.hasNext()){ String key = it.next(); String value = map.get(key); }HashMap和Hashtable使用需要注意 : 1. 用作key的对象必须实现 hashCode()和 equals()。 2. 判断两个key相同的标准也是先判断hashcode值是否相等,再判断equals是否相等。 3. 判断两个对象的value相等的标准是通过equals方法比较两个value对象的值是否相等。 4. 当使用自定义类作为HashMap和Hashtable的key时,需要保证equals和hashCode方法的判断标准一致,即当两个key通过equals方法比较返回true时,两个key的hashCode返回值也应该相同。