【面经合集】Java基础精选面试题(三)

news2024/11/25 17:01:57

最近,小编整理了不少Java领域面试题,如有需要,点击关注,回复【面试题】,即可下载。

31 、说说List,Set,Map三者的区别?

List、Set、Map是三种不同数据结构的集合,它们的主要区别体现在存储方式、元素唯一性、有序性、以及使用场景上。

1)存储方式和元素唯一性

List(列表)是一种有序的集合,允许元素重复。按照索引位置存储、访问元素,可通过索引快速查找和修改元素。

Set(集合)是一种无序的集合,不允许元素重复。Set的底层实现通常基于哈希表,通过计算元素的哈希值来保证元素的唯一性。Set中的元素不按特定的顺序排列,重复的元素会被自动去除。

Map(映射)是一种键值对的集合,键是唯一的。Map中的每一个元素都包含一个键和一个值,键用于快速查找对应的值。

2)有序性

List和Set的无序是指它们不保证元素的特定顺序,尤其是Set,其元素顺序是任意的。

Map中的元素顺序取决于具体的实现类,如LinkedHashMap会按照插入顺序或访问顺序保持元素的顺序。

3)使用场景

当需要按照特定顺序存储元素,并且允许元素重复时,应使用List。

当需要保证元素的唯一性,并且不关心顺序时,应使用Set。

当需要存储键值对,通过键快速查找对应的值时,应使用Map。如果还需要保持插入顺序,可以选择LinkedHashMap。

32、 Object 有哪些常用方法? 大致说一下每个方法的含义

clone 方法,是保护方法 ,实现对象的浅复制 ,只有实现了 Cloneable 接口才可以调用该方法 ,否则抛出CloneNotSupportedException 异常, 深拷贝也需要实现 Cloneable, 同时其成员变量为引用类型 的 也需要实现 Cloneable,然后重写 clone 方法。

 nalize 方 法

该方法和垃圾收集器有关系 ,判断一个对象是否可以被回收的最后一步就是判断是否重写了此方 法。

equals 方法

该方法使用频率非常高 。 一般 equals 和 == 是不一样的,但是在 Object  中两者是一样的 。子类一 般都要重写这个方法。

hashCode 方法

该方法用于哈希查找 ,重写了 equals 方法一般都要重写 hashCode 方法 ,这个方法在一些具有哈 希功能的 Collection 中用到。

一般必须满足  obj1.equals(obj2)==true。可以推出 obj1.hashCode()==obj2.hashCode(),但是hashCode 相等不一定就满足equals。不过为了提高效率,应该尽量使上面两个条件接近等价。

  JDK 1.6、 1.7 默认是返回随机数;

. JDK 1.8 默认是通过和当前线程有关的一个随机数 + 三个确定值 ,运用 Marsaglia’ sxorshift scheme 随机数算法得到的一个随机数。

wait 方 法

配合 synchronized 使用,wait 方法就是使当前线程等待该对象的锁, 当前线程必须是该对象的拥   有者 ,也就是具有该对象的锁 。 wait() 方法一直等待 ,直到获得锁或者被中断 。 wait(longtimeout)

设定一个超时间隔,如果在规定时间内没有获得锁就返回。 调用该方法后当前线程进入睡眠状态 ,直到以下事件发生。

1. 其他线程调用了该对象的 notify 方法;

2. 其他线程调用了该对象的 notifyAll 方法;

3. 其他线程调用了 interrupt 中断该线程;

4. 时间间隔到了。

此时该线程就可以被调度了 ,如果是被中断的话就抛出一个 InterruptedException 异常。 notify 方 法

配合 synchronized 使用 ,该方法唤醒在该对象上等待队列中的某个线程(同步队列中的线程是给 抢占 CPU 的线程 ,等待队列中的线程指的是等待唤醒的线程)。

notifyAll 方法配合 synchronized 使用 ,该方法唤醒在该对象上等待队列中的所有线程。 

总结

只要把上面几个方法熟悉就可以了, toString 和 getClass 方法可以不用去讨论它们 。该题目考察的 是对 Object 的熟悉程度,平时用的很多方法并没看其定义但是也在用,比如说:  wait() 方法,equals() 方法等。

 Object 是所有类的根 ,是所有类的父类 ,所有对象包括数组都实现了Object 的方法。

33Java 创建对象有几种方式?

1)使用 new 关键字 ,例如:new Demo();

