集合
Java中集合有一个接口,collection是集合的父接口,它的上层还有一个接口iterate迭代器,
下面有两个实现,
list和set,
list下面有三个实现
arraylist:
(1)jdk1.2有的,1.5加的泛型
(2)底层数据结构是object数组
(3)New ArrayList()jdk1.6及以下默认容量是10,1.7默认容量是0,
(4)扩容的话 当前容量*3/2+1,没有扩容增量
(5)线程不安全
Linkedlist:
(1)容量无限制
(2)底层是基于双向循环 链表结构,
(3)双向指的是entry有两个属性:next和previous,和hashmap不同, hashmap是单向
(4)循环指的是,任何一个节点都指向的是上一个和下一个
(5)底层是一个entry,entry里面有三个属性:element,previous,next,
(6)对于任意节点来说,previous指向的是上一节点,next指向下一节点,而对于最后一个节点来说,previous指向的是上一个节点,next指的是头,
(7)线程不安全
vector :
(1)jdk1.0就有,
(2)底层数据结构是object数组
(3)通过syncnized来保证线程安全的,
(4)默认容量10,扩容是当前容量*2,也可以指定当前扩容增量,new Vector()的时候有两个参数,(容量大小,扩容增量)
性能:
对于查询—基于数组的ArrayList和vector快
对于新增(默认新增到末尾)—ArrayList快,linkedlist得定位到末尾才能新增
对于删除—删除末尾(删除默认),ArrayList快
删除中间时分情况,
在接近头部时,因为ArrayList索引要移动,linkedlist不需要移动,linkedlist快
接近尾部时ArrayList快
实际上,删除并不是linkedlist快,而是ArrayList慢
.set
Hashset
是无序不重复,但是要保证无序不重复,这个bean要重写hashcode和equals方法,
Hashset底层是基于hashmap实现的,
Hashmap
里面两个对象是同一个对象,依据是通过看源码,重写hashcode和equals方法,
点进去hashmap源码,看put方法,for循环里就是这么实现的
String作为hashmap的key好吗?
好,已经重写过了
Map
下有hashmap和hashtable
Hashmap:
(1)底层基于entry数组,也就是一个哈希桶,它是一个单向列表,
(2)线程不安全
(3)构造方法默认容量是16
(4)容量只能是2的n次方
(5)New一个hashmap容量至少为2
(6)确定下标时用的时位移运算,运算效果比取余高
(7)Key可以为null
(8)hashmap性能高于hashtable
(9)hashmap扩容时会把前面插入的内容再重新散列(插入)一次,
所以性能低;为提高性能,避免扩容,需要指定容量来提高效率
Hashtable:
(1)底层基于entry数组,也就是一个哈希桶,它是一个单向列表,
(2)线程安全
(3)构造方法默认容量是11
(4)容量任意
(5)New一个hashtable容量可以为1
(6)确定下标是取余
(7)Key不可以为null,否则会抛出
(8)Value不可以为null,否则会抛出空指针异常
线程安全且性能高:concurrentHashmap
基于lock来实现,
Segment段,提高性能