当前位置: 首页 > news >正文

Java基础面试重点-1

0. 符号:

@*@:记忆模糊,验证后特别标注的知识点。

@&@:容易忘记知识点。

*:重要的知识点。

1. 简述一下Java面向对象的基本特征(四个),以及你自己的应用?

  • 抽象:是将一类对象的共同特征总结出来构造类的过程。
  • 继承:基本概念解释,继承是多态的条件。
  • 封装:基本概念解释,侧重:隐藏实现细节、公开使用方式 。
  • 多态:是指不同子类对象对同一消息做出不同的响应。本质就是处理参数,多态符合里氏替换原则、接口打破单继承 。[必要条件:继承、重写、对象上转型。实现方式:接口实现、继承重写,同类重载]

应用体现:

        设计原则、设计模式

2. 程序的设计原则(六原则一法则):

  • 单一职责原则:每个类都应该只有一个职责,类只关注自身的职责。
  • 开闭原则:对功能的拓展开放,对修改关闭的原则。
  • 里氏代换原则:对继承关系中子类限制的描述。父类出现的地方,子类就能出现。子类出现的地方,父类未必能出现。
  • 依赖倒置原则:尽量依赖上层的接口和抽象类,不要依赖具体实现类。
  • 接口隔离原则:单一接口,功能专一。
  • 合成/聚合复用原则:优先使用聚合或合成关系复用代码。
  • 最小知道法则:一个对象应当对其他对象有尽可能少的了解(低耦合)。

拓展点:

        合成与聚合的区别(UML):合成是一种强依赖的特殊聚合,如果整体不存在了,则部分也不存在了;例如, 公司不存在,则部门也将不存在

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

  • 说一下概念
  • Tips:
    • 重载返回值类型必须相同(@*@ )
    • 重载:参数个数与参数类型均相同的方法只能有一个。

拓展点:

        构造器可以重载,但是不可以重写,因为一个类的构造器不能被继承,所以它不能被重写。

4. final、finally和finalize的理解:

  • final 修饰变量(局部变量、修饰参数列表、成员变量),不能被修改,一般修饰静态成员变量。
  • final 修饰方法,不能被重写。
  • final 修饰类,不能被继承。
  • 局部内部类中,使用的变量得是final修饰的,JDK1.8中可以省略final,但是不能产生实际上的修改。
  • --- ---
  • finally是异常处理中的一个关键字,作用是定义一些无论异常是否出现都会执行的代码。
  • --- ---
  • finalize():垃圾收集器在销毁对象时调用,通过重写finalize()方法,可以整理系统资源或者执行其他清理工作。

拓展点:

finally语句块中应该尽量避免使用return返回结果,它会吞掉异常信息。原因:finally语句块中的return/抛出异常的优先级最高,程序会优先返回finally语句块中的立即结束语句的结果,此时try-catch语句块中的return/抛出异常(立即结束语句)的结果无效。

5. 怎样声明一个类不会被继承,什么场景下会用?

  • final修饰的类不能有子类,大部分都是出于安全考虑。例如String类。
  • ---- ----
  • 接口不能继承一般类。

6. 接口和抽象类的区别?

  • 相同:
    • 抽象类和接口都不能被实例化。(@&@ 20230129)
  • 不同点:
    • 抽象类(abstract),接口(interface);
    • 抽象类可有部分方法的实现,接口则不可以有(JDK1.8可以);
    • 抽象类可有构造方法,接口不可以;
    • 抽象类是单继承(java中的类都是单继承),接口可以多继承接口;
    • 抽象类的属性和方法可以使用private、默认、protected、public修饰符

7. equals()和==区别?为什么重写equal要重写hashcode?

区别:

  • == 是运算符;equals是Object类的方法。
  • == 用于基本数据类型和引用类型;equals只能用于引用类型。
  • --- ---
  • == 两端是基本数据类型,就是判断值是否相同。
  • equals在重写之后,判断两个对象的属性值是否相同。equals如果不重写,其实就是 ==

为什么重写equal要重写hashcode?

  • 首先源码注释要求:如果根据 equals(Object) 方法判断是相等的,这两个对象中的每个对象调用hashCode()的哈希值必须相等。
  • 具体原因:hashCode()生成哈希码目的,就是保证同一个类的不同对象的哈希值是不相同的。如果不重写hashCode(),会出逻辑上认为是同一个对象,但是Hash码却不相同。
  • 此外(可以不提):重写hashcCode()后,可以自定义哈希码的生成规则,可以通过对象的属性值计算出哈希码。