2)使用反射方式创建对象,使用 newInstance() ,但是得处理两个异常 InstantiationException、 IllegalAccessException:

User user = User.class.newInstance();
Object object = (Object)Class.forName("java.lang.Object").newInstance()

使用 clone 方法 ,前面题目中 clone 是 Object 的方法 ,所以所有对象都有这个方法。 

使用反序列化创建对象 ,调用 ObjectInputStream 类的 readObject() 方法。

我们反序列化一个对象,JVM 会给我们创建一个单独的对象。JVM 创建对象并不会调用任何构造函 数 。一个对象实现了 Serializable 接口 ,就可以把对象写入到文件中 ,并通过读取文件来创建对象。

总结

创建对象的方式关键字: new、反射、 clone 拷贝、反序列化。

34、获取一个类Class对象的方式有哪些?

搞清楚类对象和实例对象 ,但都是对象。

第一种:通过类对象的 getClass() 方法获取 ,细心点的都知道 ,这个 getClass 是 Object 类里面的 方 法。

第二种:通过类的静态成员表示 ,每个类都有隐含的静态成员 class。

第三种:通过 Class 类的静态方法 forName() 方法获取。

35 、ArrayList 和 LinkedList 的区别有哪些?

ArrayList

  优点:ArrayList 是实现了基于动态数组的数据结构, 因为地址连续,  一旦数据存储好了 ,查询 操作效率会比较高(在内存里是连着放的)。

缺点: 因为地址连续, ArrayList 要移动数据 ,所以插入和删除操作效率比较低。

LinkedList

  优点:LinkedList 基于链表的数据结构 ,地址是任意的 ,所以在开辟内存空间的时候不需要等 一个连续的地址 。对于新增和删除操作,  LinkedList 比较占优势 。 LinkedList 适用于要头尾操  作或插入指定位置的场景。

  缺点: 因为 LinkedList 要移动指针,所以查询操作性能比较低。 适用场景分析

   当需要对数据进行对随机访问的时候 ,选用 ArrayList。

   当需要对数据进行多次增加删除修改时 ,采用 LinkedList。

如果容量固定 ,并且只会添加到尾部,不会引起扩容 ,优先采用ArrayList。

当然 ,绝大数业务的场景下 ,使用 ArrayList 就够了 ,但需要注意避免 ArrayList 的扩容, 以及非顺 序的插入。

36 、用过 ArrayList 吗? 说一下它有什么特点?

只要是搞Java 的肯定都会回答“用过” 。所以, 回答题目的后半部分——ArrayList 的特点 。可以从这 几个方面去回答:

Java 集合框架中的一种存放相同类型的元素数据 ,是一种变长的集合类 ,基于定长数组实现,当加入数据达到一定程度后 ,会实行自动扩容, 即扩大数组大小。

底层是使用数组实现 ,添加元素。

. 如果 add(o),添加到的是数组的尾部 ,如果要增加的数据量很大 ,应该使用 ensureCapacity() 方 法 ,该方法的作用是预先设置 ArrayList 的大小 ,这样可以大大提高初始化速度。

. 如果使用 add(int,o),添加到某个位置 ,那么可能会挪动大量的数组元素 ,并且可能会触发扩 容机制。

高并发的情况下 ,线程不安全 。多个线程同时操作 ArrayList ,会引发不可预知的异常或错误。

ArrayList 实现了 Cloneable 接口 ,标识着它可以被复制 。注意: ArrayList 里面的 clone() 复制其实 是浅复制。

37 、 有数组了为什么还要搞个 ArrayList 呢?

通常我们在使用的时候 ,如果在不明确要插入多少数据的情况下 ,普通数组就很尴尬了, 因为你不 知道需要初始化数组大小为多少 ,而 ArrayList 可以使用默认的大小, 当元素个数到达一定程度

后,会自动扩容。

可以这么来理解:我们常说的数组是定死的数组, ArrayList 却是动态数组。

38 、 说说什么是 fail-fast

fail-fast 机制是 Java 集合(Collection) 中的一种错误机制 。 当多个线程对同一个集合的内容进行操作时 ,就可能会产生 fail-fast 事件。

例如: 当某一个线程 A 通过 iterator 去遍历某集合的过程中 ,若该集合的内容被其他线程所改变  了, 那么线程 A 访问集合时 ,就会抛出 ConcurrentModificationException 异常, 产生 fail-fast 事 件 。这里的操作主要是指 add 、 remove 和 clear ,对集合元素个数进行修改。

