Java面试专题——常见面试题1

引入

本文属于专题中的常见面试题模块,属于面试时经常遇到的,适合需要面试的小伙伴做面试前复习准备用,后续会持续补充

1.面向对象基本特征

面向对象的基本特征是什么?怎么理解?

面向对象的基本特征是封装、继承、多态。

封装:
封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。

继承:
继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。

多态性:
多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。

2.hashmap实现原理

HashMap 实现原理是什么?

HashMap 基于hash 原理,我们通过 put()和 get()方法储存和获取对象。

当我们将键值对传递给 put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。

当获取对象时,通过键对象的 equals()方法找到正确的键值对,然后返回值对象。

HashMap 使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。

Hash Map在每个链表节点中储存键值对对象。

当两个不同的键对象的hashcode相同时会发生什么?

它们会储存在同一个 bucket 位置的链表中。键对象的 equals()方法用来找到键值对。

3.事务的理解

简述一下事务,并且你对事务的理解?

1、简述事务的基本概念

在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序。

事务是恢复和并发控制的基本单位。

事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID 特性。

  • 原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。
  • 一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
  • 隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
  • 持久性(durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

2、结合具体项目或者应用,说一说事务,比如flume

Flume 使用事务的办法来保证 event 的可靠传递。Source 和 Sink 分别被封装在事务中,这些事务由保存 event 的存储提供或者由 Channel 提供。这就保证了event 在数据流的点对点传输中是可靠的。在多级数据流中,如下图,上一级的 Sink和下一级的 Source 都被包含在事务中,保证数据可靠地从一个Channel到另一个Channel转移。

4.gc 算法

常见GC 算法有哪些?

复制收集算法

将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。

实现步骤:

  1. 划分两块相同大小的内存区域,分别称为 From 空间和 To 空间。
  2. 程序运行时,在 From 空间中分配对象。
  3. 当 From 空间满时,启动垃圾回收。
  4. 遍历 From 空间,标记出所有存活的对象。
  5. 将存活对象复制到 To 空间。
  6. 清理 From 空间。
  7. 下次垃圾回收时,From 空间和 To 空间角色互换。

优点:不会产生内存碎片,实现简单,回收效率高。

缺点:内存利用率只有 50%。

标记清除算法

分为 “标记” 和 “清除” 两个阶段。首先标记出所有需要回收的对象,然后统一回收被标记的对象所占用的空间。

实现步骤:

  1. 从根节点开始遍历,标记所有可达的对象。
  2. 遍历整个内存空间,清除未被标记的对象。

优点:实现简单。

缺点:容易产生大量不连续的内存碎片,可能导致后续分配大对象时无法找到足够的连续空间。

标记整理算法

标记过程与标记清除算法相同,但后续不是直接清理对象,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。

实现步骤:

  1. 从根节点开始遍历,标记所有可达的对象。
  2. 让所有存活的对象向一端移动。
  3. 清理端边界以外的内存。

优点:解决了内存碎片问题。

缺点:移动存活对象的操作增加了成本,效率相对较低。

5.悲观锁与乐观锁

说说悲观锁和乐观锁?

1、悲观锁(PessimisticLock)

每次拿数据的时候都会担心会被别人修改(疑心重很悲观),所以每次在拿数据的时候都会上锁。确保自己使用的过程中不会被别人访问,自己使用完后再解锁。期间需要访问该数据的都会等待。

2、乐观锁(Optimistic Lock)

每次拿数据的时候都完全不担心会被别人修改(心态好很乐观),所以每次在拿数据的时候都不会上锁。但是在更新数据的时候去判断该期间是否被别人修改过(使用版本号等机制),期间该数据可以随便被其他人读取。

3、两种锁各有优缺点,不能单纯的定义哪个好于哪个。乐观锁比较适合数据修改比较少,读取比较频繁的场景,即使出现了少量的冲突,这样也省去了大量的锁的开销,故而提高了系统的吞吐量。但是如果经常发生冲突(写数据比较多的情况下),上层应用不不断的retry,这样反而降低了性能,对于这种情况使用悲观锁就更合适。

6.连接池

为什么要用连接池?连接池的原理是什么?

1、首先在 Web 开发中,如果使用JDBC 连接数据库,那么每次访问请求都必须建立连接一打开数据库一一存取数据库一一关闭连接等一系列步骤。但是我们知道数据库的连接打开不仅费时,而且消耗比较多的系统资源。如果进行数据库操作的次数比较少,那么还不至于有多大的影响,但是假如频繁的进行数据库操作,那么系统的性能将会受到很大影响。

2、其次,是造成数据库连接泄漏。数据库连接泄漏,指的是如果在某次使用或者某段程序中没有正确地关闭Connection、Statement 和ResultSet 资源,那么每次执行都会留下一些没有关闭的连接,这些连接失去了引用而不能得到重新使用,因此就造成了数据库连接的泄漏。数据库连接的资源是宝贵而且是有限的,如果在某段使用频率很高的代码中出现这种泄漏,那么数据库连接资源将被耗尽,影响系统的正常运转。

3、为了解决上述问题,因此就引入了数据库连接池技术。用一句话概括数据库连接池技术那就是负责分配、管理和释放数据库连接。

4、连接池用于创建和管理数据库连接的缓冲池技术,缓冲池中的连接可以被任何需要他们的线程使用。当一个线程需要用JDBC对一个数据库操作时,将从池中请求一个连接。当这个连接使用完毕后,将返回到连接池中,等待为其他的线程服务。

7.多线程

怎么理解多线程的?

1) 提到多线程,必须先提到进程和线程两个概念,进程指的是系统中正在运行的一个应用程序,而进程想要执行任务,就必须要有线程,一个进程至少有一条线程,程序在启动的时候会默认开启一条线程,我们称为主线程.

