ArrayList与LinkedList的区别,HashMap与HashSet , HashTable的区别

本文探讨了Java中ArrayList与LinkedList的主要区别,ArrayList基于动态数组,适合随机访问,但插入和删除效率较低;LinkedList通过节点链接实现,插入和删除速度快,但访问慢。同时,文章还分析了HashMap、HashSet与HashTable的区别,HashMap是非线程安全的,内部使用数组+链表结构处理哈希冲突,并在达到一定负载因子时进行扩容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

1.ArrayList 跟LinkedList 的区别

1.1:arraylist 跟linkedlist 的区别
arraylist 底层是基于动态数组,根据下表随机访问数组元素的效率高,向数组尾部添加元素的效率高;但是,删除数组中的数据以及向数组中间添加数据效率低,因为需要移动数组。例如最坏的情况是删除第一个数组元素,则需要将第2至第n个数组元素各向前移动一位。而之所以称为动态数组,是因为Arraylist在数组元素超过其容量大,Arraylist可以进行扩容(针对JDK1.8 数组扩容后的容量是扩容前的1.5倍),Arraylist源码中最大的数组容量是Integer.MAX_VALUE-8,对于空出的8位,目前解释是 :
①存储Headerwords;
②避免一些机器内存溢出,减少出错几率,所以少分配
③最大还是能支持到Integer.MAX_VALUE(当Integer.MAX_VALUE-8依旧无法满足需求时)

1.2 linkedlist 是通过节点链接来实现的,每一个节点都包含前一个节点的引用,后一个节点的引用和值,当一个新的节点插入时,只需要修改其中保持先后关系的节点的引用即可.删除记录时也一样. 优点就是:操作其中的对象的速度很快,只需要改变前后连接,新的节点可以在内存中任何地方.

1.3 相同点:两者都是非线程安全的 .可以使用synchronized关键字是用来控制线程同步的

2.HashMap与HashSet , HashTable的区别

2.1 什么是Map
Map的三个特点
①:包含键值对
②:键唯一
③:键对应的值唯一(因为值会被覆盖)

2.2 什么是Hash
Hash,也可以称为"散列",就是把任意长度的输入,通过散列算法,变成固定长度的输出,该输出的就是散列值.
2.3 什么是HashMap
HashMap 内部是使用一个默认容量为16的数组来存储数据的,而数组中的每一个元素又是一个链表的头结点.
HashMap内部存储结构是数组+链表的形势
在这里插入图片描述
且每一个结点都是Entry类型,那么Entry是什么呢?我们来看看HashMap中Entry的属性:

1 final K key;  
2 final V value;  
3 final int hash;  
4 HashMapEntry<K, V> next;  

从中我们得知Entry存储的内容有key、value、hash值、和next下一个Entry,那么,这些Entry数据是按什么规则进行存储的呢?就是通过计算元素key的hash值,然后对HashMap中数组长度取余得到该元素存储的位置,计算公式为hash(key)%len,比如:假设hash(14)=14,hash(30)=30,hash(46)=46 我们对len取余,得到hash(14)%16=14,hash(30)%16=14,hash(46)%16=14。所以hash值为14的这个元素存储在数组下标为14的位置。

从中可以看出,如果有多个元素key的hash值相同的话,后一个元素并不会覆盖上一个元素,而是采取链表的方式,把之后加进来的元素加入链表末尾,从而解决了hash冲突的问题,由此我们知道HashMap中处理hash冲突的方法是链地址法。

2.3 HashMap 扩容
我们知道HashMap中默认的存储大小就是一个容量为16的数组,所以当我们创建出一个HashMap对象时,即使里面没有任何元素,也要分一块内存空间给它,而且,我们再不断的向HashMap里put数据时,当达到一定的容量限制时(这个容量满足这样的一个关系时候将会扩容:HashMap中的数据量>容量*加载因子,而HashMap中默认的加载因子是0.75),HashMap的空间将会扩大,而且扩大后新的空间一定是原来的2倍,我们可以看put()方法中有这样的一行代码:

int newCapacity = oldCapacity * 2;

所以,只要一满足扩容条件,HashMap的空间将会以2倍的规律进行增大.
HashMap 是非线程安全的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值