java基础学习笔记——集合
集合可以动态的把多个的引用加入其中,并且可以动态的扩容缩容。
java 集合类图
UML类图基础知识:
实现:虚线+空心三角形
继承:实线+空心三角形
虚线框:接口
大间距的虚线框:抽象类
各个类简介
ArrayList
基于数组实现,无容量限制。在插入元素时可能要扩容,在删除元素时不会减小数组的容量,但是提供了trimToSize()方法,用于缩减多余的容量。
非线程安全。
LinkedList
基于双向链表机制实现。插入删除复杂度低,查询复杂度高。
非线程安全
Vector
使用synchronized实现的线程安全的ArrayList。除了扩容方式和线程安全外,其余和ArrayList完全相同。
Stack
Stack继承自Vector,提供了push,pop,peek3个主要方法。
线程安全
HashSet
基于HashMap实现,无容量限制。各种方法都是通过调用hashMap中提供的方法来实现的。
不支持get(int)的方式获取指定位置的元素,既然本质上就是一个数组,为什么不提供获取指定位置元素的方法呢?个人理解是因为HashSet不保证有序,获取指定位置的元素是没有意义的。
但是如果有些场景你非要获取指定位置的元素,可以考虑这个方法:
List<String> list3 = new ArrayList<String>(set1);
先转换成list,再使用list的get(int)方法获取。
非线程安全。
LinkedHashSet
继承自HashSet,同时使用一个双向链表维护插入顺序信息,能够保证输出的顺序和输入的顺序相同。在插入和删除元素时,需要同步处理链表信息,所以比HashSet稍慢。一般来说,HashSet的遍历效率可能更高一些,但是当数组容量远大于元素个数时,LinkedHashSet遍历效率比HashSet高。
非线程安全。
TreeSet
基于TreeMap实现,支持排序。
非线程安全
HashMap
采用数组方式存储key,value构成的entry对象,无容量限制。
对key使用hash算法,寻找对象存储到数组的位置,对于hash冲突采用链表方式来解决。
在插入元素时可能会扩大数组的容量,需要重新计算hash,并复制到新的数组。
非线程安全。
LinkedHashMap
继承自HashMap,同样使用双向链表来维护顺序信息,可以保证输出的顺序和插入的顺序一致。
TreeMap
基于红黑树实现,可以对元素进行排序。
参考:
https://blog.csdn.net/liulin_good/article/details/6213815
https://blog.csdn.net/gaoxin12345679/article/details/19339111
Java LinkedHashMap工作原理及实现
还没有评论,来说两句吧...