JAVA数据结构有8种,如下所示,本文从使用场景,优缺点方面讲解。
1 数组Array
ArrayList 使用场景:有序的存储同一类型数据的集合,固定大小
优点:通过索引查找方便
缺点:插入或删除一个值时,改变值之后的索引都需要更新,故操作复杂;其次,由于大小固定,造成了设置过大内存浪费,设置过小又不能满足存储要求。
2 栈stack
使用场景:限定仅在表尾进行插入或是删除的线性表,先进后出
3 队列queue
Queue包路径java.util.Queue,表头删除,表尾添加,先进先出。是一个接口,父类Collection,常用方法有
add offer remove poll element peek
4 链表list
使用场景:存储可变空间的非连续非顺序的一类数据。
缺点:访问时或是插入删除链表中间值,需要遍历链表,耗时多。
ArrayList包路径java.util.ArrayList,默认初始容量10,采用数组形式保存数据。
缺点:每插入一条数据,需要更新插入点以及之后的所有数据的索引号,以及计算大小。
LinkedList将对象保存在独立的内存空间中,同时每个空间还保存下一个链接的索引。
使用场景:批量随机插入或删除数据。
缺点:由于查找需要从第一个索引开始,故查找效率低;由于每个节点存储了两个引用,故内存占用大
5 树tree
6 堆heap
7 图graph
8 散列表hash
使用场景:根据关键码值进行访问的数据结构。
HashMap包路径java.util.HashMap,线程非安全,存储时没使用锁。默认初始容量16,加载因子0.75,每一个存入的对象都有一个特定的哈希值。碰撞问题:^_^不同的对象计算出来的index相同,单向链表解决碰撞问题,加入一个next记录一个节点。
扩容:当存储数据超过存储比率时,数组变长2倍成一个新数组,原数组中的值迁移到新数组中。数组中元素的位置重新存放一次。红黑树
主要参数,数据结构,计算规则,存取过程
Hashtable
HashSet
ConcurrentHashMap包路径java.util.concurrent。线程安全,引入了分段锁,为并发hashmap,默认容量16,加载因子0.75,默认并发数16,即最多同时有16条线程操作这个map。