java集合-总结(六)

版权声明:本文为博主原创文章,转载需注明出处. https://blog.csdn.net/piaoslowly/article/details/81909701

Date: 2017-01-15 10:10:16

java集合-总结(六)

关系图:

有序无序图:

  • 在集合中只有List下面的集合是有序的。Map中LinkedHashMap也是有序的,TreeMap需要自己定义排序规则。
  • 和hash相关的key都是不可以重复的,Map集合中的key都不许重复,重复会覆盖。set里面的HashSet,TreeSet分别来自HashMap,TreeMap,所以也是不可重复的。List下面的集合都是可以重复的。

注解:需要排序是说该集合提供排序接口,需要我们自己实现排序接口。
如:TreeSet需要排序
new TreeSet(new Comparator(T)(){
public int compare(T a, T b ){
…….//自定义排序规则
}
});

List集合总结

  • ArrayList:随访访问,查询较快,插入与删除操作较慢(需要复制数组,重新创建数组); ArrayList支持序列化。支持Iterator和listIterator遍历
  • Vector:与ArrayList同样是使用数组实现的,所以都有较快的访问,但是Vector每个操作都加了synchronized,所以多线程下为安全的,但同样性能也就没有ArrayList效率高。不支持序列化。VectorIterator和listIterator遍历,并且还支持通过Enumeration去遍历,而ArrayList则不支持。
  • LinkedList:一个双向链表,它也可以被当作堆栈、队列或双端队列进行操作快速插入,删除元素。
  • Stack 是栈,它继承于Vector。它的特性是:先进后出(FILO, First In Last Out)。

由于ArrayList,Vector,stack都是使用数组实现的,所以都是有序的,可随机访问的;而linkedList是链表也是有序的。所以总结得出,List集合下面的实现基本都是有序的,并且可以重复添加的。

Iterator有3个方法

E next();
boolean hasNext();
void remove();

  • hasNext()检查是否有存在下一个元素。
  • next()读取下一个元素,从0开始,next()在读取到集合末尾时,会抛出一个异常NoSucheElementException,所以在遍历时需要hasNext();
  • remove(),在remove()时,必须要先调用一下next();因为remove()删除的事赏赐调用next方法返回时的元素。所以在调用remove之前必须要调用一次next();
Iterator<String> it=list.iterator();
it.next();
it.remove();//成功。

如果没有先读区next,而是直接
it.remover();//失败。

如果是这样
it.next();
it.remover();//成功
it.remover();//失败

ListIterator

ListIterator是一个继承Iterator的接口,它是队列迭代器。专门用于遍历List,能提供向前和向后遍历。相比于Iterator,它新增了添加、是否存在上一个元素、获取上一个元素等API接口。
addFrist();将指定元素插入此列表的开头
addLast();
getFrist();返回此列表的第一个元素
getLast();
getFrist()和getLast()方法是获取元素,如果集合中没有元素,会抛出NoSuchElementException
removeFrist();
removeLast();

Map集合总结

  • HashMap 是基于“拉链法”实现的散列表。一般用于单线程程序中。key、value都可以为null,key为null时被固定存储到table[0].HashMap只支持Iterator(迭代器)遍历。HashMap默认的容量大小是16;增加容量时,每次将容量变为“原始容量x2”。HashMap不支持contains(Object value)方法,没有重写toString()方法。HashMap遍历的时候是“从前向后”的遍历数组
  • Hashtable 也是基于“拉链法”实现的散列表。它一般用于多线程程序中。key、value都不可以为null。支持Iterator(迭代器)和Enumeration(枚举器)两种方式遍历。Hashtable默认的容量大小是11;增加容量时,每次将容量变为“原始容量x2 + 1”。Hashtable支持contains(Object value)方法,而且重写了toString()方法;Hashtable遍历的时候是“从后往前”的遍历数组
  • WeakHashMap 也是基于“拉链法”实现的散列表,它一般也用于单线程程序中。相比HashMap,WeakHashMap中的键是“弱键”,当“弱键”被GC回收时,它对应的键值对也会被从WeakHashMap中删除;而HashMap中的键是强键。其他地方和hashmap差不多
  • TreeMap 是有序的散列表,它是通过红黑树实现的。它一般用于单线程中存储有序的映射。

Map中的key都是通过hash算法来得出的,所有key都是不可以重复的,如果有重复的后者覆盖前者,所以Map接口的实现类基本都是key不可重复的。
HashMap,Hashtable,WeakHashMap都是通过哈希解决冲突中的”拉链法“来实现的,他们也都是无序的。而TreeMap的key是hash,但是他时通过红黑树数组结构来储存的,所以它是有序的。

Set集合总结

Set集合里面的实现都是通过HashMap或者TreeMap中的key来实现的(Map中的value在Set集合里面都使用new Object来代替)。
所以他们是无序的,TreeSet可以有序,同时也是不可重复的。

猜你喜欢

转载自blog.csdn.net/piaoslowly/article/details/81909701