一、深入理解-Java集合初篇

导读:

本篇文章开始我们将要开始讲解Java集合,包括List、Set、Map等,也会对HashMap做深入的讲解。通过JDK1.7和JDK1.8两个版本的源码分析一步一步引导大家理解编程思想。同时还会就JDK1.7、JDK1.8两个版本的哈希冲突解决机制、哈希扩容机制等内容做深入的讲解。本篇将先引导大家认识Java集合并就各集合之间的优缺点简单分析。

Java集合类图

在这里插入图片描述

Java集合框架之List

在这里插入图片描述

Arraylist

底层数组实现,有序,可重复,不可为空

查找快,增删慢,

非线程安全

扩容原来的1.5倍

数组中数据必须是连续的存储空间,

因此在增加或者删除时候都需要移动数组后面的内容,时间复杂度为0(n)

Vector

底层数组实现,有序,可重复,不可为空

查找快,增删慢,

线程安全—效率低

扩容原来的一倍

由于要实现线程安全因为效率较低

LinkedList

双向循环链表实现,有序,可重复

增删快,查找慢

非线程安全

无需扩容

提供了专门用于操作表头和表尾的元素,可以模拟栈、队列、双向队列使用

ArrayList与LinkedList的实现和区别

ArrayList底层是数组实现,查找快,增删慢。在随机访问或者指定indx的情况下查询速度的时间复杂度是O1;增删慢是因为,每次增加和删除数据都需要移动剩余的数据,另外在数组在初始的时候就需要指定容量,不然后期会动态扩容。

LinkedList的底层是双向链表实现,查找慢,增删快。由于需要从头或者尾部一个一个向下查找,所以时间复杂度为0n。他增删快是因为只需要改变节点中的指针即可。而且不需要动态扩容,因为是一个一个向后或者向前指向的指针;

ArrayList适合随机查找多,增删少的环境;

LinkedList适合增删多的环境;

双向链表可以模拟栈和队列。

头存头取-栈;

头存尾取-队列;

ArrayList扩容-初始默认10,如果个数大于其容量,则扩展为原来的1.5倍。

Java集合框架之Set

在这里插入图片描述

值不可以重复。

存储无序(存入和取出的顺序不一定相同)

对象的相等性本质是对象hashCode值(java是依据对象的内存地址计算出的序号)判断的,如果想要让两个不同的对象视为相等的,就必须覆盖Object的hashCode方法和equals方法

HashSet

底层使用hash表-hash桶,一个hashCode下可以存放多个元素。

内部hashMap实现,

无序,

不可重复

存取速度快

TreeSet

  1. 二叉树实现按照-指定的序列进行排序(升序、降序),每次插入一个对象都会进行一次排序,然后插入二叉树中指定的位置。

  2. Integer和String默认都使用TreeSet排序,如果要自定义排序,则必须要实现Comparable接口,然后重写compareTo()方法。

  3. 重写compareTo()方法时候,内部要返回一定的值才可以按照这个值进行排序。

内部使用TreeMap的SortedMap

排序存储

LinkedHashSet

HashSet+LinkedHashMap

双向链表记录插入顺序,

继承HashSet,又基于LinkedHashMap实现。

Java集合框架之 Map

在这里插入图片描述

HashMap

JDK1.7—》哈希表,链表

JDK1.8—》哈希表,链表,红黑树— JDK1.8之后,当链表长度超过8使用红黑树。

非线程安全

0.75的负载因子,扩容必须为原来的两倍。

默认大小为16,传入的初始大小必须为2的幂次方的值,如果不为也会变为2的幂次方的值。

Key不可重复,值可重复

Key可以为空,value也可以为空,但不可同时为空。

根据HashCode存储数据。

hashTable

哈希表

线程安全

Key不可重复,value可重复

Key和value都不可以为空

treeMap

二叉树(红黑树),可以实现一致性哈希的哈希环。

TreeMap 数据结构 key 实现Compare解耦,

TreeMap怎么实现有序的?

TreeMap是按照Key的自然顺序或者Comprator的顺序进行排序,内部是通过红黑树来实现。所以要么key所属的类实现Comparable接口,或者自定义一个实现了Comparator接口的比较器,传给TreeMap用户key的比较。

如果想继续深入学习Java集合相关内容,请关注本头条号。
如需了解更多更详细内容也可关注本人CSDN博客:不吃_花椒

Java集合还需要学习的内容

在这里插入图片描述在这里插入图片描述

在这里插入图片描述