解决办法 :建议使用 “java.util.concurrent 包下的类 ”去取代“ java.util 包下的类 ”。

可以这么理解: 在遍历之前, 把 modCount 记下来 expectModCount, 后面 expectModCount 去和 modCount 进行比较 ,如果不相等了 ,证明已并发了 ,被修改了 ,于是抛出 ConcurrentModificationException 异常。

39 、 说说Hashtable 与 HashMap 的区别

1). 都实现了 Map、 Cloneable、 Serializable(当前JDK 版本 1.8)。

2). HashMap 继承的是 AbstractMap,并且 AbstractMap 也实现了 Map 接口 。 Hashtable 继承 Dictionary。

3). Hashtable 中大部分 public 修饰普通方法都是 synchronized 字段修饰的 ,是线程安全的, HashMap 是非线程安全的。

4). Hashtable的key不能为null,value也不能为null,这个可以从Hashtable源码中的put方法看到,判断如果 value为null 就直接抛出空指针异常 ,在put方法中计算key的hash值之前并没有判断 key 为 null 的情况 ,那说明 ,这时候如果 key 为空 ,照样会抛出空指针异常。

5)  HashMap 的key 和value都可以为null。在计算hash 值的时候 ,有判断,如果key = = null,则其   hash=0  ;至于 value 是否为null,根本没有判断过。

6)Hashtable 直接使用对象的 hash 值。hash 值是JDK 根据对象的地址或者字符串或者数字算出来的int 类型的数值。然后再使用除留余数法来获得最终的位置。然而除法运算是非常耗费时   间的,效率很低。HashMap为了提高计算效率,将哈希表的大小固定为了2的幂,这样在取   模   预算时,不需要做除法,只需要做位运算。位运算比除法的效率要高很多。

7)Hashtable 、 HashMap 都使用了 Iterator 。而由于历史原因, Hashtable 还使用了 Enumeration 的方式。

8) 默认情况下 ,初始容量不同, Hashtable 的初始长度是 11 ,之后每次扩充容量变为之前的    2n+1(n 为上一次的长度)而 HashMap 的初始长度为 16 ,之后每次扩充变为原来的两倍。

 Hashtable 源码注释中解释道: Hashtable 是线程安全,推荐使用 HashMap 代替 Hashtable ;如果需要线程安全高并发的话,推荐使用 ConcurrentHashMap 代替 Hashtable。

40 、 HashMap 中的 key 我们可以使用任何类作为 key 吗?

平时可能大家使用的最多的就是使用 String 作为 HashMap 的 key ,但是现在我们想使用某个自定 义类作为 HashMap 的 key ,那就需要注意以下几点:

. 如果类重写了 equals 方法 ,它也应该重写 hashCode 方法。

. 类的所有实例需要遵循与 equals 和 hashCode 相关的规则。

. 如果一个类没有使用 equals ,你不应该在 hashCode 中使用它。

. 咱们自定义 key 类的最佳实践是使之为不可变的 ,这样,  hashCode 值可以被缓存起来,拥有

更好的性能 。 不可变的类也可以确保 hashCode 和 equals 在未来不会改变 ,这样就会解决与 可 变相关的问题了。

41 、 HashMap 的长度为什么是 2 的 N 次方呢?

为了能让 HashMap 存数据和取数据的效率高 ,尽可能地减少 hash 值的碰撞 ,也就是说尽量把数 据能均匀的分配 ,每个链表或者红黑树长度尽量相等。

我们首先可能会想到%取模的操作来实现。 下面是回答的重点哟:

取余(%)操作中如果除数是 2 的幂次 ,则等价于与其除数减一的与(&)操作(也就是说

hash   %length==hash&(length-1)   

42 、 HashMap  与  ConcurrentHashMap  的 异 同

1. 都是 key-value 形式的存储数据;

2. HashMap 是线程不安全的, ConcurrentHashMap 是JUC 下的线程安全的;

3. HashMap 底层数据结构是数组 + 链表(JDK 1.8 之前)。JDK 1.8 之后是数组 + 链表 + 红黑

树 。 当链表中元素个数达到 8 的时候 ,链表的查询速度不如红黑树快 ,链表会转为红黑树 ,红 黑树查询速度快;

4. HashMap 初始数组大小为 16 (默认),当出现扩容的时候, 以 0.75 *数组大小的方式进行扩 容;

5. ConcurrentHashMap 在JDK 1.8 之前是采用分段锁来现实的 Segment + HashEntry,

Segment 数组大小默认是 16 ,2 的 n 次方;JDK 1.8 之后 ,采用 Node + CAS + Synchronized 来保 证并发安全进行实现。

43、红黑树有哪几个特征?

红黑树是一种自平衡的二叉查找树,它具有以下几个显著的特点:

1)颜色属性:红黑树中的每个节点都被标记为红色或黑色。这是红黑树实现自平衡的关键机制之一。

