java集合list和set

来源:互联网 发布:阿里云客服怎么工作 编辑:程序博客网 时间:2024/06/07 20:55

集合

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段,提高性能