8. 描述一下Object类中常用的方法?

  • toString、hashCode、equals、clone(需要实现cloneable接口)、finalized(GC自救)、wait、notify、notifyAll。
  • 注意要解释每个方法的作用。

9. 代码块以及代码块和构造方法的执行顺序

代码块分类(四种):(@&@)

  • 普通代码块:类中方法的方法体。
  • 构造代码块:类中的"{}",对象每次实例化时执行一次。
  • 静态代码块:类中的"static{}",类加载的时执行一次。
  • 同步代码块:"用synchronized() {}"。

执行顺序原则:

  • 先父类,后子类。
  • 先静态,后普通。
  • 先(静态)成员变量,后(静态)代码块,最后构造方法。

10. 什么是序列化?

  • 概念:把对象转换为字节序列的过程。
  • 用途:
    • 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中。
    • 在网络上传送对象的字节序列。
  • Tips:实体类都要实现序列化接口。

某些字段不想序列化怎么办:

        使用transient关键字修饰。

transient的作用是:

  • 阻止实例中那些用此关键字修饰的变量序列化。
  • transient只能修饰变量,不能修饰类和方法。

11. Java中的参数传递时传值呢?还是传引用?

概念:

值传递:是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。

引用传递:是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

Java是值传递:

Java中只有值传递,没有引用传递_java编程思想中的值传递与引用传递-CSDN博客

拓展点:

使用集合或Map作为方法入参,传递给多个方法时,注意方法内部对入参的修改,影响方法计算结果

12. 说一下反射,反射会影响性能吗?

在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。

反射这种运行时动态的功能可以说是非常重要的,可以说无反射不框架。

反射方式实例化对象和属性赋值和调用方法肯定比直接的慢,但是程序运行的快慢原因有很多,不能主要归于反射,如果你只是偶尔调用一下反射,反射的影响可以忽略不计。

反射使用:

... ... Field f = stuClass.getDeclaredField("字段名"); //获得私有字段 Object obj = stuClass.getConstructor().newInstance(); //获得对象 f.setAccessible(true);//暴力反射,解除私有限定 f.set(obj, "18888889999"); //赋值 ... ...

13. 内部类层次结构图:

14. 当子类构造方法使用this调用其它构造方法,就不能再调用父类的无参构造方法(super())?

  • 是的,this() 和super() 都必须是子类构造方法的第一行代码。
  • 然后介绍一下:this的三个作用。super的两个作用(调用父类的构造方法、调用父类的隐藏的成员变量和方法)
  • --- ---
  • 其实,子类的构造方法无论再怎么调用其它构造方法,最终都会调用到父类的构造方法(隐式调用)。

15. 为什么要求一个类必须显示的书写无参构造方法?

  • 方便子类继承:子类构造方法中,往往默认使用super()调用父类的无参构造方法,super()往往可以省略不写,但是父类中如果没有定义构造方法,子类中就要显示写出super()并传参数。
  • 反射创建对象,一般用无参构造方法。
  • 自定义构造方法时,程序员可能会忽略已经没有空参构造方法。

16. String、StringBuffer和StringBuilder的区别是什么?String为什么是不可变的?

可变性:

String类中使用final关键字修饰字符数组,所以不可变的。

private final char value[];

StringBuilder与StringBuffer都继承自AbstractStringBuilder类,没有用final关键字修饰字符数组,所以可变。

char[] value;

线程安全性:

  • String中的对象是不可变的,理解为常量,线程安全。
  • StringBuffer对方法加上同步锁,线程安全的。
  • StringBuilder并没有对方法加同步锁,线程不安全的。   

性能:

  • String进行改变时,都会生成一个新的String对象,然后将指针指向新的String对象。
  • StringBuffer每次都会对StringBuffer对象本身进行操作,而不是生成新的对象。
  • 相同情况下使用StringBuilder相比使用StringBuffer仅能获得 10%~15%左右的性能提升,但却要冒多线程不安全的风险。

