挑战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 是一个预处理指…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
DAY 45 超大力王爱学Python
来自超大力王的友情提示:在用tensordoard的时候一定一定要用绝对位置,例如:tensorboard --logdir"D:\代码\archive (1)\runs\cifar10_mlp_experiment_2" 不然读取不了数据 知识点回顾: tensorboard的发展历史和原理tens…...
