容器类

来源:互联网 发布:北京永乐中汉网络 编辑:程序博客网 时间:2024/04/29 12:57

基本概念

  • Collection
    一个独立元素序列
    • List:顺序保存元素
    • Set:不能有重复的元素、
    • Queue:按照排队规则确定对象产生的顺序
  • Map
    一组成对“键值对”对象。

部分常用方法

Arrays.asList():接受一个数组或一个用逗号分隔的元素列表。
Collection.addAll():接受另一个Collection,速度快。

List={LinkedListArrayList

Set=HashSetTreeSetLinkedHashSet

Map=HashMapTreeMapLinkedHashMap

迭代器

用户遍历并选择序列中的对象
主要用法:只能向后移动

  • iterator返回一个Iterator
  • 使用next()获得下一个元素
  • 使用hasNext()检查序列中的下一个元素
  • 使用remove将迭代器新近返回的元素删除

扩展
ListIterator:只能用于List类,可以前后移动

LinkedList作为栈使用的经验:

  • addFirst:入栈
  • getFirst:获取栈顶元素
  • removeFirst:移除栈顶元素
  • isEmpty:栈是否空

SET类型

  • TreeSet:红黑树数据结构
  • HashSet:散列函数
  • LinkedHashSet:散列表,添加顺序

Queue
LinkedList提供了方法支持队列行为,并实现了Queue接口,可向上转型为Queue
方法:
offer:插入到队尾
peek和element:都为返回队头,peek为空时返回null,element抛出noSuchElementException异常
poll和remove:移除队头,并返回队头,poll为空时返回null,remove抛出noSuchElementException异常。

PriorityQueue
可提供自己的Comparator修改顺序

foreach()*
用Iteable接口来序列中移动,foreach可用于数组及其他任何Iterable。

hashMap原理

put方法:对key用hashCode方法,返回的hashCode用于找到bucket位置来储存Entry对象
get方法,先用hashCode,找到相应的bucket,再遍历LinkedList,使用keys.equals()找到相关的值。
hash碰撞:不同的对象拥有相同的hashCode的话,会存到bucket中的LinkedList中。
rehashing:HashMap的大小超过了负载因子(load factor)定义的容量,默认的负载因子大小为0.75,map填满了75%的bucket时候,和其它集合类(如ArrayList等)一样,将会创建原来HashMap大小的两倍的bucket数组,来重新调整map的大小,并将原来的对象放入新的bucket数组中。
rehashing问题:可能在多线程环境下产生竞态问题,造成bucket中的LinkedList死循环
String, Interger适合作为键:因为String是不可变的,也是final的,而且已经重写了equals()和hashCode()方法了。其他的wrapper类也有这个特点。不可变性是必要的,因为为了要计算hashCode(),就要防止键值改变,如果键值在放入时和获取时返回不同的hashcode的话,那么就不能从HashMap中找到你想要的对象。不可变性还有其他的优点如线程安全。如果你可以仅仅通过将某个field声明成final就能保证hashCode是不变的,那么请这么做吧。因为获取对象的时候要用到equals()和hashCode()方法,那么键对象正确的重写这两个方法是非常重要的。如果两个不相等的对象返回不同的hashcode的话,那么碰撞的几率就会小些,这样就能提高HashMap的性能。
自定义对象作为键:只要它遵守了equals()和hashCode()方法的定义规则,并且当对象插入到Map中之后将不会再改变了。如果这个自定义对象时不可变的,那么它已经满足了作为键的条件,因为当它创建之后就已经不能改变了。
使用ConcurrentHashMap代替hashTable:ConcurrentHashMap当然可以代替HashTable,但是HashTable提供更强的线程安全性。hash table虽然性能上不如ConcurrentHashMap,但并不能完全被取代,两者的迭代器的一致性不同的,hash table的迭代器是强一致性的,而concurrenthashmap是弱一致的。 ConcurrentHashMap的get,clear,iterator 都是弱一致性的。

原创粉丝点击