Java面试总结——集合篇

                                               摘自javaguide的集合总体框架图:        


List, Set, Queue, Map 的区别

  • List:底层基于object[]数组,存储的元素有序、可重复。

  • Set:底层基于HashMap实现,存储的元素无序,不可重复。

  • Queue:单端队列,存储的元素有序、可重复。

  • Map:使用键值对(key-value)存储,key 是无序的、不可重复的。

HashSet、LinkedHashSet 和 TreeSet 的异同

  • 三者都是Set 接口的实现类,都能保证元素唯一,并且都不是线程安全的。
  • 三者主要区别在于底层实现的数据结构不同:
    • HashSet底层基于哈希表,元素具有唯一性。
    • LinkedHashSet底层基于链表和哈希表,元素具有唯一性和有序性(元素顺序满足FIFO)
    • TreeSet底层基于红黑树,支持对元素自定义排序规则。

ArrayList 和 Array(数组)的区别?

  • Array的大小固定;ArrayList可以动态扩容。
  • ArrayList允许使用泛型确保类型安全;Array不行。
  • ArrayList具备基本的增删改查操作;Array只能下标进行查询,没有动态增删改元素的能力。
  • Array既可以存储基本数据类型也可以存储对象;ArrayList只能存储对象,对于基本数据类型,需要将其转化为对应的包装类。

ArrayList 与 LinkedList 区别?

  • 底层数据结构:ArrayList底层使用object[]数组,LinkedList底层使用双向链表。
  • 是否支持快速随机访问:ArrayList支持,LinkedList不支持。
  • 插入和删除是否受元素位置的影响:
    • ArrayList添加元素时默认添加至列表尾部,此时时间复杂度为O(1);但如果在指定位置添加和删除元素时,时间复杂度为O(n)。
    • LinkedList在头尾插入和删除时时间复杂度为O(1);但如果在指定位置插入删除元素时间复杂度为O(n)。

ArrayList扩容机制

ArrayList三个构造函数:

  • ArrayList() 默认创建长度为0的数组。

  • ArrayList(int initialCapacity) 创建指定容量的数组。

  • ArrayList(Collection<? extends E> c) 使用集合c的大小作为数组容量。

        首次向集合中 add 单个元素时,集合扩容为10,再次扩容为上次的1.5倍。(扩容使用的是位运算,奇数*1.5向下取整)。

        首次向集合a中 addAll 集合b的元素时,集合a扩容为max(10,集合b的元素个数) ,接着再向集合a中 addAll 集合c的元素时,集合a扩容为max(集合a容量的1.5倍,集合c的元素个数)。

        位运算的速度远远快于整除运算,整句运算式的结果就是将新容量更新为旧容量的1.5倍:

int newCapacity = oldCapacity + (oldCapacity >> 1);

ArrayList扩容机制描述:

        ArrayList是一个数组结构的存储容器,默认数组长度是10,也可以在初始构建的时候指定长度。随着不断地向容器中添加元素,当达到上限时,ArrayList会自动进行扩容,扩容流程如下:首先会创建一个新的数组,长度为原始数组的1.5倍(使用位运算),然后使用Arrays.copy方法将老数组的元素copy到新数组中,再将需要添加的新元素添加到新数组中

Comparable 和 Comparator 的区别

        Comparable和Comparator都是接口,都可以用来进行比较、排序,可以将Comparable理解为“内部比较器”,Comparator理解为“外部比较器”

  • 实现方式
    • Comparable可以直接在需要进行排序的实体类中实现,重写compateTo方法即可。
    • Comparator需要另外创建一个实现Comparator接口的实现类来作为“比较器”,并在排序时将比较器作为参数传入。
  • 各自的优缺点
    • Comparable 实现比较简单,但是需要修改源代码。
    • Comparator需要新建比较器类,较为复杂,但是不需要修改源代码,并且新建的比较器类可以供多个对象排序使用。

具体参考这篇文章 Comparable和Comparator区别

HashMap和Hashtable的区别

  • 线程安全与效率
    • HashMap线程不安全,但效率相对较高。
    • Hashtable线程安全,效率相对较低。
  • 对 Null 的支持:
    • HashMap可以存储null值,键只能存一个(对应的key为0),值可以存多个。
    • Hashtable不可以存储null键和null值。
  • 初始容量大小和每次扩容大小:
    • 不指定容量:
      • ​​​​​​​HashMap默认初始化大小为 16,之后每次扩充,容量变为原来的 2 倍。
      • Hashtable默认的初始大小为 11,之后每次扩充,容量变为原来的 2n+1。
    • 指定容量
      • HashMap会将指定容量扩充为 2 的幂次方大小,即HashMap总是使用 2 的幂作为哈希表的大小。
      • Hashtable直接使用指定的容量。
  • 扩容方式不同:当容量不足时要进行resize方法,而resize有两个步骤:​​​​​​​
    • ①扩容:两者扩容大小不一样。
    • ②rehash:两者都会重新计算hash值,而两者计算hash的值的方式也不同。(如下代码)