使用总结:

  • 操作少量的数据 -> String
  • 单线程操作字符串缓冲区下操作大量数据 -> StringBuilder
  • 多线程操作字符串缓冲区下操作大量数据 -> StringBuffer

扩容机制(StringBuffer StringBuilder):

  • 新容量 = 旧容量 * 2 + 2
  • 为什么要进行+2 ? 防止初识容量为0

17. 包装类缓存问题(Integer)?

  • 1. Integer与new Integer不会相等。
  • 2. 两个都是非new出来的Integer,如果数在-128到127之间,则是true,否则为false。
  • 3. 两个都是new出来的Integer,都为false。
  • 4. Int和Integer(无论new否)比,都为true,因为会把Integer自动拆箱为int再去比。
  • --- ---
  • Integer i2 = 128在编译时,会Integer i2 = Integer.valueOf(128),即使用拆封箱的概念。
  • Integer 会把 -128 ~127的数组缓存在内存中,见静态内部类IntegerCache。
  • --- ---
  • 还有哪些包装类有缓存?
    • Byte short Long Integer Character 都有缓存。

18. 简述一下自定义异常的应用场景?

  • 说自己微服务定义的异常体系。

19. Java异常层次结构图:

20. 运行时异常和一般异常(受检异常,检查型异常)的区别是什么?

  • 运行时异常(RuntimeException):程序运行过程中,可能出现的异常,默认情况下,会自动处理(即不需要try-catch语句捕获和throws声明)[运行时异常是非受检异常]。
  • 受检异常(CheckedException):除了运行时异常以外,其它Exception类及其子类都属于受检异常。这种异常需要try-catch语句捕获和throws声明,否则编译不会通过。
  • 一般来讲,如果没有特殊的要求,我们建议使用RuntimeException异常。

相关文章:

Java基础面试重点-1

0. 符号: *:记忆模糊,验证后特别标注的知识点。 &:容易忘记知识点。 *:重要的知识点。 1. 简述一下Java面向对象的基本特征(四个),以及你自己的应用? 抽象&#…...

18. 四数之和 - 力扣

1. 题目 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复): 0 …...

[vue2]深入理解路由

本节目标 单页应用程序路由概念VueRouter基本使用组件分类存放路由模块封装声明式导航其他路由配置路由模式编程式导航案例-面经基础版 单页应用程序 单页应用程序(SPA): 所有的功能都在一个HTML页面上实现 网易云音乐: 网易云音乐 多页应用程序(MPA): 不同功能通过切换不同…...

搜维尔科技:SenseGlove为什么不同的手套尺寸对触觉技术至关重要

senseglove适当的尺寸可确保: 1.精确的运动跟踪:合适的手套保持部件稳定,防止不准确的运动跟踪 2.有效的力反馈:我们基于肌腱的力反馈系统通过对手套的绳子施加力来模拟肌肉的运动。不稳定的配合会影响反馈,使其感觉虚弱和柔软。 3.舒适性和敏感性:我…...

java算法:选择排序

文章标题 概述与基本实现优缺点尝试优化 概述与基本实现 选择排序(Selection Sort)是一种简单直观的排序算法。它的基本思想是每次从待排序的元素中选择最小(或最大)的元素,放置在已排序的部分的末尾,直到…...

helm升级部署时出现升级挂起状态处理

问题 在使用helm 升级命令时,升级命令如下: helm upgrade -i -f ./values-prod.yaml myapp ./ -n myns --create-namespace中途因为网络原因,再次运行上面升级命令时出现,如下错误: Error: UPGRADE FAILED: another …...

16、架构-可观测性-事件日志详细解析

事件日志 事件日志是记录系统运行期间发生的离散事件的关键工具。它们在系统的可观测性中起着至关重要的作用,帮助开发者和运维人员追踪、分析和解决系统问题。以下是对事件日志处理各个方面的详细解析,并结合具体的数据案例和技术支撑。 输出 日志输出…...

Java数据结构与算法(买卖股票的最佳时机二贪心算法)

前言 买卖股票最佳时机二,此时不限次数的买卖的要求获得的利益最大化。暴力算法依旧可行,可以参考之前的练习。 . - 力扣(LeetCode) 贪心算法原理参考:Java数据结构与算法(盛水的容器贪心算法)-CSDN博客 实现原理 1.定义最大…...

t265 坑

