一.前言
对Java集合框架相关最具代表的数据结构进行相关概述和总结
二.Array
1.初始化
String[] arr = new String[11];
String[] brr = {"1","2"};
String[] crr = new String[]{"1","2"};
String[][] drr = new String[1][1];
String[][] frr = {{“1”,“2”}{"3","4"}};
String[][] grr = new String[][] {{“1”,“2”}{"3","4"}};
2.特点
(1)初始化时类型和长度已确定,数组作为集合的一种,在初始化时需要将存储的数据的个数和数据类型进行先行定义
(2)数据存储有序
(3)数据储存后会根据对应存储空间的下标进行访问
三.Collection
1.List
(1)ArrayList
List<String> arrayList = new ArrayList<String>();
特点:
I.数据存储有序化
II.因为基于索引(index)的数据结构,使用索引进行查询时时间复杂度是O(1),但是插入、删除操作时,需要修改后续数据的下标
III.储存内存相对较少,因为基于索引的数据结构所以在数组中只需要存储相关数据
(2)LinkedList
List<String> linkedList = new LinkedList<String>();
特点:
I.数据存储有序化
II.因为基于链表的数据接口,查询时需要根据节点不断获取,所以时间辅助度是O(n),但是在插入和删除时只需要修改关联的上节点和下节点所以时间复杂度为O(1)
III.存储内存相对较多,因为每个节点不仅需要保存数据,还需要保存上下关联节点位置
(3)Vector(基本已弃用)
Vector v=new Vector();
特点:
I.具备线程线程安全的特点
II.但是也是因为其具备线程安全的特点导致在每次使用时都会产生锁的开销,但是实际上在并发情况下DeQueue可以使用在相关场景
2.Set
(1)HashSet
I.LinkedHashSet
Set linkedHashSet = new LinkedHashSet();
特点:
I.数据存储无序,但是因为链表结构存在可预测的迭代顺序
II.存储数据不可重复,具备双向节点,但是相应的也增加额外的存储负担
III.不能for循环,只能使用迭代遍历
(2)TreeSet
Set treeSet = new TreeSet();
特点:
I.树形结构
3.Queue
(1)DeQueue
I.ArrayDeque
Queue arrayQeque = new ArrayDeque();
特点:
线程不安全,不能在多线程情况下使用,并且不支持null值
II.LinkedList
Queue linkedList = new LinkedList();
(2)PriorityQueue
Queue priorityQueue = new PriorityQueue();
三.Map
1.TreeMap
Map treeMap = new TreeMap();
特点:
I.键值对存储,可以存入null值和null键但是不能存入重复键
II.数据无序存储,但是可以根据键进行排序
2.HashMap
(1)LinkedHashMap
Map linkedHashMaP = new LinkedHashMap();
特点:
I.键值对存储,可以存入null值和null键但是不能存入重复键
II.数据存储有序,根据链表进行顺序获取,双向表包括上节点和下节点
四.总结
都是在学习和使用中自己不系统的总结,如果有偏差出现希望大家能指出来,个人认为在实际使用中如果能确认出数据集合的大小并且存储数据相对简单可以使用数组进行存储。
如果数据存储中数据较大并且存储数据类型相对复杂的话可以选择使用List的子类LinkedList或者HashList、ArrayList中根据实际需求对于查询还是增删等操作时间需求的进行选择。
高并发情况下大哥们讲可以DeQueue,但是因为我目前还没有频繁接触过高并发,所以在相关集合容器选择上有些不足希望指点。
Map在实际工作上使用频率最好,因为键值对的使用最符合对象的字段名和值的对应,所以无论在请求返回还是数据处理方面都会使用Map进行相关处理操作,一般如果无特殊顺序要求都是使用HashMap进行使用,如遇到对于存储数据有顺序要求的情况下才会使用LinkedHashMap子类实现。
无论是那种集合实现类,其实都需要根据实际情况进行使用,但是在实际当中会经常性的出现多种数据结构进行复合使用的情况。
一个年龄很大,但是技术很菜的程序员的总结