挑战Java面试题复习第2天,百折不挠
挑战第 2 天
- ArrayList和linkedList的区别
- HashMap和HashTable的区别
- Collection 与 Collections 的区别
- Java的四种引用
- 泛型常用特点
ArrayList和linkedList的区别
- 底层数据结构:
- ArrayList:基于动态数组实现,支持快速随机访问。
- LinkedList:基于双向链表实现,适合频繁的插入和删除操作。
- 随机访问性能:
- ArrayList:由于是基于数组,随机访问速度快,时间复杂度为O(1)。
- LinkedList:由于是基于链表,随机访问速度慢,时间复杂度为O(n)。
- 插入和删除性能:
- ArrayList:在数组中间插入或删除元素时,需要移动后续所有元素,效率较低,时间复杂度为O(n)。
- LinkedList:在链表中插入或删除元素时,只需改变节点的指针,效率高,时间复杂度为O(1)。
- 内存占用:
- ArrayList:每个元素只存储数据,内存利用率高。
- LinkedList:每个元素除了存储数据外,还需要存储两个指针(指向前一个和后一个元素),内存利用率低。
- 容量扩展:
- ArrayList:动态数组,当容量不足时会自动扩展,但扩展操作涉及复制数组,有额外开销。
- LinkedList:不需要预先分配容量,可以动态地添加节点,没有扩展容量的开销。
- 线程安全:
- 两者都不是线程安全的,但在多线程环境下,LinkedList的插入和删除操作可能更安全,因为它们通常涉及单个节点的修改。
- 使用场景:
- ArrayList:适用于频繁读取元素的场景,如作为缓存。
- LinkedList:适用于频繁插入和删除元素的场景,如实现队列或栈。
- 其他方法:
- ArrayList:提供toArray方法将列表转换为数组,asList方法将数组转换为固定大小的列表。
- LinkedList:除了List接口的方法外,还提供了额外的方法,如addFirst、addLast、removeFirst和removeLast等,用于在链表的头部或尾部进行操作。
HashMap和HashTable的区别
- 父类不同:
- HashMap:继承自AbstractMap类。
- Hashtable:继承自Dictionary类。
- 接口方法不同:
- Hashtable:提供了elements()和contains()方法,这些方法在Dictionary类中定义。
- HashMap:没有提供这两个方法。
- 对null的支持:
- Hashtable:不允许key和value为null。
- HashMap:允许key为null(但只能有一个),允许有多个value为null。
- 线程安全性:
- HashMap:非线程安全,适合单线程环境。
- Hashtable:线程安全,每个方法都加了synchronized关键字,适合多线程环境。
- 性能:
- HashMap:由于非线程安全,通常比Hashtable性能高。
- Hashtable:由于线程安全,性能可能不如HashMap。
- 替代方案:
- 当需要线程安全时,可以使用ConcurrentHashMap,它比Hashtable性能更好,因为它使用了分段锁。
- 初始容量和扩充容量:
- 两者都可以设置初始容量和负载因子,但具体实现和默认值可能不同。
- 计算hash值的方法:
- 两者可能使用不同的算法来计算hash值,这会影响元素的分布和冲突解决。
Collection 与 Collections 的区别
- Collection:
- 是一个接口,定义了所有单列集合(即不包含重复元素的集合)的基本操作。
- 子接口包括Set(不允许重复的集合)、List(有序集合,可以重复)。
- 实现类包括ArrayList、LinkedList、Vector、Stack等。
- Collections:
- 是一个工具类,提供了一系列静态方法来操作或返回各种集合。
- 提供的方法包括搜索、排序、线程安全化等操作。
- 不能被实例化,类似于Java中的其他工具类,如Arrays。
- 功能区别:
- Collection定义了集合的基本操作,如添加、删除、遍历等。
- Collections提供了对集合的辅助操作,如排序(sort)、搜索(binarySearch)、同步(synchronizedCollection)等。
- 使用场景:
- 当你需要创建一个集合并进行基本操作时,你会使用实现Collection接口的类。
- 当你需要对集合进行更高级的操作,如排序或搜索时,你会使用Collections类提供的方法。
Java的四种引用
- 强引用(Strong Reference):
- 最常见的引用类型。
- 只要强引用还存在,垃圾回收器永远不会回收被引用的对象。
- 声明方式:Object obj = new Object();
- 软引用(Soft Reference):
- 内存不足时,垃圾回收器会回收软引用指向的对象。
- 适用于缓存场景,用于内存敏感的高速缓存。
- 声明方式:SoftReference softRef = new SoftReference<>(new Object());
- 弱引用(Weak Reference):
- 只要垃圾回收器发现了弱引用对象,就会回收该对象,不管当前内存是否充足。
- 适用于实现缓存、监听器等,其中对象不再使用时可以被自动回收。
- 声明方式:WeakReference weakRef = new WeakReference<>(new Object());
- 虚引用(Phantom Reference):
- 虚引用对象在垃圾回收时会被放入引用队列(ReferenceQueue)中,但不会阻止对象的回收。
- 用于跟踪对象被垃圾回收的活动,进行资源释放等操作。
- 必须与ReferenceQueue一起使用。
- 声明方式:PhantomReference phantomRef = new PhantomReference<>(new Object(), new ReferenceQueue<>());
- 引用队列(ReferenceQueue):
- 用于跟踪垃圾回收活动,当引用的对象被回收时,相应的引用会被放入队列中。
- 使用场景:
- 强引用:普通对象的引用。
- 软引用:内存敏感的高速缓存。
- 弱引用:缓存、监听器等,对象不再使用时可以被自动回收。
- 虚引用:对象销毁前的操作,如资源释放。
- 回收机制:
- 强引用:不会被回收。
- 软引用:内存不足时被回收。
- 弱引用:一旦发现即被回收。
- 虚引用:在对象被回收前被放入引用队列。
- 注意:
- 引用类型指的是对象的引用,而不是Reference类的子类(如SoftReference)的引用。
泛型常用特点
- 泛型定义:
- 泛型是Java SE 1.5引入的特性。
- 允许代码与特定的数据类型无关,从而提高代码的重用性。
- 泛型概念:
- 泛型提供了一种方式,使得类、接口和方法可以在不知道具体类型的情况下编写。
- 可以在代码执行时指定具体的类型。
- 泛型使用示例:
- 例如,ArrayList是一个泛型类,可以存储任何类型的元素。
- 通过指定类型参数,如List,可以约束集合中元素的类型。
- 使用泛型的好处:
- 类型安全:编译时检查类型,减少运行时错误。
- 代码重用:一个类可以处理多种数据类型。
- 减少类型转换:避免了不必要的类型转换,提高代码的可读性和简洁性。
- 提高性能:避免了类型擦除带来的性能开销。
- 类型擦除:
- Java泛型在编译时会被擦除,即泛型信息不会保留在字节码中。
- 这意味着运行时泛型不会增加额外的存储开销。
- 泛型与集合:
- 使用泛型可以定义一个集合来存放不同类型的数据,同时保持类型安全。
- 例如,可以定义一个List来存储整数,而不需要将所有元素都存储为Object类型。
- 泛型约束:
- 可以通过泛型约束(如extends和super关键字)来限制泛型类型。
- 例如,List<? extends Number>可以存储任何Number子类型的元素。
- 泛型通配符:
- 通配符(如?)允许在泛型中使用未知的类型。
- 提供了灵活性,允许在不知道具体类型的情况下操作泛型集合。
相关文章:
挑战Java面试题复习第2天,百折不挠
挑战第 2 天 ArrayList和linkedList的区别HashMap和HashTable的区别Collection 与 Collections 的区别Java的四种引用泛型常用特点 ArrayList和linkedList的区别 底层数据结构: ArrayList:基于动态数组实现,支持快速随机访问。LinkedList&a…...