2)根节点颜色:根节点一定是黑色,这有助于确保树的整体平衡。

3)叶子节点颜色:所有叶子节点(NIL节点)都是黑色的,这有助于在插入和删除操作后保持树的平衡。

4)红色节点的子节点颜色:如果一个节点是红色的,则它的两个子节点都是黑色的。这一规则确保了从任何节点到其所有叶子节点的路径上,黑色节点的数量保持一致,从而维持了树的平衡。

5)自平衡特性:红黑树能够在插入和删除节点后,通过一系列的旋转和颜色调整操作,快速地恢复平衡状态。这种自平衡特性使得红黑树在进行查找、插入和删除操作时,时间复杂度都能保持在O(log n),其中n是树中节点的数量。相比普通的二叉搜索树,红黑树的性能更加稳定和高效。

红黑树的这些特点使其成为一种高效的数据结构,广泛应用于需要高效查找、插入和删除操作的应用场景中,如操作系统的进程调度、数据库的索引结构、以及各种编程语言的标准库中实现关联容器等。

如您觉得本文对您有帮助,麻烦帮忙【关注+点赞+转发】~

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

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

相关文章

Linux命令:用来列出当前系统内核加载的所有模块的工具lsmod详解

目录 一、概述 二、 使用方法 三、 输出格式 四、 示例 五、 相关命令 六、 高级用法 1、结合管道符 | 和 grep 命令 2、结合其他命令使用 七、应用和注意 一、概述 lsmod 是一个 Linux 命令行工具,用来列出当前内核加载的所有模块。这个命令对于了解哪些模…

分布式计算技术是什么?在数据集成值得作用?

数据是现代科技技术的基础,面对爆炸性数据的增长,要求计算能力要求更高、数据整合和处理更有效,如何应对数据集成带来的挑战?本文将探讨分布式计算技术在数据集成中的优化作用。 一 分布式计算技术。 定义:分布式计算…

《机器学习by周志华》学习笔记-神经网络-02感知机与多层网络

1、感知机 1.1、概念 感知机(Perceptron)由2层神经元模型组织,如下图所示: 「输入层神经元」接收外界输入信号后,传递给「输出层神经元 」 「输出层神经元」是「M-P神经元」,亦称「阈值逻辑单元(threshold logic unit)」 1.2、作用 「感知机」能够容易的实现逻辑「与…

初识前端监控

以下笔记来源:黑马程序员 背景 思考一下,我们的项目代码在上线之后是不是就不用管了呢? 并不是,作为前端开发工程师,我们是直接跟用户打交道的,一个应用的用户留存率跟这个应用的稳定性有很大的关系&…

NXP i.MX8系列平台开发讲解 - 4.2.1 摄像头篇(一) - 认识摄像头模组

专栏文章目录传送门:返回专栏目录 Hi, 我是你们的老朋友,主要专注于嵌入式软件开发,有兴趣不要忘记点击关注【码思途远】 文章目录 目录 1. 引言 2. 嵌入式系统中的CCM应用 3. 摄像头模组的基本组成 4. 摄像头模组的封装工艺 5. 摄像头…

GORM入门

ORM框架 什么是ORM ORM优缺点 GORM介绍 Github GORM 中文官方网站 安装 go get -u github.com/jinzhu/gorm连接数据库 连接不同的数据库都需要导入对应数据的驱动程序,GORM已经包装了一些驱动程序,只需要按如下方式导入需要的数据库驱动即可&#…

Python 方法传参详解

参数 位置参数 和关键字参数 data{error: str(e)}:传递给了 __init__ 方法中的 data 参数,表示需要返回给客户端的 JSON 数据。status500:通过 **kwargs 传递给了父类 HttpResponse,并设置了响应状态码为 500。 位置参数 和关键字…

