- collection和collections的区别
collection是list和set顶层接口,collections是集合工具类
·
- ArrayList和linkedlist的区别(重点)
ArrayList底层数组结构,查询快(因为数组结构有角标,根据对应的角标位置能直接获取到要查询的数据),增删慢(因为数组严格有序,当增删数据,除了操作对应位置的数据本身,还需要对数组内其他数据进行重新位置的排序,内存分配空间动态发生变化,所以效率比较低),线程不安全,使用效率较高。
linkedList底层是双向链表结构,数据增删较快(根据序号获取数据,是二分进行遍历,如果序号小于总长度的一半,就从链表头部开始往后遍历,直到找到对应的序号。如果序号大于总长度的一半,就从链表尾部往前进行遍历,直到找到对应的序号),相对数据结构来讲,不能根据角标去查询对应的数据,所以相对ArrayList来讲,查询较慢。
- ArrayList和vector的区别(次重点)
二者都是数组结构,但是vector底层对于数据操作的方法都加了同步,所以是线程安全的,相对ArrayList来讲,效率比较低,基本被淘汰了(因为ArrayList虽然有线程安全的问题,但实际开发中,基本上很少在多线程中操作集合,所以线程不安全的问题对我们实际使用不会有消极影响,而他的效率又比较高,所以基本取代了vector)
- 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): 内容区别: 数组只能存储同种数据类型的元素 ,集合可以存储不同类型的元素
本文深入解析Java集合框架,对比ArrayList和LinkedList的查询与增删性能,分析ArrayList与Vector的线程安全差异,以及HashMap的底层原理,包括其散列链表、负载因子和红黑树的运用。此外,还探讨了数组与集合的异同。
&spm=1001.2101.3001.5002&articleId=117375010&d=1&t=3&u=d87cf02c9f3b47f6bf872e125016f81b)
2747

被折叠的 条评论
为什么被折叠?



