Java常用数据结构的总结

来源:互联网 发布:linux开启telnet命令 编辑:程序博客网 时间:2024/04/28 03:17


线性结构List:


Collections <—— List <------ AbstractList(继承了AbstractCollection): Vector、ArrayList

Vector 与 ArrayList相比:两者都是类似于C中数据结构的定义,由elementCount、object[]数组等基本要素组成。主要的增删改查,都是通过数组的下标进行访问的。

由于其核心结构是数组下标结构,并且扩容基本都是调用native方法进行数组拷贝,所以对于向后追加元素、删除元素、通过索引查找元素速度较快。


Vector和ArrayList没有本质的区别,差异就在于Vector所有的方法都加了同步。

LinkedList的核心结构是一个双向链表,类中定义了头结点、尾节点和链表的大小。双链表的随机插入和删除(中间删除较慢),较为适合。

ArrayList的默认初始容量是10,当需要扩容时,默认按照当前容量的1.5被进行扩容。如果扩容后依然不能满足大小,就按照最小需求的大小进行扩容。LinkedList一般情况下不需要扩容。

日常使用:

1. 在List初始化时,尽可能的对容量进行一个预估,减少扩容操作;

2. 在List使用时,注意根据需求选择ArrayList和LinkedList。

3. 在进行遍历操作的时候,对ArrayList尽可能使用for操作;对于LinkedList,不能使用for操作,尽可能的使用迭代器。

4. 在进行集合/数组操作时,尽可能避免向List结构的转换,直接使用Array工具类或者System的接口。



随机结构Map:

HashMap的核心结构是一个链表数组。其中数组的索引是key的hash值与Map的大小按位相与得到的; 链表结构是为了解决Hash冲突而准备的。

HashMap的默认容量大小是16,负载因子是0.75。其扩容的机制是为了一个threshold( 当前容量 * 负载因子),如果超过阈值,就会触发扩容。扩容时会遍历所有的值进行重新计算Hash和复制链表。所以,应当尽可能的设置合理的HashMap容量和负载因子。HashMap扩容时通过<<1方式一次扩充当前容量的一倍。


LinkedHashMap对HashMap进行了扩展,增加了一个head和tail节点。功能上是对HashMap的扩展,在设置不同的accessorder时,通过设置循环链表的头、尾完成排序。


HashTable的核心结构是一个table数组,其索引是key的hash值与0x7FFFFFFF按位相与后与table的长度取余得到。其中的节点的名称一个叫Entry、一个叫Node

另外,HashMap允许Key、Value为空,HashTable不允许为空。HashTable继承于Dictionary、默认的容量大小是11,负载因子0.75.


StringBuffer和StringBuilder:


源码上都继承与AbstractStringBuilder,但是StringBuffer中存在一个临时的缓冲数组toStringCache,在调用toString方法时,现将content拷贝到这个缓存数组中,从而较好的支持线程同步。


0 0
原创粉丝点击