//hashMap计算hash值
static final int hash(Object key) {int h;return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);}
//而hashtable直接使用hashcode值作为最终的hash值
  • 底层数据结构:
    • ​​​​​​​JDK1.8 以后的 HashMap在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)时 ,将链表转化为红黑树以减少搜索时间。
    • Hashtable只使用链表解决哈希冲突。

HashSet 如何检查重复

        当我们将对象加入HashSet时,HashSet会计算该对象的hashcode值,并与HashSet中其他对象作比较:若没有hashcode相同的对象,则该对象不重复,允许加入;若有hashcode相同的对象,还需要使用equals()方法检查两对象是否真的相同,如果相同则不允许加入该对象。

ps:

  • hashcode是某个对象的哈希值,相同对象的hashcode值一定相同,不同对象的hashcode值也有可能相同(即哈希冲突)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/233937.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

科研院校和研究所都在用功率放大器做哪些实验

科研院校和研究所在科研工作中常常使用功率放大器进行实验。功率放大器是一种电子设备&#xff0c;其主要功能是将输入信号的功率增加到预定的输出功率水平&#xff0c;并保持信号的波形不失真。它在各个学科领域都有广泛的应用&#xff0c;包括通信、无线电、雷达、生物医学等…

vue3 使用<script lang=“ts“ setup>加上lang=“ts“后编译错误

