public static void main(String[] args) {
/**
* 数组实现
* 有序,可重复
* 优点:允许随机访问
* 缺点:内存是连续的 扩展空间的时候需要新开辟空间将原有数据放进去,
* 插入删除比较慢 因为需要数组的移动、复制 线程不安全
*/
List<String> list1 = new ArrayList<>();
/**
* 数组实现
* 有序,可重复
* 优点:线程安全 add方法使用的是重量锁synchronized
* 缺点:访问没有list快
*/
Vector<String> list2 = new Vector<>();
/**
* 双向循环链表结构
* 有序,可重复
* 查询慢 增删快 add remove
* 线程不安全 线程安全则使用 ConcurrentLinkedQueue
*/
LinkedList<String> list3 = new LinkedList<>();
/**
* hashSet
* 排列无序 不可重复 hashMap实现 存取快
* 线程不安全
*/
HashSet<String> hashSet = new HashSet<>();
/**
* treeSet
* 排列无序 不可重复
* 底层原理: 二叉树 排序存储 内部是TreeMap 的SortedSet
*/
TreeSet<String> treeSet = new TreeSet<>();
/**
* hashMap
* map为线程不安全 ConcurrentHashMap为线程安全
* map 允许一个键为null 键的hashCode作来存储数据
* 在java7中 hashMap的实现方式为数组+单向链表 查找数据的时候 根据hashCode
* 找到对应的数组下标之后再在单链表中查找数据 所以时间复杂度取决于单链表的长度 o(n)
* java中 引入了红黑树 当单链表的长度超过8个之后 会将链表转换为红黑树,
* 时间复杂度降低到了o(logN)
* 扩容问题:扩容有两种清空 一个是初始化的时候 并没有开辟空间 put值的时候才开辟空间
* 第二个是++size > threshold 空间的大小扩容后 大于阈值的时候 进行扩容
*
* 扩容需要和最大值比较 如果满足条件 阈值翻倍 容量翻倍
* 每次扩容的时候 都会重新计算每个数据的hash值 所以 如果数量过大的话
* 扩容的时候就会存着很大的性能问题
* HashMap默认容量大小 16 最大: 2<<31 2的31次方
*/
Map<String, String> map = new HashMap<>();
/**
* 线程安全的map
* 他是一个segment的数组 segment通过继承ReentrantLock 实现线程安全
* 保证每个segment线程安全 则全局安全
*/
ConcurrentHashMap<String, String> concurrentHashMap = new ConcurrentHashMap<>();
/**
* hashTable
* 不建议使用
* 线程安全 但是性能不如ConCurrentHashMap
* 线程不安全的情况下 hashMap效率更高
*/
/**
* treeMap
* 可排序的Map
* 它实现了SortedMap 能够把保存的记录通过key来排序
* 默认升序
*/
/**
* LinkHashMap
* 他是hash的一个子类
* 因为hashMap是无序的的 所以需要LinkedHashMap
* LinkedHashMap = hashMap + 双向链表
*/
LinkedHashMap<String,String> linkHashMap = new LinkedHashMap<>();
}
Java 集合整理
最新推荐文章于 2024-07-20 23:59:39 发布