【vue之道】
vue之道 1. 一生二,二生万物思想2. 变化之律3. 变化之实在哪?4.而后学于形乃已!4.1 展示之形变4.2 动之气谓之指令4.3 血之养分的载体,于vue之绑定载具4.4 vue之道(万法规一篇) 1. 一生二,二生万…...

基于麻雀优化算法SSA的CEEMDAN-BiLSTM-Attention的预测模型
往期精彩内容: 时序预测:LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较 全是干货 | 数据集、学习资料、建模资源分享! EMD、EEMD、FEEMD、CEEMD、CEEMDAN的区别、原理和Python实现(一)EMD-CSDN博客 EMD、EEM…...

Linux:指令再认识
文章目录 前言一、知识点1. Linux下一切皆文件,也就是说显示器也是一种文件2. 指令是什么?3. ll 与 ls -l4. 日志5. 管道6. 时间戳 二、基本指令1. man指令2. cp指令3. mv指令4. 查看文件1)cat/tac指令——看小文件2)more/less指令…...
PHP如何抛出和接收错误
在PHP中,抛出和接收错误通常涉及异常处理机制,以及错误和异常的处理函数。以下是如何在PHP中抛出和接收错误的详细指南: 抛出错误(异常) 在PHP中,你可以使用throw关键字来抛出一个异常。这通常在你检测到…...

计算机网络:网络层 —— IPv4 地址的应用规划
文章目录 IPv4地址的应用规划定长的子网掩码变长的子网掩码 IPv4地址的应用规划 IPv4地址的应用规划是指将给定的 IPv4地址块 (或分类网络)划分成若干个更小的地址块(或子网),并将这些地址块(或子网)分配给互联网中的不同网络,进而可以给各网络中的主机…...
Mongodb命令大全
Mongodb命令大全 一、数据库相关命令二、集合相关命令三、文档(数据)相关命令1、_id 字段说明2、查询2.1、 查询操作符2.2、内嵌文档查询2.3、数组文档查询2.4、去重查询2.5、查询排序 sort2.6、分页查询2.7、指定列投影查询返回2.8、查询统计个数 count 3、聚合查询3.1、查询用…...

