3.java集合类:list、set、queue、map的实现类
Set接口
继承Collection接口,不允许出现重复的元素,并且元素没有次序,相当于一个不允许重复的离散的集合。
Set接口主要实现两个类:HashSet、TreeSet
- HashSet
- 按哈希来存取元素,因此速度较快。HashSet继承AbstractSet,然后实现了Set、Cloneable、Serializable接口。
- TreeSet也是继承自AbstractSet,不过不同的是其实现的是NavigableSet接口。而NavigableSet继承自SortedSet。SortedSet是一个有序的集合。其添加的元素必须实现了Comparable接口,因为其在添加一个元素的时候需要进行排序。
- LinkedHashSet也是Set的一个实现。和HashSet类似,只不过内部用链表来维护,按照元素插入次序来保存。
List接口
也是继承自Collection。与Set不同的是,List可以存储重复的元素。主要有两种实现:ArrayList和LinkedList。
- ArrayList和传统的数组一样,有着很快的随机存取速度,但是插入删除的速度就很慢。
- LinkedList则与ArrayList恰恰相反,因为用链表来保存数据,所以插入删除元素的速度很快,但是访问数据的速度就不如ArrayList了。
Map接口
Map(映射)是一个存储键值对的容器接口。每一个元素包含一个key对象和value对象,且元素不允许重复。
- HashMap:采用了链地址法来处理冲突,处理冲突时会首先存放在链表中去,但是一旦链表中的数据较多(即>8个)之后,就会转用红黑树来进行存储,优化存储速度。O(lgn)。如果是链表。一定是O(n)。HashMap最多只允许一条记录的键为null,允许多条记录的值为null。HashMap非线程安全,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致。如果需要满足线程安全,可以用 Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap。
- HashTable:是过时的,是线程安全的,但是并发性不如ConcurrentHashMap。不需要线程安全的场合可以用HashMap替换,需要线程安全的场合可以用ConcurrentHashMap替换。
- LinkedHashMap:LinkedHashMap是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的,也可以在构造时带参数,按照访问次序排序。即HashMap相比LinkedHashMap维护的是一个具有双重链表的HashMap,LinkedHashMap支持两种排序一种是插入排序,一种是使用排序,最近使用的会移至尾部
- TreeMap:有一个很大的特点就是会对Key进行排序,使用了TreeMap存储键值对,再使用iterator进行输出时,会发现其默认采用key由小到大的顺序输出键值对,如果想要按照其他的方式来排序,需要重写也就是override 它的compartor接口。
queue接口
FIFO:先进先出
- LinkedList:实现了queue接口
4、描述一下ArrayList和LinkedList的实现和各自的区别
- 都实现了List接口,都是不同步的,即非线程安全的。
- 区别:ArrayList是基于数组实现的,LinkedList是基于链表实现的,即查询ArrayList更有效率,增删LinkedList更有效率。
ps:昨天忘发了…晕