redis Redis-Cluster常用命令与Redis性能监控

起因:随着项目的进一步推广,数据量的增大,直接访问mysql数据库获取数据所使用的时间越来越长,为解决当前主要矛盾,决定引入redis非关系型数据库作为缓存层,使得数据并不能直接命中数据库,减少访…

重生之我在代码随想录刷算法第十三天 | 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和、222.完全二叉树的节点个数

参考文献链接:代码随想录 本人代码是Java版本的,如有别的版本需要请上代码随想录网站查看。 110.平衡二叉树 力扣题目链接 解题思路 这道题目刚看到以为和二叉树的最大深度差不多,上来写了一堆迭代求深度的代码结果发现不对劲。 看了题…

非标精密五金加工的技术要求

非标精密五金加工在现代制造业中占据着重要地位,其对于产品的精度、质量和性能有着较高的要求。以下是时利和整理的其具体的技术要求: 一、高精度的加工设备 非标精密五金加工需要先进的加工设备来保证加工精度。例如,高精度的数控机床是必不…

【越学学糊涂的Linux系统】Linux指令篇(2)

一、echo指令: ✔️✔️在终端中显示文本内容或向文件中写入文本 Ⅰ.基本用法: 0x00打印字符串: 打印字符串/显示文本内容;可以用双引号作为文本内容⬇️⬇️更推荐用单引号 这里我将字符串打印出来了。和printf的功能一样&…

【Linux实践】实验五:用户和组群账户管理

【Linux实践】实验五:用户和组群账户管理 实验目的实验内容实验步骤及结果1. 创建用户2. 切换用户3. 修改用户4. 删除用户5. 创建组群6. 修改组群补充:删除组群 实验目的 1、掌握字符界面下用户账户的设置,包括命令useradd、usermod、userde…

深入解析 Apache Kylin

以下是关于 Kylin 概述 部分的内容,你可以在技术博客中使用: 1. Kylin 概述 什么是 Apache Kylin? Apache Kylin 是一个开源的分布式分析引擎,主要为大数据场景下的 OLAP(Online Analytical Processing)提…

利用echarts 显示图片信息

当前有个需求,需要对其进行相关统计,这里我们采用jquery3.6 与echarts.js 做相关图表,不解释,直接上代码吧 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"wid…

被动元数据的不足和主动元数据的先进性

元数据管理领域&#xff0c;被动元数据管理主要执行的是一种基础且相对直接的任务&#xff0c;即简单地对元数据进行编目或存储。这一过程通常不涉及复杂的逻辑处理或动态分析&#xff0c;而是侧重于数据的静态描述和记录&#xff0c;如数据类型、结构、位置、创建时间等。 这…

【PG备份恢复】基于时间点的恢复(踩坑指南)

1 设置基于时间点恢复所需的配置 要启用WAL归档&#xff0c; 需设置wal_level配置参数为replica或更高&#xff0c;设置archive_mode为on&#xff0c;并且使用archive_command配置参数指定一个shell命令 1.1 修改配置文件 postgresql.conf vim postgresql.conf archive_…

资深老师都在用的成绩发布小程序,月考发成绩就用它!

在教育的长河中&#xff0c;老师们一直扮演着知识传递者的角色。然而&#xff0c;随着时间的流逝&#xff0c;教育的方式也在不断地革新。过去&#xff0c;老师们发布成绩查询的方式既繁琐又耗时。 现在我们有了更高效、更便捷的成绩发布方式。在众多的成绩查询系统中&#xff…

2.数据结构研究

计算机解决问题的步骤 线性表 树 图&#xff08;点线&#xff09;

电脑录屏软件免费版,四款宝藏软件揭秘

在这个数字化时代&#xff0c;无论是教学演示、游戏直播还是软件教程分享&#xff0c;电脑录屏都成为了我们日常生活中不可或缺的一部分。然而&#xff0c;面对市面上琳琅满目的录屏软件&#xff0c;如何选择一款既免费又功能强大的工具&#xff0c;成为了不少小伙伴的难题。今…

桌面专业版【ssh配置】

UOS统信SSH协议的简单使用方法。包含软件安装,服务启动及常见问题等内容。 文章目录 功能概述一、SSH安装二、SSH使用方法三、SSH常见问题1. 无法使用root用户登陆。2. SSH登录提示”connect to hosts xxxx :Connection refused功能概述 SSH 为 Secure Shell 的缩写,由 IET…