2)多线程的优点 一个进程可以开启多条线程,每个线程执行不同的任务.它可以适当的提高程序的运行效率和资源利用率.一般我们在开发中将耗时任务放到后台去处理,例如网络请求数据,文件读写,用户输入等.此外可以使得界面更加吸引人, 比如用户在点击了一个按钮去触发某些事件的处理,可以弹出进度条来显示处理的进程,减少用户等待的焦虑心理.

3)多线程的缺点 但是线程并不是开的越多越好, 因为多线程的同时执行,是 CPU 在多条线程之间来回切换造成的, 由于切换速度太快,造成了多条线程同时执行的感觉.如果线程开启的过多,一方面会占用大量的内存空间,另一方面,CPU 在线程之间来回切换也会消耗大量 CPU 资源.此外,线程过多也会使得程序的设计更加复杂, 比如线程之间的通信和多线程数据的共享.

8.Java设计模式

java 有哪些设计模式?单例模式有哪些特点?

1)总体来说设计模式分为三大类:

创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

其实还有两类:并发型模式和线程池模式。

2)java 单例模式是一种常见的设计模式,单例模式有以下特点:

  1. 单例类只能有一个实例。
  2. 单例类必须自己创建自己的唯一实例。
  3. 单例类必须给所有其他对象提供这一实例。

9.Java 访问控制权限

说说 Java 的几个访问控制权限?

Java 中的访问控制权限有 4 种,按照权限从大到小依次为:public->protected ->包访问权限(没有权限修饰词)->private。

(1)使用 public 关键字,就意味着被声明的成员或方法对所有人都是可以访问的。

(2)protected 也提供包访问权限,也就是说,派生类以及相同包内的其他类都可以访问 protected 成员或方法。例如:子类继承父类后可以访问父类的 protected 成员。

(3)使用 private 关键字,就意味着被声明的成员或方法,除了本类,其他任何类都无法访问。

10.hashmap 与 hashTable 的区别与优缺点

Hash Map、HashTable的区别及其优缺点?

1)Hash Map 不是线程安全的。HashMap 是 map 接口的子类,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值。Hash Map 允许 null key 和 null value,而 hashtable 不允许。

2)HashTable 是线程安全。Hash Map 是Hashtable 的轻量级实现(非线程安全的实现),他们都完成了Map 接口,主要区别在于HashMap 允许空(null)键值(key),由于非线程安全,效率上可能高于 Hashtable。

3)Hash Map 允许将 null 作为一个 entry 的 key 或者 value,而 Hashtable 不允许。Hash Map 把 Hashtable 的 contains 方法去掉了,改成 containsvalue 和 containsKey。因为 contains 方法容易让人引起误解。Hashtable 继承自 Dictionary 类,而 Hash Map 是Java1.2 引进的 Map interface 的一个实现。最大的不同是,Hashtable 的方法是 Synchronize 的,而 Hash Map 不是,在多个线程访问 Hashtable 时,不需要自己为它的方法实现同步,而 HashMap 就必须为之提供外同步。Hashtable 和 Hash Map 采用的 hash/rehash 算法都大概一样,所以性能不会有很大的差距。