Streaming T265 video over USB 2.1 is unreliable, please use USB 3 or only stream poses 试着用windows 打开也是默认是USB2打开, 英伟达orin nx jetpack 也一样 不知道为啥。并且一旦打开飞控 microxrceagent , t265 的位置就飞。 配置ros2 的lau…...

【LLM之RAG】Adaptive-RAG论文阅读笔记

研究背景 文章介绍了大型语言模型(LLMs)在处理各种复杂查询时的挑战,特别是在不同复杂性的查询处理上可能导致不必要的计算开销或处理不足的问题。为了解决这一问题,文章提出了一种自适应的查询处理框架,动态选择最合…...

介绍react

什么是React React是一个用于构建用户界面的JavaScript库。 传统构建页面的方式 <script>document.getElementById(app).addEventListener(click, () > {console.log()});const div docuemnt.createElement(div)// ... </script> 早期&#xff0c;用JavaSc…...

网络爬虫概述

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 网络爬虫&#xff08;又被称为网络蜘蛛、网络机器人&#xff0c;在某社区中经常被称为网页追逐者&#xff09;&#xff0c;可以按照指定的规则&#…...

取证工作: SysTools SQL Log Analyzer, 完整的 SQL Server 日志取证分析

天津鸿萌科贸发展有限公司是 Systools 系列软件的授权代理商。 SysTools SQL Log Analyzer 是 Systools 取证工具系列之一&#xff0c;用于调查 SQL Server 事务日志&#xff0c;以对数据库篡改进行取证分析。 什么是 SQL Server 事务日志&#xff1f; 在深入研究 SQL 事务日…...

蓝牙耳机怎么连接电脑?轻松实现无线连接

蓝牙耳机已经成为许多人生活中不可或缺的一部分&#xff0c;不仅可以方便地连接手机&#xff0c;还能轻松连接电脑&#xff0c;让我们在工作和娱乐时享受无线的自由。然而&#xff0c;对于一些用户来说&#xff0c;将蓝牙耳机与电脑连接可能会遇到一些问题。本文将介绍蓝牙耳机…...

4.音视频 AAC SSAASS

目录 AAC 1.什么是ADIF和ADTS&#xff1f; 2.ADTS的数据结构是怎样的&#xff1f; SSA/ASS 1.SSA/ASS的基本结构 AAC AAC(Advanced Audio Coding&#xff0c;高级音频编码)是一种声音数据的文件压缩格式。AAC分为ADIF和ADTS两种文件格式。 1.什么是ADIF和ADTS&#xff…...

每日5题Day24 - LeetCode 116 - 120

每一步向前都是向自己的梦想更近一步&#xff0c;坚持不懈&#xff0c;勇往直前&#xff01; 第一题&#xff1a;116. 填充每个节点的下一个右侧节点指针 - 力扣&#xff08;LeetCode&#xff09; /* // Definition for a Node. class Node {public int val;public Node left;…...

在笔记本电脑上使用 LLMs 的 5 种方法

在网上使用 ChatGPT 很简单&#xff0c;只需有网络连接和好的浏览器即可。但这样做可能会泄露您的隐私和数据。OpenAI 存储了您的提示和其他元数据以重新训练模型。对于一些人来说可能不成问题&#xff0c;但注重隐私的人可能更愿意在本地使用这些模型&#xff0c;不受外部跟踪…...

Linux内存从0到1学习笔记(8.15 MMU/IOMMU/SMMU概览)

一, 什么是MMU? MMU(Memory Management Unit 内存管理单元),即内存管理单元,是计算机硬件中的一个重要组件,主要负责处理中央处理器(CPU)的内存访问请求。 其工作原理如下: 当程序发出内存访问请求,包括读取或写入操作以及逻辑地址(虚拟地址)。然后,MMU根据页表…...

Intellij IDEA中怎么配置Maven?

在IntelliJ IDEA中配置Maven非常简单&#xff0c;以下是详细步骤&#xff1a; 步骤1&#xff1a;安装Maven 首先确保你的计算机上已经安装了Maven。如果没有安装&#xff0c;你可以从Apache Maven官网下载并安装&#xff1a;https://maven.apache.org/download.cgi 步骤2&am…...

操作系统-内存管理

