数据结构(笔记)

本文深入解析Java集合框架,对比ArrayList和LinkedList的查询与增删性能,分析ArrayList与Vector的线程安全差异,以及HashMap的底层原理,包括其散列链表、负载因子和红黑树的运用。此外,还探讨了数组与集合的异同。
  1. collection和collections的区别

collection是list和set顶层接口,collections是集合工具类

·

 

  1. ArrayList和linkedlist的区别(重点)

ArrayList底层数组结构,查询快(因为数组结构有角标,根据对应的角标位置能直接获取到要查询的数据),增删慢(因为数组严格有序,当增删数据,除了操作对应位置的数据本身,还需要对数组内其他数据进行重新位置的排序,内存分配空间动态发生变化所以效率比较低),线程不安全,使用效率较高。

linkedList底层是双向链表结构,数据增删较快(根据序号获取数据,是二分进行遍历,如果序号小于总长度的一半,就从链表头部开始往后遍历,直到找到对应的序号。如果序号大于总长度的一半,就从链表尾部往前进行遍历,直到找到对应的序号),相对数据结构来讲,不能根据角标去查询对应的数据,所以相对ArrayList来讲,查询较慢。

 

 

  1. ArrayList和vector的区别(次重点)

二者都是数组结构,但是vector底层对于数据操作的方法都加了同步,所以是线程安全的,相对ArrayList来讲,效率比较低,基本被淘汰了(因为ArrayList虽然有线程安全的问题,但实际开发中,基本上很少在多线程中操作集合,所以线程不安全的问题对我们实际使用不会有消极影响,而他的效率又比较高,所以基本取代了vector)

 

 

 

  1. Hashmap的底层原理(重点)

HashMap是基于散列链表来实现的,本质是数组+链表+红黑树的结合体,简单的来说,根据key算出一个hash值,确定一个存放index,允许null键和null值(key最多一个为null),线程不安全,不保证有序(HashMap 不保证元素顺序,实际集合操作过程中,元素的顺序也会被重新打散,根据打散后元素的key值,重新计算hash值,因此在不同时间段迭代同一个 HashMap 的顺序可能会不同)。

Hashmap的存取原理:当我们调用put方法时,传入存储的key和value,底层调用hashCode计算hash从而得到bucket位置,进一步存储,HashMap会根据当前bucket的占用情况自动调整容量;获取的话通过get方法,get获取对象时,我们将Key传给get,它调用hashCode计算hash从而得到bucket位置,并进一步调用equals()方法确定键值对所在的位置。

Hash碰撞:一个hashmap集合中,当hash值重复,一般我们称为hash碰撞,HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中在Java 8中,如果一个bucket中碰撞冲突的元素超过某个限制(默认是8),则使用红黑树来替换链表,从而提高速度。

在HashMap中有两个很重要的参数,容量(Capacity就是bucket的大小,默认为16)和负载因子(Load factor,bucket达到多大比例扩容,默认是0.75,当达到这个比例,调整为之前bucket的两倍)装载因子衡量的是一个散列表的空间的使用程度,装载因子越大表示散列表的装填程度越高对空间的利用程度高,但利用程度高的同时,hash碰撞发生的概率增高,导致链表长度变长,所以查找效率的降低为了优化性能,从 JDK1.8 开始引入了红黑树,当链表长度超出 TREEIFY_THRESHOLD 规定的值时,链表就会被转换为红黑树,利用红黑树快速增删改查的特点以提高 HashMap 的性能

 

 

 

5,数组和集合的区别(看看,基本不会问)

  • (1): 长度区别: 数组的长度是固定的而集合的长度是可变的
  • (2): 存储数据类型的区别: 数组可以存储基本数据类型 , 也可以存储引用数据类型; 而集合只能存储引用数据类型
  • (3): 内容区别: 数组只能存储同种数据类型的元素 ,集合可以存储不同类型的元素
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值