报错信息 报错原因 加上了langts解决 下载typescript和loader npm install typescript ts-loader --save-dev配置vue.config.js 添加下面的代码 configureWebpack: { resolve: { extensions: [".ts", ".tsx", ".js", ".json"] }…

Axure中继器的使用

一.中继器介绍 在Axure中&#xff0c;中继器&#xff08;Relays&#xff09;是一种功能强大的元件&#xff0c;可以用于创建可重复使用的模板或组件。中继器允许您定义一个主要的模板&#xff0c;并在页面中重复使用该模板的实例。以下是中继器的作用和优缺点&#xff1a; 作…

Wireshark在移动网络中的应用

第一章&#xff1a;Wireshark基础及捕获技巧 1.1 Wireshark基础知识回顾 1.2 高级捕获技巧&#xff1a;过滤器和捕获选项 1.3 Wireshark与其他抓包工具的比较 第二章&#xff1a;网络协议分析 2.1 网络协议分析&#xff1a;TCP、UDP、ICMP等 2.2 高级协议分析&#xff1a;HTTP…

2023 英特尔On技术创新大会直播 |我感受到的AI魅力

文章目录 前言英特尔技术创新大会 的来历芯生无限 赋能AI创新后记 前言 近年来&#xff0c;人工智能&#xff08;Artificial Intelligence&#xff09;的应用与发展呈现出爆发式增长的态势&#xff0c;成为科技领域最为引人注目的热门话题之一。作为全球领先的半导体公司&…

workflow系列教程(5-1)HTTP Server

往期教程 如果觉得写的可以,请给一个点赞关注支持一下 观看之前请先看,往期的博客教程,否则这篇博客没办法看懂 workFlow c异步网络库编译教程与简介 C异步网络库workflow入门教程(1)HTTP任务 C异步网络库workflow系列教程(2)redis任务 workflow系列教程(3)Series串联任务流…

Boto3按名字搜索AWS Image并返回Image的相关参数 (Python)

文章目录 小结问题及解决参考 小结 本文记录使用Python脚本和Boto3按名字搜索AWS Image并返回AWS Image的相关参数。 问题及解决 记得操作之前拿到相应的权限&#xff1a; export AWS_ACCESS_KEY_ID"xxxxxxxxxxxxxxxxxxxxxxxxxx"export AWS_SECRET_ACCESS_KEY&qu…

《Linux C编程实战》笔记:进程操作之ID,优先级

获得进程ID getpid函数 这个函数都用了很多次了&#xff0c;看一下定义和例子就行了 #include<sys/types.h> #include <unistd.h> pid_t getpid(void); 示例程序1 #include<cstdlib> #include<malloc.h> #include<cstring> #include <cs…

Tomcat (Linux系统)详解全集

点击标题进入对应模块学习&#xff0c;你也可以完全拿捏Tomcat&#xff01; 1 Tomcat及JDK下载安装&#xff08;Linux系统&#xff09; 2 Tomcat目录介绍 3 Tomcat的启动关闭及日志说明 4 完美解决Tomcat启动慢的三种方法 5 Tomcat管理功能使用 6 Tomcat主配置文件&#xff08;…

SSM整合实战(Spring、SpringMVC、MyBatis)

五、SSM整合实战 目录 一、SSM整合理解 1. 什么是SSM整合&#xff1f;2. SSM整合核心理解五连问&#xff01; 2.1 SSM整合涉及几个IoC容器&#xff1f;2.2 每个IoC容器盛放哪些组件&#xff1f;2.3 IoC容器之间是什么关系&#xff1f;2.4 需要几个配置文件和对应IoC容器关系&…

Python工程部署到Linux云服务器

安装python # 更新源 sudo yum install epel-release# 更新源 sudo yum update# 安装python3 sudo yum install python3# 验证 python3 -V安装pip # 安装 sudo yum install python3-pip# 升级 python3 -m pip install --upgrade pip安装virtualenv、virtualenvwrapper sudo …

Ubuntu中常用的基本操作指令及其功能

文件和目录操作&#xff1a; ls&#xff1a;列出当前目录下的文件和子目录。cd&#xff1a;切换目录。例如&#xff0c;cd /home/user 切换到 /home/user 目录。pwd&#xff1a;显示当前工作目录。mkdir&#xff1a;创建新目录。例如&#xff0c;mkdir new_directory 创建一个名…

2.vue学习(8-13)

文章目录 8.数据绑定9.el与data的2种写法10.理解mvvm11.object.defineProperty12. 理解数据代理13 vue中的数据代理 8.数据绑定 单向数据绑定就是我们学的v-bind的方式&#xff0c;vue对象变了&#xff0c;页面才变。但是页面变了&#xff0c;vue对象不会变。 双向数据绑定需要…

时序预测 | Python实现LSTM-Attention电力需求预测

时序预测 | Python实现LSTM-Attention电力需求预测 目录 时序预测 | Python实现LSTM-Attention电力需求预测预测效果基本描述程序设计参考资料预测效果 基本描述 该数据集因其每小时的用电量数据以及 TSO 对消耗和定价的相应预测而值得注意,从而可以将预期预测与当前最先进的行…

vue 学习笔记

生命周期 1&#xff09;定义&#xff1a;vue实例从创建到销毁的过程 2&#xff09;钩子函数 2.1&#xff09;beforeCreate&#xff1a;vue实例初始化之前调用&#xff0c;这个阶段vue实例刚刚在内存中创建&#xff0c;此时data和methods这些都没初始化好。 2.2&#xff09;Cre…

【算法】红黑树

一、红黑树介绍 红黑树是一种自平衡二叉查找树&#xff0c;是在计算机科学中用到的一种数据结构&#xff0c;典型的用途是实现关联数组。 红黑树是在1972年由Rudolf Bayer发明的&#xff0c;当时被称为平衡二叉B树&#xff08;symmetric binary B-trees&#xff09;。后来&am…

6.1 接口- java核心卷1

6.1 接口 任何实现Comparable接口的类都要包含compareTo方法&#xff0c;该方法参数为Object对象&#xff0c;返回整型数值 Array类的sort方法对Employee对象排序&#xff1a; 1.Employee类实现Comparable接口 2.重写compareTo方法&#xff0c;用Double.compare&#xff08;…

Go、Python、Java、JavaScript等语言的求余(取模)计算

余数符号规则&#xff1a; Go&#xff08;%&#xff09;&#xff1a; 余数与被除数符号一致 Java&#xff08;%&#xff09;&#xff1a; 余数与被除数符号一致 JavaScript&#xff08;%&#xff09;&#xff1a; 余数与被除数符号一致 Python&#xff08;%&#xff09;…

[GDI绘图]画笔CPen

CPen类 CPen画笔是一种用来画线及绘制有形边框的工具&#xff0c;用户可以指定它的颜色及厚度&#xff0c;并且可以指定它画实线、点线或虚线。 CPen类&#xff0c;该类封装了Windows图形设备接口&#xff08;GDI&#xff09;画笔&#xff0c;主要通过构造函数来创建绘图对象…

Educational Codeforces Round 160 (Rated for Div. 2)

Educational Codeforces Round 160 (Rated for Div. 2) Educational Codeforces Round 160 (Rated for Div. 2) A. Rating Increase 题意&#xff1a;给定一个由数字字符组成的字符串&#xff0c;且无前导零&#xff0c;将其分割成ab两部分&#xff0c;b不能有前导零&#x…