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拷贝到这个缓存数组中,从而较好的支持线程同步。
- Java常用数据结构的总结
- Java常用数据结构总结
- java 常用的数据结构
- Java常用容器(数据结构)总结
- java中常用的数据结构
- Java中常用的数据结构
- 刷题中Java常用的数据结构
- Java中常用的数据结构
- JAVA中常用的数据结构
- java中常用的数据结构
- java常用数据结构的比较
- JAVA中常用的数据结构
- 数据结构常用树的基本总结
- 数据结构与算法总结2_常用的数据结构(数组)
- 常用数据结构总结
- STL常用数据结构总结
- java基本数据结构之List常用实现类总结
- JAVA常用数据结构及原理分析(面试总结)
- C# 链接SQLServer 图解
- 【LeetCode】Rotate list
- python实现二分查找及bisect模块的简介
- SpringMVC 基础教程 简单入门实例
- [SSH_easyUI]细节2:JSON
- Java常用数据结构的总结
- 串口 学习
- SpringMVC 基础教程 框架分析
- 动态规划(dp)的初体验
- NYOJ_22 素数求和问题
- TextView中getCompoundDrawables()
- 设计模式(18)——Memento(备忘录)
- ListView中notifyDataSetChanged()刷新数据不更新原因分析
- HDU1150 Machine Schedule(匈牙利算法)