11.ArrayList 和 LinkedList 的区别

ArrayList 和 Linked List 的区别?

1)ArrayList、Vector 是实现了基于动态数组的数据结构,LinkedList 基于链表的数据结构。

2)对于随机访问 get 和 set,ArrayList 觉得优于 LinkedList,因为 LinkedList 要移动指针。对于新增和删除操作 add 和 remove,LinedList 比较占优势,因为 ArrayList 要移动数据。

3)ArrayList,Linked List 是不同步的,而 Vestor 是同步的。所以如果不要求线程安全的话,可以使用 ArrayList 或 LinkedList,可以节省为同步而耗费的开销。但在多线程的情况下,有时候就不得不使用Vector了。当然,也可以通过一些办法包装ArrayList,LinkedList,使他们也达到同步,但效率可能会有所降低。

12.Java 中的重写和重载的区别

Java 中的重写和重载的区别?

重写方法的规则:

1、参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载。
2、返回的类型必须一直与被重写的方法的返回类型相同,否则不能称其为重写而是重载。
3、访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)
4、重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。例如:父类的一个方法申明了一个检查异常IOException,在重写这个方法是就不能抛出 Exception,只能抛出IOException 的子类异常,可以抛出非检查异常。

重载的规则:

1、必须具有不同的参数列表;
2、可以有不责骂的返回类型,只要参数列表不同就可以了;
3、可以有不同的访问修饰符;4、可以抛出不同的异常;重写与重载的区别在于:重写多态性起作用,对调用被重载过的方法可以大大减少代码的输入量,同一个方法名只要往里面传递不同的参数就可以拥有不同的功能或返回值。

13.内存泄漏和内存溢出

内存泄漏和内存溢出有什么区别?

内存溢出:out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现 out of memory;比如申请了一个 integer,但给它存了long 才能存下的数,那就是内存溢出。

内存泄露:memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。memory leak会最终会导致out of memory!在 C/C++中可能会出现这类问题。

 

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

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

相关文章

VUE实现简单留言板(Timeline+infinite scroll+Springboot+Hibernate)

先贴出效果图: 留言按照倒序排列。在底部的文本框内输入留言后,点击“留言”按钮,留言将保存至数据库中,同时刷新网页,新留言出现在顶部。 当滚动条到底部时,自动调用加载函数,显示更多早期留…

Java基础(3)

