java集合
java集合及特点
java中常见的数据结构,主要分为Collection和Map两种主要接口,程序中的数据结构是继承这些接口的数据结构类。
Collection接口:
List 接口继承:ArrayList、 Vector、 LinkedList等实现;
Set 接口继承:HashSet、LinkedHashSet、TreeSet等实现。
Map接口: HashMap、SortedMap继承,LinkedHashMap、TreeMap等实现。
几个常用的类及其特点:
ArrayList
- 数据结构:ArrayList底层使用的是Object数组;
- 存储结构:物理存储单元上连续的存储结构;
- 线程是否安全:线程不安全的;ArrayList是非同步的,方法没有加锁;
- 特点:方便查找,但是新增和删除操作的时候,是要有移动位置的操作,所以ArrayList适用于存储,查询操作比较频繁的数据存储。
LinkedList
- 数据结构:LinkedList底层使用的是双向循环链表数据结构;
- 存储方式:物理存储单元上非连续、非顺序的存储结构;
- 线程是否安全:线程不安全的;
- 特点:存储每一个元素消耗的空间要比ArrayList大,并且由于它的存储结构,导致他的查询不是很方便,需要去遍历每一个节点,然后查找该节点后继节点,不适合存储需要大量查询操作的数据存储,但插入比ArrayList方便,不需要进行换位操作,只需要改变指针前驱和后继,增删操作很快,不耗费多余资源 。
List总结
- 所有的List中只能容纳单个不同类型的对象组成的表,而不是Key-Value键值对。例如:[ tom,1,c ]
- 所有的List中可以有相同的元素,例如Vector中可以有 [ tom,koo,too,koo ]
- 所有的List中可以有null元素,例如[ tom,null,1 ]
- 基于Array的List(Vector,ArrayList)适合查询,而LinkedList 适合添加,删除操作
Vector
- 数据结构:Vector底层使用的是Object数组;
- 存储结构:物理存储单元上连续的存储结构;
- 线程是否安全:Vector是线程安全的,Vector类的方法都是有锁的;
- 特点:Vector是线程安全的,可以由多个线程访问一个Vector对象。但当一个线程访问的话,保证线程安全会消耗一定的资源,因此一个线程访问就无需考虑是否线程安全的问题,建议使用ArrayList。
TreeSet
- 数据结构:底层数据结构是二叉树;
- 线程是否安全:不保证线程安全的;
- 特点:有序的,并且没有重复元素。可以指定一个顺序,排序后按升序排列元素 。
HashSet
- 数据结构:链表和红黑树(jdk1.8以后);
- 线程是否安全:不保证线程安全的;
- 特点:元素没有顺序(因为底层用的是HashMap,HashMap本身中的元素度没有顺序)、元素不能重复,不可随机访问包含的元素 ,只能用Iterator实现单向遍历,多次迭代访问,元素的顺序可能不同 。
Set总结
- Set实现的基础是Map(HashMap);
- Set中的元素是不能重复的,如果使用add(Object obj)方法添加已经存在的对象,则会覆盖前面的对象。
HashMap
- 数据结构:链表和红黑树(jdk1.8以后);
- 线程是否安全:非线程安全;
- 特点:Null可以做主键,但只能有一个,可以有多个Value为Null;适用于在Map中插入、删除和定位元素。
TreeMap
- 数据结构:树;
- 线程是否安全:非线程安全;
- 特点:有序的,适用于按自然顺序或自定义顺序遍历键(key)。
LinkedHashMap
- 数据结构:HashMap+LinkedList;
- 线程是否安全:非线程安全;
- 特点:有序、Key和Value都允许空、Key重复会覆盖、Value允许重复。
java 中, 什么查询最快?
根据数组下标, 查找数组的元素, 是java中天下第一快的操作!
数组和ArrayList 的区别:
- 数组可以存储数据类型一致的一组数据, 没有提供操作算法, 使用数组需要自行编写算法, 使用数组编码的专用算法,
性能最佳!而ArrayList也可以存储一组数据, 其内部也是数组, 还提供操作算法, 使用方便. 通用算法好处是使用方便,
算法是经过检验的, 非常可靠。但是如果期望高性能, 使用数组, 如期望高开发效率, 使用Arraylist。
Vector、ArrayList和LinkedList使用
大多数情况下,从性能上来说ArrayList最好,但是当集合内的元素需要频繁插入、删除时LinkedList会有比较好的表现,但是它们三个性能都比不上数组。所以:
- 如果能用数组的时候(元素类型固定,数组长度固定),请尽量使用数组来代替List;
- 如果没有频繁的删除插入操作,又不用考虑多线程问题,优先选择ArrayList;
- 如果在多线程条件下使用,可以考虑Vector;
- 如果需要频繁地删除插入,LinkedList就有了用武之地;
- 如果你什么都不知道,用ArrayList没错。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ZC的学习录!
评论