java基础面试题笔记(基础篇)

网上始终找不到令自己满意的面试题,所以我打算自己整理面试题,从简单的到难的,尽量简单准确描述回答降低大家理解和背的难度,有错误或者有更好的回答请在评论回复我,感谢大家。


什么是java?

回答:Java是一种高级编程语言。(可以多说一说)


java的主要特点(优点)有什么?

回答:跨平台性、面向对象、多线程、安全性、动态性等(说几个后可能就某一个继续问,一般是提问面向对象)


什么是面向对象?

回答:它将现实世界中的实体抽象为对象,通过对象之间的交互来设计和构建软件系统。(最好回答三大特性)


面向对象的三大特性是什么?

回答:封装、继承、多态(可能就某一个继续问)


JDK和JRE的区别? 

回答:

  • JDK:Java开发工具包,用于开发Java应用程序。它提供了编译、调试和运行Java程序所需的所有工具和库。
  • JRE:Java运行时环境,用于运行Java应用程序。它提供了运行Java程序所需的最小环境和库。

JDK是为Java开发者准备的,包含了编译、调试和运行Java程序所需的所有工具和库,而JRE是为最终用户准备的,只包含了运行Java程序所需的最小环境和库。

(如果可以把俩者包含的内容也记住:

  • JDK
    • javac:Java编译器,用于将Java源代码编译成字节码。
    • java:Java运行时工具,用于运行编译后的Java程序。
    • javadoc:生成API文档的工具。
    • jdb:Java调试器,用于调试Java程序。
    • 各种其他工具,如jar(打包工具)、javadoc(生成文档的工具)等。
    • Java核心类库(也称为Java标准类库)。
  • JRE
    • Java虚拟机(JVM),负责执行Java字节码。
    • Java核心类库,但通常不包括开发工具。
    • 用于运行Java应用程序的必需文件和设置。


java有几种基本数据类型,有哪些?

回答:有八种:byte,short,int,long,float,double,char,boolean.

技巧:整型数字类型从小往大背(byte,short,int,long),然后浮点型数字(float,double),布尔类型很容易记住,char容易忘。取值范围的话,就是:“正负字节×8-1(char只有正)”字节大小按顺序分别为:1,2,4,8,4,8,2。默认值也需要记住。String字符串是引用类型别记错了。


 boolean占多少字节?

回答:‌

单独使用时‌:在Java虚拟机中,boolean类型单独使用时通常会被映射为int类型,占用4个字节。‌在数组中使用时‌:当boolean类型作为数组元素时,每个元素占用1个字节。

其他知识点也需要记:

  1. boolean数组可以通过循环来初始化为所有元素都为false
  2. boolean类型不能与整数类型互相转换。
  3. boolean不能参与数值运算,不能与其他类型进行强制类型转换。
  4. 不能将0或1赋值给boolean类型的变量,也不能与0或1之间相互转换。

基本数据类型和引用数据类型的区别?

回答:

  • 基本数据类型:通过值传递,方法内部对参数的修改不会影响外部变量的值。
  • 引用数据类型:通过引用传递,方法内部对参数对象的修改会影响外部对象。
  • 基本数据类型:变量名指向具体的数值。
  • 引用数据类型:变量名指向存数据对象的内存地址,即变量名指向hash值。


什么是值传递什么是引用传递?

回答:

1.值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参 数的值。

2.引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。


为什么要用包装类?

回答:

1.面向对象要求:Java 是一门面向对象的编程语言,要求所有的数据都应该是对象。但是,基本数据类型(如int、char、double等)并不是对象,它们没有成员方法和其他面向对象的特性。为了满足面向对象编程的要求,Java 引入了包装类,将基本数据类型封装成对象,使得它们也具有面向对象的特性。(java基本都是类,一切皆对象,包装类也是为了这个出的)
泛型要求:泛型是 Java 中很重要的特性,它提供了类型安全和代码重用的功能。但是泛型要求类型参数必须是对象类型,不能是基本数据类型。因此,如果想在泛型中使用基本数据类型就需要使用对应的包装类。
3.null 值表示:包装类可以表示 null值,而基本数据类型不能。这在某些场景下很有用,比如在接口传参中,如果使用包装类及时前端不传参也不会报错,而使用基本数据类型,如果前端忘记传参就会报错。


基本类型和包装类的区别?

回答:

  1. 包装类变量必须实例化后才能使用,而基本类型不需要
  2. 包装类实际是对象的引用,当new一个包装类时,实际上是生成一个指针指向此对象;而基本类型则是直接存储数据值
  3. 包装类型的默认值是null,基本类默认值不能为null。

其他区别:

数据类型

基本类型:包括byte、short、int、long、float、double、char和boolean等8种基本数据类型。它们是直接存储数据值的,不具有方法和属性。
包装类:对应于每种基本类型,Java提供了相应的包装类,例如Byte、Short、Integer、Long、Float、Double、Character和Boolean等。包装类是引用类型,它们包装了对应基本类型的值,并提供了一些方法和属性来操作这些值。
对象和存储

基本类型:基本类型的变量直接存储在栈中,它们的值是直接存储的,没有指向其他对象的引用。
包装类:包装类是对象,存储在堆中,当创建包装类对象时,会在堆中分配内存,并将基本类型的值封装到包装类中。
性能

基本类型:由于基本类型直接存储值,因此处理速度更快,占用内存较少。
包装类:由于包装类是对象,需要额外的内存开销,并且在自动装箱和拆箱过程中会涉及到一些性能消耗。


 什么是装箱和拆箱?

回答:

  1. 装箱:将基本类型转换成包装类对象
  2. 拆箱:将包装类对象转换成基本类型的值


“==”和"equals"的区别? 

回答:

==:
如果比较的是基本数据类型,那么比较的是变量的值

如果比较的是引用数据类型,那么比较的是地址值(两个对象是否指向同一块内存)

equals:
如果没重写equals方法比较的是两个对象的地址值

如果重写了equals方法后我们比较的是对象中的属性的内容

equals方法是从Object类中继承的,默认的实现就是使用==


为什么重写equals()时,必须重写hashCode()?

回答:保证同一对象,如果不重写hashcode,可能会出现equals比较一样,但是hashcode不一样的情况

两个对象使用equals比较相同,hashCode一定相同

hashCode相同,equals()比较不一定相同,可能出现hash冲突

hashCode不同,equals()一定不同

为什么重写equals()时一定要重写hashCode()?_重写equals方法必须要重写hascode吗-CSDN博客


重载和重写的区别
回答:重载:发生在同一类中,函数名必须一样,参数类型、参数个数、参数顺序、返回值、修饰符可以不一样。
重写: 发生在父子类中,函数名、参数、返回值必须一样,访问修饰符必须大于等于父类,异常要小于等于父类,父类方法是private不能重写。(俩同俩大一小)

  1. 两同‌:

    • 方法名相同‌:子类中的方法名必须与父类中的方法名完全相同。
    • 参数列表相同‌:子类方法的参数列表必须与父类方法的参数列表完全相同,包括参数的类型和顺序。
  2. 两小‌:

    • 返回值类型小于等于父类‌:子类方法的返回值类型必须小于或等于父类方法的返回值类型。具体规则如下:
      • 如果父类方法的返回类型是void,则子类方法的返回类型也必须是void
      • 如果父类方法的返回类型是基本数据类型(如intfloat等),则子类方法的返回类型也必须是相同的基本数据类型。
      • 如果父类方法的返回类型是引用数据类型,则子类方法的返回类型可以是父类返回类型的子类或相同的类型‌。
    • 异常声明小于等于父类‌:子类方法抛出的异常必须小于或等于父类方法抛出的异常。这意味着子类方法不能抛出父类方法没有声明的异常,或者抛出更广泛的异常‌。
  3. 一大‌:

    • 访问权限大于等于父类‌:子类方法的访问权限必须大于或等于父类方法的访问权限。访问权限从小到大依次为:private < 默认 < protected < public。因此,如果父类方法是默认访问权限,子类重写的方法可以是默认、protected或public,但不能是private‌。

 接口和抽象类的区别?

回答:

  1. 继承数量的限制

    • 抽象类(Abstract Class)只能被单继承,即一个类只能继承一个抽象类。
    • 接口(Interface)则可以被多重实现,一个类可以实现多个接口。
  2. 构造方法

    • 抽象类可以有构造方法,这些构造方法可以被同一类层次结构中的子类调用。
    • 接口在Java 8之前不能有构造方法,但可以从Java 9开始,接口可以有私有构造方法,仅限于静态成员的创建。
  3. 实例变量和常量

    • 抽象类可以包含实例变量和静态变量。
    • 接口在Java 8之前只能包含静态常量和抽象方法。从Java 8开始,接口可以包含默认方法(非抽象方法)和静态方法。
    • 从Java 9开始,接口可以包含私有方法。
  4. 方法的实现

    • 抽象类可以包含非抽象方法(即具体实现的方法)和抽象方法。
    • 接口在Java 8之前只能包含抽象方法。从Java 8开始,接口可以包含默认方法(有具体实现的方法)和静态方法。
  5. 方法的修饰符

    • 抽象类中的方法可以有任意访问修饰符(public, protected, private)。
    • 接口中的方法在Java 8之前默认是public的,不能有其他修饰符。从Java 9开始,接口中的方法可以是private的。
  6. 字段的修饰符

    • 抽象类中的字段可以有任意访问修饰符。
    • 接口中的字段默认是public static final的,即它们是公共的、静态的、最终的常量。
  7. 设计目的

    • 抽象类用于表示一个不完整的类,它通常作为基类使用,定义一组相关功能的框架。
    • 接口用于定义一个类的行为规范,它是一种形式的契约,规定实现类必须遵守的规则。
  8. 多继承解决方案

    • 由于Java不支持类的多继承,但可以通过实现多个接口来解决多继承问题,这是接口相比抽象类的一个重要优势。
  9. 实例化

    • 抽象类不能被实例化,但可以声明抽象类类型的引用指向子类的实例。
    • 接口也不能被实例化,但可以声明接口类型的引用指向实现接口的类的实例。

静态变量和实例变量有什么区别

回答:(笔试题也容易出题考)

  1. 所属范围

    • 静态变量:也称为类变量,它们属于类本身,而不是类的某个特定实例。因此,静态变量在类加载时就被创建,并且在整个JVM中只有一个副本,所有实例共享这个变量。
    • 实例变量:也称为非静态变量,它们属于类的特定实例。每个对象实例都有自己的一份实例变量的副本,不同实例之间互不影响。
  2. 内存分配

    • 静态变量:在Java堆的方法区(Java 8及以前)或元数据区(Java 9及以后)中分配内存,因为它们是与类关联的,而不是与对象实例关联的。
    • 实例变量:在Java堆的新生代中为每个对象实例分配内存。每个对象实例都有自己的实例变量副本。
  3. 生命周期

    • 静态变量:生命周期与类的生命周期相同,从类加载开始,到类被卸载结束。
    • 实例变量:生命周期与对象实例的生命周期相同,从对象创建开始,到对象被垃圾回收结束。
  4. 访问方式

    • 静态变量:可以通过类名直接访问,也可以通过实例访问,但推荐通过类名访问,以表明其静态性质。
    • 实例变量:只能通过对象实例访问。
  5. 初始化时机

    • 静态变量:在类加载时初始化,即在任何对象创建之前就已经初始化。
    • 实例变量:在对象创建时初始化,可以在声明时初始化,也可以在构造函数中初始化。
  6. 线程安全

    • 静态变量:由于所有实例共享同一个静态变量,因此需要特别注意线程安全问题。
    • 实例变量:由于每个实例都有自己的副本,天然具有线程安全性。

finally、final、finalize区别

回答:

1.final可以修饰类、变量、方法,修饰类表示该类不能被继承、修饰方法表示该方法不能被重写、修饰变量表示该变量是一个常量不能被重新赋值。
2.finally一般作用在try-catch代码块中,在处理异常的时候,通常我们将一定要执行的代码方法finally代码块中,表示不管是否出现异常,该代码块都会执行,一般用来存放一些关闭资源的代码。
3.finalize是一个方法,属于Object类的一个方法,而Object类是所有类的父类,该方法一般由垃圾回收器来调用,当我们调用System.gc() 方法的时候,由垃圾回收器调用finalize(),回收垃圾,一个对象是否可回收的最后判断。


String、StringBuffer、StringBuilder的区别

回答:

String类是不可变的,即一旦创建,其值就不能被改变。每次对字符串进行修改操作时,实际上都会生成一个新的String对象。

StringBufferStringBuilder允许在原有对象上进行操作,这意味着它们可以修改对象的值而不创建新的对象

StringBuffer是线程安全的(StringBuffer的方法都是用synchronized关键字修饰的,确保了线程安全。),这意味着它的方法是同步的,可以在多线程环境中安全使用。StringBuilder不是线程安全的,它的方法没有同步,因此在多线程环境中使用时可能会导致问题。

在性能方面,StringBuilder>StringBuffer>String。这是因为StringBuilder不涉及线程安全的开销,StringBuffer虽然有线程安全的开销,但比每次操作都创建新对象的String要高效。


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

编译 LLVM 源码,使用 Clion 调试 clang

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 1. LLVM 简介 LLVM 是一个开源的编译器基础架构&#xff0c;最初由 Chris Lattner 于 2000 年在伊利诺伊大学开发&#xff0c;后来成为一个广泛应用于编译器和…

[代码随想录打卡Day22] 理论基础 77. 组合 216.组合总和III 17.电话号码的字母组合

理论基础 有递归就有回溯。回溯搜索是一种纯暴力搜索算法。我们一层一层递归到最底层收获结果&#xff0c;比如下面我们最后一层1操作之后&#xff0c;我们只有撤销这个操作回退到上一个节点才能遍历该层的其他节点&#xff0c;这个回退撤销操作就是回溯。 回溯法&#xff0…

大模型工程化部署:使用FastChat部署基于OpenAI API兼容大模型服务

FastChat是加州大学伯克利分校LM-SYS发布的一个用于训练、服务和评估基于大型语言模型的聊天机器人的开放平台。 项目地址&#xff1a;https://github.com/lm-sys/FastChat.git 其核心功能包括&#xff1a; 最先进 LLM 模型的权重、训练代码和评估代码。 带有 WebUI 和与 Op…

102.【C语言】数据结构之用堆对数组排序

0.前置知识 向上调整: 向下调整: 1.对一个无序的数组排升序和降序 排升序问题 建大根堆还是小根堆? 错误想法 由小根堆的定义:树中所有的父节点的值都小于或等于孩子节点的值,这样排出来的数组时升序的,建小根堆调用向上调整函数即可(把画圈的地方改成<即可) arr未…

彻底理解微服务的作用和解决方案

一.微服务有什么好处&#xff1f; 微服务优点很多&#xff0c;但是我们通常说一个东西好肯定会跟另一个东西比较&#xff0c;通常说微服务好会和单体项目进行比较&#xff0c;通常情况下微服务都是从单体项目拆分而来的&#xff0c;但是对于有些大型公司&#xff0c;不差钱&…

Harbor安装、HTTPS配置、修改端口后不可访问?

Harbor安装、HTTPS配置、修改端口后不可访问&#xff1f; 大家好&#xff0c;我是秋意零。今天分享Harbor相关内容&#xff0c;安装部分可完全参考官方文档&#xff0c;写的也比较详细。 安装Harbor 官方文档&#xff1a;https://goharbor.io/docs/2.12.0/install-config/ …

表单校验规则

这里简单记录下vue使用表单时候&#xff0c;给表单添加校验规则&#xff0c;直接上代码 <script setup>import { ref } from vue// 定义表单对象const form ref({account: ,password: ,agree: true})// 定义表单验证规则const rules {account: [{required: true, mess…

spf算法、三类LSA、区间防环路机制/规则、虚连接

1.构建spf树&#xff1a; 路由器将自己作为最短路经树的树根根据Router-LSA和Network-LSA中的拓扑信息,依次将Cost值最小的路由器添加到SPF树中。路由器以Router ID或者DR标识。广播网络中DR和其所连接路由器的Cost值为0。SPF树中只有单向的最短路径,保证了OSPF区域内路由计管不…

电子电气架构 -- ASIL D安全实现策略

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 所有人的看法和评价都是暂时的&#xff0c;只有自己的经历是伴随一生的&#xff0c;几乎所有的担忧和畏惧…

【Unity ShaderGraph实现流体效果之Function入门】

Unity ShaderGraph实现流体效果之Node入门&#xff08;一&#xff09; 前言Shader Graph NodePosition NodeSplit NodeSubtract NodeBranch Node 总结 前言 Unity 提供的Shader Graph在很大程度上简化了开发者对于编写Shader的工作&#xff0c;只需要拖拽即可完成一个视觉效果…

uniop触摸屏维修eTOP40系列ETOP40-0050

在现代化的工业与商业环境中&#xff0c;触摸屏设备已成为不可或缺的人机交互界面。UNIOP&#xff0c;作为一个知名的触摸屏品牌&#xff0c;以其高性能、稳定性和用户友好性&#xff0c;广泛应用于各种自动化控制系统、自助服务终端以及高端展示系统中。然而&#xff0c;即便如…

SpringMVC——简介及入门

SpringMVC简介 看到SpringMVC这个名字&#xff0c;我们会发现其中包含Spring&#xff0c;那么SpringMVC和Spring之间有怎样的关系呢&#xff1f; SpringMVC隶属于Spring&#xff0c;是Spring技术中的一部分。 那么SpringMVC是用来做什么的呢&#xff1f; 回想web阶段&#x…

小白学多线程(持续更新中)

1.线程池技术 1.JDK中的线程池 JDK中创建线程池有一个最全的构造方法&#xff0c;里面七个参数如上所示。 执行流程分析&#xff1a; 模拟条件&#xff1a;10个核心线程数&#xff0c;200个最大线程数&#xff0c;阻塞队列大小为100。 当有小于十个任务要处理时&#xff0c…

UNity将脚本中的文本提示显示在编辑器中

正常情况下我们创建了一个脚本然后挂载到一个对象上只能看到这样的一个面板 如果我们想在编辑器里面添加一段提示就可以这样做 [Header("玩家的基本信息")] 然后就能在编辑器窗口中看到添加的提示了 注意&#xff1a;当参数少的时候确实没必要这样做&#xff0c;但…

数据结构 (8)线性表的应用——一元多项式的表示及应用

一、一元多项式的定义 一元多项式是代数学研究的基本对象之一&#xff0c;可以表示为&#xff1a; P_n(x) p_0 p_1x p_2xn 其中&#xff0c;p_0, p_1, ..., p_n 是数域 F 中的数&#xff0c;n 是非负整数&#xff0c;x 是变量。 二、一元多项式的线性表表示 在计算机中&…

【山大9009算法题】2015-T1

文章目录 1.原题2.算法思想3.关键代码4.完整代码5.运行结果 1.原题 线性表使用公式化描述方式存储。编写一个函数&#xff0c;从一给定的线性表A中删除值在x ~ y&#xff08;x到y&#xff0c;x<y&#xff09;之间的所有元素&#xff0c;要求以较高的效率来实现。提示&#…

【Mac】VMware Fusion Pro 安装 CentOS 7

1、下载镜像 CentOS 官网阿里云镜像网易镜像搜狐镜像 Mac M1芯片无法直接使用上述地址下载的最新镜像&#xff08;7.9、9&#xff09;&#xff0c;会一直卡在安装界面&#xff08;在 install 界面按 enter 回车无效&#xff09;&#xff0c;想要使用需要经过一系列操作&#…

机器学习周志华学习笔记-第5章<神经网络>

机器学习周志华学习笔记-第5章<神经网络> 卷王&#xff0c;请看目录 5模型的评估与选择5.1 神经元模型5.2 感知机与多层网络5.3 BP(误逆差)神经网络算法 5.4常见的神经网络5.4.1 RBF网络&#xff08;Radial Basis Function Network&#xff0c;径向基函数网络&#xff0…

MT8768/MTK8768安卓核心板性能参数_联发科安卓智能模块开发方案

MT8768安卓核心板 是一款采用台积电12nm FinFET制程工艺的智能手机芯片。MT8768核心板不仅提供所有高级功能和出色体验&#xff0c;同时确保智能终端具备长电池寿命。该芯片提供了一个1600x720高清(20:9比例)分辨率显示屏&#xff0c;排除了清晰度和功耗之间的平衡问题。该芯片…

Linux之SELinux与防火墙

一、SELinux的说明 开发背景与目的&#xff1a; SELinux由美国国家安全局&#xff08;NSA&#xff09;开发&#xff0c;旨在避免资源的误用。传统的Linux基于自主访问控制&#xff08;DAC&#xff09;&#xff0c;通过判断进程所有者/用户组与文件权限来控制访问&#xff0c;对…