Java 数据类型详解 九、运算符 1. 基本运算符 Java 提供了多种运算符来执行不同的操作: 算术运算符:(加)、-(减)、*(乘)、/(除)、%(取模&…

电力场景红外测温图像绝缘套管分割数据集labelme格式2436张1类别

数据集格式:labelme格式(不包含mask文件,仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数):2436 标注数量(json文件个数):2436 标注类别数:1 标注类别名称:["arrester"] 每个类别标注的框数&am…

降维算法:主成分分析

主成分分析 一种常用的数据分析技术,主要用于数据降维,在众多领域如统计学、机器学习、信号处理等都有广泛应用。 主成分分析是一种通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量(即主成分)的方法。这些主…

深入解析 C++17 中的 u8 字符字面量:提升 Unicode 处理能力

在现代软件开发中,处理多语言文本是一个常见需求,特别是在全球化的应用场景下。C17 标准引入的 u8 字符字面量为开发者提供了一个强大的工具,以更有效地处理和表示 UTF-8 编码的字符串。本文将详细探讨 u8 字符字面量的技术细节、实际应用&am…

ElasticSearch索引别名的应用

个人博客:无奈何杨(wnhyang) 个人语雀:wnhyang 共享语雀:在线知识共享 Github:wnhyang - Overview Elasticsearch 索引别名是一种极为灵活且强大的功能,它允许用户为一个或多个索引创建逻辑上…

Java高频面试之SE-15

hello啊,各位观众姥爷们!!!本牛马baby今天又来了!哈哈哈哈哈嗝🐶 String 怎么转成 Integer 的?它的原理是? 在 Java 中,要将 String 转换为 Integer 类型,可…

2024又是一年的CSDN之旅-总结过去展望未来

一、前言 一年就这样在忙忙碌碌的工作和生活中一晃而过,总结今年在CSDN上发表的博客,也有上百篇之多,首先感谢CSDN这个平台,能让我有一个地方记录工作中的点点滴滴,也在上面学到了不少知识,解决了工作中遇到…

c86机器安装nvaid显卡驱动报错:ERROR:Unable to load the kernel module ‘nvidia.ko‘.

背景: 最近小伙伴要去北京甲方现场搭建我们的AI编码服务,需要使用GPU机器跑大模型,根据现场提供的信息是2台C86的机器,显卡够够的,但是现场是内网环境,因此,需要先准备好需要的安装包&#xff…

LeetCode 热题 100_实现 Trie (前缀树)(54_208_中等_C++)(图;前缀树;字典树)

[TOC](LeetCode 热题 100_实现 Trie (前缀树)(54_208)) 题目描述: Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景&…

【Maui】视图界面与数据模型绑定

文章目录 前言一、问题描述二、解决方案三、软件开发(源码)3.1 创建模型3.2 视图界面3.3 控制器逻辑层 四、项目展示 前言 .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架,用于使用 C# 和 XAML 创建本机移动和桌面应用。 使用 .NET MAUI&…

从 Spark 到 StarRocks:实现58同城湖仓一体架构的高效转型

作者:王世发,吴艳兴等,58同城数据架构部 导读: 本文介绍了58同城在其数据探查平台中引入StarRocks的实践,旨在提升实时查询性能。在面对传统Spark和Hive架构的性能瓶颈时,58同城选择StarRocks作为加速引擎&…

探秘 Linux 进程状态:解锁系统运行的密码

🌟 快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。🌟 🚩用通俗易懂且不失专业性的文字,讲解计算机领域那些看似枯燥的知识点🚩 在 Linux 系统…

深度学习-89-大语言模型LLM之AI应用开发的基本概念

文章目录 1 什么是智能体(Agent)2 什么是大语言模型(LLM)2.1 LLM的训练及使用2.2 Transformer架构2.3 基于LLM的Agent框架3 什么是检索增强生成(RAG)3.1 RAG是什么3.2 生成式AI应用开发3.3 RAG的整体流程3.4 RAG技术3.4.1 简单RAG(Simple RAG)3.4.2 校正RAG(Corrective RAG)3.4…

鸿蒙产业学院正式揭牌!软通动力与深信息签署校企合作框架协议

12月27日,深圳信息职业技术学院(简称“深信息”)与软通动力信息技术(集团)股份有限公司(简称“软通动力”)正式签署校企合作框架协议,并共同揭牌成立鸿蒙产业学院。深信息校长王晖&a…

python轻量级框架-flask

简述 Flask 是 Python 生态圈中一个基于 Python 的Web 框架。其轻量、模块化和易于扩展的特点导致其被广泛使用,适合快速开发 Web 应用以及构建小型到中型项目。它提供了开发 Web 应用最基础的工具和组件。之所以称为微框架,是因为它与一些大型 Web 框架…

2024年河北省职业院校技能大赛 “信息技术应用创新赛项”(高职组)样题解法

​有问题请留言或主页私信咨询 2024年河北省职业院校技能大赛 “信息技术应用创新赛项”(高职组)样题 一、初始化环境 1.账号及默认密码如表1所示。 表1 账号及密码规划表 账 号密 码root(服务端)kylin2024!desk&#xff08…

gozero获取数据库内容报错解决方案与实践

这个错误通常出现在 Go 语言的数据库查询中,表示你尝试将一个不支持的数据类型([]uint8,即字节切片)存储到一个 Go 类型(*time.Time)中。具体来说,create_time 列的类型可能是 DATETIME 或 TIME…

【学习笔记15】如何在非root服务器中,安装属于自己的redis

一、下载安装包 官网下载黑马程序员给的安装包(redis-6.2.6) 二、将安装包上传至服务器 我将安装包上传在我的文件夹/home/XXX,指定路径中/src/local/redis/,绝对路径为/home/XXX/src/local/redis/解压安装包 XXXomega:~$ cd …

PotPlayer 配置安装

文章目录 一、下载1、官网链接2、微软商店 Microsoft Store 二、安装1、双击安装包2、选择字体3、安装向导下一步4、接收许可协议5、选择组件及关联6、选择安装位置7、硬解选项 三、设置1、关闭自动更新2、左键单双击设置3、视频下自动隐藏3.1、效果对比 4、播放信息显示设置4.…