宇视设备视频平台EasyCVR视频融合平台果园/鱼塘/养殖场/菜园有电没网视频监控方案
在那些有电无网的偏远地区,如果园、鱼塘、养殖场或菜园,视频监控的实现面临着独特的挑战。宇视设备视频平台EasyCVR提供了一种创新的解决方案,通过结合太阳能供电和4G摄像头技术,有效地解决了这些场景下的监控需求。 在有电没网的…...
面试题:ABCD四个线程,A线程最后执行
我觉得是一个很高频的面试题,ABCD四个线程,A线程要等到BCD线程执行完再执行,怎么做 因为我刚复习完AQS,所以立马想到了CountDownLatch,但是看面试官反应他最想听到的应该是join方法,所以面试后就总结了几种…...

代码随想录算法训练营第46期Day43
leetcode.322零钱兑换 class Solution { public: //无限个硬币->完全背包int coinChange(vector<int>& coins, int amount) {vector<int> dp(10010,INT_MAX);//dp代表的在某个数值下最小的硬币数,要求是最小的硬币数,所以初始值要尽可…...
前端处理API接口故障:多接口自动切换的实现方案
因为在开发APP,一个接口如果不通(被挂了)又不能改了重新打包让用户再下载软件更新,所以避免这种情况,跟后端讨论多备用接口地址自动切换的方案,自动切换到备用的接口地址,并保证后续所有的请求都…...
多租户架构的全景分析(是什么?基本概念、实现策略、资源管理和隔离、数据安全与隔离、性能优化、扩展性与升级、案例研究)
文章目录 1. 多租户的基本概念2. 多租户的实现策略2.1 独立数据库模式2.2 共享数据库-独立Schema模式2.3 共享数据库-共享Schema模式 3. 资源管理和隔离4. 数据安全与隔离5. 性能优化6. 扩展性与升级7. 案例研究总结 多租户架构在云计算和SaaS应用中越来越流行,因为…...
Git使用问题汇总附带解决方法(持续更新)
Git使用问题汇总附带解决方法 一 git pull 代码时报错: Auto packing the repository in background for optimum performance. See “git help gc“ 一 git pull 代码时报错: Auto packing the repository in background for optimum performance. See …...

Spring Boot驱动的植物健康监测革命
1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理植物健康系统的相关信息成为必然。开发合适…...
element 中 el-dialog 在不同的文件中使用
在实际中工作,我们经常需要使用 el-dialog 来做一个弹框的功能。最常见的就是在父组件中点击一个按纽,然后弹出一个框。而这个框就是子组件。同时,父子组件是分布在不同的文件中。 <!--父组件--> <template> <div> <…...
QT中采用QCustomPlot 实现将buffer中的数据绘制成折线图,并且图形随着数据更新而更新
QT中采用QCustomPlot 实现将buffer中的数据绘制成折线图,并且图形随着数据更新而更新 为了在 Qt 中将缓冲区的数据动态绘制成折线图,并随着数据的更新而实时更新,可以使用 QCustomPlot 或 Qt 自带的绘图功能,比如 QGraphicsView,或者在更简单的情况下使用 QPainter 在 QW…...

1688API商品详情接口如何获取
获取 1688API商品详情接口主要有以下步骤: 一、注册开发者账号: 访问 1688 开放平台,进行开发者账号注册。这是获取 API 接口使用权限的第一步,注册信息要确保真实准确。 二、了解接口规范和政策: 在 1688 开放平台…...
pytorch + d2l环境配置
文章目录 前言一、安装软件二、配置具体环境 前言 一直想写一篇 pytorch d2l的深度学习环境配置。但一直都不是很顺利,配置过很多次,都会遇到一些各种依赖项的兼容性问题。但这个是没有办法的,各种开源包都在不断维护过程中,版本…...

Go使用exec.Command() 执行脚本时出现:file or directory not found
使用 Go 提供的 exec.Command() 执行脚本时出现了未找到脚本的 bug,三个排查思路 : exec.Command(execName, args…) 脚本名字不允许相对路径 exec.Command(execName, args…) execName 只能有脚本名,不允许出现参数 如果你是使用 Windows …...
细节性知识(宏定义解析与宏的外部引用)
目录 一、问:#define N 50 中的N可以用来做运算比较吗? 二、宏定义怎么外部引用? 例子 总结 一、问:#define N 50 中的N可以用来做运算比较吗? 解析:在C语言中,#define N 50 是一个预处理指…...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...