Java基础知识之集合(三)

本文深入探讨了Java集合框架中的核心概念,包括数组和链表的原理,ArrayList和LinkedList的底层实现,以及HashMap的工作机制。详细解释了ArrayList的动态扩容机制,LinkedList的双向循环链表结构,以及HashMap如何通过数组+链表存储数据。还对比了ArrayList、Vector、LinkedList之间的性能和特性,以及HashMap和Hashtable的区别。同时,文章还涉及了集合类中的同步性、线程安全问题,以及如何在List中去除重复元素的方法。
摘要由CSDN通过智能技术生成

1. java中集合类的关系图

    

2. 数据结构中什么是数组?什么是链表?

    (1)所谓数组,是相同数据类型的元素按一定顺序排列的集合

         数组:存储空间是连续的,占用内存严重,故空间复杂度很大。但数组的二分查找时间复杂度小,为0(1);数组的特点是:寻址容易,插入和删除困难;

    (2)所谓链表,是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到0(1)的复杂度,比另一种线性表顺序快得多,但是查找一个节点或者访问特定标号的节点则需要0(n)的时间,而线性表和顺序表相应的时间复杂度分别是0(logn)和0(1)。

     链表:链表存储区间离散,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,达0(N)。链表的特点是:寻址困难,插入和删除容易。

3. ArrayList底层实现方式?

    (1)ArrayList通过数组实现,一旦我们实例化ArrayList无参数构造函数默认为数组初始化长度为10

    (2)add方法底层实现如果增加的元素格式超过了10个,那么ArrayList底层会新生成一个数组,长度为原数组的1.5倍+1,然后将原数组的内容复制到新数组当中,并且后续增加的内容会放到心数组中。当新数组无法容纳增加的元素时,重复该过程。一旦数组超出长度,就开始扩容数组。扩容数组调用的方法Arrays.copyOf(objArr,objArr.length + 1)

4. LinkedList底层实现方式?

    LinkedList底层的数据结构是基于双向循环链表的,且头结点中不存放数据,如下图所示:

    

      既然是双向链表,那么必定存在一种数据结构——我们可以称之为节点,节点实例保存业务数据,前一个节点的位置信息和后一个节点位置信息,如下图所示:


5. HashMap底层实现方式?

    HashMap是由数组+链表组成。

    put方法底层实现:通过key的hash值%Entry[].length得到该存储的下标位置,如果多个key的hash值%Entry[].length值相同的话就会存储到该链表的后面。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值