虚拟内存 操作系统会提供⼀种机制&#xff0c;将不同进程的虚拟地址和不同内存的物理地址映射起来。 两个概念&#xff1a; 程序所使⽤的内存地址叫做虚拟内存地址&#xff08;Virtual Memory Address&#xff09;实际存在硬件⾥⾯的空间地址叫物理内存地址&#xff08;Physi…...

C++中的解释器模式

目录 解释器模式&#xff08;Interpreter Pattern&#xff09; 实际应用 算术表达式解释器 布尔表达式解释器 总结 解释器模式&#xff08;Interpreter Pattern&#xff09; 解释器模式是一种行为设计模式&#xff0c;它定义了一种语言的文法表示&#xff0c;并使用解释器…...

用 C 语言实现求补码的运算

缘起 前两天程序中需要求一堆参数的补码&#xff0c;一时犯懒&#xff0c;想从CSDN上搜一个勉强能用的代码借鉴一下&#xff0c;结果几乎没有搜到一个靠谱的&#xff01;这种求补码的操作&#xff0c;用脚趾头想想也应该知道要用C或者C的位运算来实现呀。结果搜到的一些实现方…...

python下载文件

import urllib.request url "http://****/storage/x4MigEhU6BGAuTqjrRfIBky0S2aMmkyGl4UzTqUb.png"#下载地址 path "ddad.png"#保存路径&#xff0c;保存项目路径 urllib.request.urlretrieve(url, path)...

JMU 数科 数据库与数据仓库期末总结(1)

本章根据老师给出的知识点作进一步相对生动一点的解释。 不保证完全正确。 先给出总的知识点&#xff0c;再给出生动解释。 知识点 数据模型通常由三部分组成&#xff1a;数据结构、数据操作和完整性约束。关系模式中主码的取值必须唯一且非空&#xff0c;这是实体完整性的…...

前端问题整理

Vue vue mvvm&#xff08;Model-View-ViewModel&#xff09;架构模式原理 Model 是数据层&#xff0c;即 vue 实例中的数据View 是视图层&#xff0c; 即 domViewModel&#xff0c;即连接Model和Vue的中间层&#xff0c;Vue实例就是ViewModelViewModel 负责将 Model 的变化反映…...

【实践功能记录6】表格列悬浮展示tooltip信息

需求描述&#xff1a; 鼠标悬浮在表格的IP字段上时&#xff0c;使用tooltip展示IP信息&#xff0c;如图&#xff1a; 1.封装根据IP展示信息的组件 请求接口获取IP信息&#xff0c;注意请求接口时防抖 <!-- 根据IP展示资产信息 --> <template><div><el-…...

AI论文速读 | 2024[SIGIR]基于大语言模型的下一个兴趣点推荐

论文标题&#xff1a;Large Language Models for Next Point-of-Interest Recommendation 作者&#xff1a;Peibo Li ; Maarten de Rijke ; Hao Xue &#xff08;薛昊&#xff09;; Shuang Ao ; Yang Song ; Flora D. Salim 机构&#xff1a;新南威尔士大学(UNSW)&#xff0c…...

Rust 实战丨通过实现 json! 掌握声明宏

在 Rust 编程语言中&#xff0c;宏是一种强大的工具&#xff0c;可以用于在编译时生成代码。json! 是一个在 Rust 中广泛使用的宏&#xff0c;它允许我们在 Rust 代码中方便地创建 JSON 数据。 声明宏&#xff08;declarative macros&#xff09;是 Rust 中的一种宏&#xff0…...

vue+elementUI实现在表格中添加输入框并校验的功能

背景&#xff1a; vue2elmui 需求&#xff1a; 需要在一个table中添加若干个输入框&#xff0c;并且在提交时需要添加校验 思路&#xff1a; 当需要校验的时候可以考虑添加form表单来触发校验&#xff0c;因此需要在table外面套一层form表单&#xff0c;表单的属性就是ref…...

为国产加油:“缺芯少屏”暂缓,另一领域,也要加把劲

说起咱中国之前的“缺芯少屏”&#xff0c;真的是让人挺闹心的。 不过呢&#xff0c;为了改变这个状况&#xff0c;咱们的工程师们可是费了不少劲儿&#xff0c;辛辛苦苦努力了数十年。现在好了&#xff0c;咱们也迎来了柔性屏的时代。 柔性屏 说起来&#xff0c;在触摸屏或者…...