JAVA常见基础面试问题汇集

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: `Welcome reading and learning to progress together.`
本文小结了JAVA常见的基础面试问题,希望对大家面试有帮助。
知识点拓展的链接均为自己这一个月内整理的文章是相关知识点详解。

在这里插入图片描述


  • 1.Java 的多态表现在哪里?
  • 多态要有动态绑定,否则就不是多态,方法重载也不是多态(因为方法重载是编译期决定好的,没有后期也就是运行期的动态绑定)
  • 多态当满足这三个条件 1.有继承 2. 有重写 3. 要有父类引用指向子类对象

  • 2.抽象类与接口的区别
  • (1)一个类只能继承一个抽象类,一个类可以实现多个接口
  • (2)抽象类中可以存在非抽象方法,接口中的方法都是抽象方法
  • (3)抽象类可以有私有的成员变量和成员方法,接口中的方法全部默认的修饰为public abstract 类型的方法
  • (4)实现抽象类的方法时,如果方法是抽象的,子类必须重写抽象方法,如果方法不是抽象的,子类可以选择继承;实现了接口就必须重写接口中的所有方法

  • 3.解释方法重写与方法重载
  • 方法重写:子类继承父类时,存在与父类中某一方法相同的方法名,返回类型和参数列表,则子类方法将覆盖父类原有的方法。方法重写特性:方法重写的返回值、方法名、参数列表必须完全一致。
  • 方法重载:在一个类中具有多个函数名相同,参数列表不同的方法。参数列表不同包含参数个数和类型的不同。

  • 4.==和equals()的区别
  • ①关于==解读:
  • 基本数据类型:比较的是值是否相同
  • 引用数据类型:比较的是引用(地址)是否相同
  • ②关于equals解读:

  • 对于重写equals方法的引用数据类型:比较的是值是否相同
  • 对于未重写equals方法的引用数据类型,源码继承object的equals方法,等同于==,即比较引用(地址)是否相同
  • 补充源码:

在这里插入图片描述


  • 5.&与&&的区别
  • &与&&都可以用做逻辑与运算符,表示逻辑与(and),当运算符两边的表达式结果都为true时,整个运算的结果才为true,否则为false
  • &&具有短路功能,即如果第一个表达式为false,则不再计算第二个表达式
  • &还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作

  • 6.final, finally, finalize的区别?
  • final修饰的类不可被继承,被final修饰的方法不可被重写,被final修饰的变量。
  • ②finally:异常处理语句结构的一部分,表示总是执行。
  • ③finalize:Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。


  • 8.ArrayList和LinkedList区别
联系:ArrayList与LinkedList都是List接口的实现类,都表示元素有序可重复的单值集合
  • ①ArrayList是基于数组的实现,元素的查询和修改效率较高,但是元素的插入和删除效率较低。
  • ②LinkedList是基于链表的实现,元素的插入和删除效率较高,但是元素的查询和修改效率较低。
  • 详解参考我的文章:List和Set集合基础详解

9.HashMap与ConcurrentHashMap的区别?

  • ①联系:HashMap与ConcurrentHashMap都是基于哈希表(数组、链表、红黑树)的存储。
  • ②区别:HashMap是非线程安全的,而ConcurrentHashMap是线程安全的,它在HashMap的基础上加入了分段锁的概念,即创建的Map的初始数组中的每一个元素为一个区块(segment),当线程A对键值对进行操作时只会锁住当前区块,而不影响对其它区块的操作,提高了Map在多线程并发操作时的效率。
  • 想了解HashMap可以参考:HashMap原理分析及性能优化

  • 10.列举10个常见异常
  • NullPointerException 空指针异常 、 ClassNotFoundException 类找不到异常
  • ArithmeticException 数学运算异常、 IndexOutOfBoundsExcept 下标越界异常
  • IllegalArgumentException 非法参数异常 、 FileNotFoundException 文件未找到异常
  • NumberFormatException 字符串转为数字异常、 EOFException 文件已结束异常
  • SQLException 操作数据库异常、 IOException 输入输出异常

  • 11.进程与线程的区别
  • 进程是资源分配的最小单位,线程是程序执行(资源调度)的最小单位

study hard


  • 12.线程的状态 常考
  • 新建状态(New):当线程对象创建后即进入新建状态
  • 就绪状态(Runnable):当调用线程对象的start()方法后,线程即进入就绪状态,等待CPU调度
  • 运行状态(Running):当CPU开始调度处于就绪状态的线程时,线程即进入运行状态
  • 阻塞状态(Blocked):处于运行状态中的线程由于某种原因,暂时放弃了对CPU的使用权,停止执行,即进入阻塞状态,直到其进入就绪状态才有机会获得CPU的调度而进入运行状态,根据阻塞原因的不同,阻塞状态分为:等待阻塞(wait)、同步阻塞(synchornized)、其它阻塞(sleep、join)
  • 死亡状态(Dead):线程执行完后或因异常而退出了run()方法,该线程的生命周期结束
  • 补充:建议了解线程的三种创建方式!!!反正我面试的时候被问过!

在这里插入图片描述


  • 13.简述线程池及工作原理
  • 线程池是管理线程的容器,先启动若干数量的线程,并让这些线程都处于睡眠状态,当客户端有一个新请求时,就会唤醒线程池中的某一个睡眠线程,让它来处理客户端的这个请求,当处理完这个请求后,线程又处于睡眠状态
  • 小结:线程池是面向后台程序的,是为了提高内存和CPU效率

  • 14.简述MySQL数据库索引原理
  • 定义:索引是帮助MySQL高效获取数据的数据结构。
  • 原理:传统查询方法是按照表的顺序遍历的,添加索引后可以根据BTREE算法生成一个索引文件,在查询数据库时,找到索引文件进行遍历,找到相应的键从而获取数据。
  • MYSQL进阶请参考:MYSQL性能优化

  • 15.数据库事务的四大特性(ACID),并阐述
  • ①原子性(Atomicity):一个事务中的多个步骤要么全部完成,要么全部不做
  • ②一致性(Consistency):在事务开始之前和事务完成之后,数据库中数据的完整性和一致性不能被破坏
  • ③隔离性(Isolation):数据库允许多个事务并发,但多个事务之间不能相互交叉执行从而导致数据不一致,多个并行的事务之间不能相互影响
  • ④持久性(Durablity):事务完成后,对数据的操作是永久的

  • 16.简述事物的隔离级别
  • 读未提交(Read uncommitted):就是一个事务可以读取另一个未提交事务的数据。
  • 读已提交(Read committed):就是一个事务要等待另一个事务提交后才能读数据。
  • 重复读(Repeatable Read):就是在开始读数据时,不再允许修改操作。
  • 序列化(Serializable):最高的事务隔离级别,事务串行化顺序执行,可以避免脏读、不可重复度、幻读,但是这种事务隔离级别效率低下,比较消耗数据库性能,一般不使用。

  • 17.简述数据库连接池
  • 数据库连接池是管理数据库连接的容器,数据库连接是一种关键的、有限的、昂贵的资源,一个数据库连接对象均对应一个物理数据库连接,每次操作都打开一个物理连接,使用完都关闭连接,这样造成系统的性能低下。
  • 作用:连接池技术尽可能多地重用了消耗内存地资源,大大节省了内存,提高了服务器地服务效率,能够支持更多的客户服务。通过使用连接池,将大大提高程序运行效率,同时,我们可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。
  • 小结:连接池是面向数据库连接的,是为了优化数据库连接资源

  • 18.Servlet生命周期 常考
Servlet是单实例多线程的,自始至终只会创建一个对象来响应用户请求。
如果web.xml中没有配置load-on-startup,则当用户第一次请求到达时创建servlet类的对象,然后使用该对象依次调用service(ServletRequest,ServletResponse)—service(HttpServletRequest,HttpServletResponse)—doGet/doPost方法响应用户请求;当用户请求再次到达时,不会重新创建对象,直接使用已经创建的对象调用service—service—doGet/doPost进行响应。

如果web.xml中有该Servlet的load-on-startup配置,则服务器启动时会按照load-on-startup配置的加载顺序依次创建Servlet对象,当请求到达时直接使用对象调用service-service-doGet/doPost方法进行相应。
当服务器关闭时,就销毁Servlet对象实例


  • 19.简述JSP九大内置对象虽然JSP很少用了还是建议了解一点内置对象
  • request该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据 作用域:一次请求
  • response 该对象代表服务器对客户端的响应,主要是将JSP容器处理过的数据传回到客户端 作用域:JSP页面内
  • session 从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话 作用域:浏览器
  • application 全局对象 服务器开启时创建,服务器关闭时销毁 所有用户共享该全局对象
  • out 表示指向当前JSP页面的输出流,可以通过该对象将指定的内容写出到JSP文件的指定位置
  • page 代表JSP本身,只有在JSP页面内合法
  • config 该对象的作用是取得当前页面在服务器上的配置信息
  • exception 该实例代表其他页面中的异常和错误。只有当页面是“错误处理页面”,即编译指令page 的isErrorPage
    属性为true 时,该对象才可以使用。
  • pageContext 作用是取得任何范围内的参数 通过它可以获得JSP页面的其他对象

  • 20.说说你对反射机制的理解
  • JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
  • 应用:通过反射机制获取注解信息 动态代理 逆向代码 基础框架应用广泛。

  • 21.Collection 和 Collections的区别?
  • Collection:集合类的上级接口,继承与他的接口主要有Set 和List.
  • Collections:针对集合类的一个帮助类,提供了一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

  • 22.TCP 与 UDP 的区别:
  • TCP(Transmission Control Protocol,传输控制协议)是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。
  • UDP(User Data Protocol,用户数据报协议), UDP 是一个非连接的协议,传输数据之前源端和终端不建立连接。(不安全)
  • 1 .基于连接与无连接;
  • 2 .对系统资源的要求(TCP 较多,UDP 少);
  • 3 .UDP 程序结构较简单;
  • 4 .流模式与数据报模式 ;
  • 5 .TCP 保证数据正确性,UDP 可能丢包,TCP 保证数据顺序,UDP 不保证。

  • 23.cookie 和 session 的区别,分布式环境怎么保存用户状态;
  • session 保存在服务器,客户端不知道其中的信息;cookie 保存在客户端,服务器能够知道其中的信息。
  • ②session 中保存的是对象,cookie 中保存的是字符串。
  • ③session 不能区分路径,同一个用户在访问一个网站期间,所有的 session 在任何一个地方都可以访问到。而 cookie
    中如果设置了路径参数,那么同一个网站中不同路径下的 cookie互相是访问不到的。
  • ④session 需要借助 cookie 才能正常。如果客户端完全禁止 cookie,session 将失效。
  • 详细解答参考我的文章:彻底了解Cookie和Session的区别(面试)

  • 24.wait 和 sleep 的区别; 我面试的时候考的
  • sleep()是 Thread 类中的方法,而 wait()则是 Object 类中的方法
  • sleep()方法导致了程序暂停,但是他的监控状态依然保持着,当指定的时间到了又会自动恢复运行状态。在调用sleep()方法的过程中,线程不会释放对象锁。
  • wait()方法会导致线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。

  • 25.简述HashMap存储过程
  • HashMap中键值对是基于哈希表(数组+链表+二叉树)的存储。
  • ①.当我们创建一个HashMap集合时,默认创建一个初始长度为16的数组(加载因子为0.75);
  • ②.当我们向HashMap中添加键值对的时候,首先根据键值对键的hash码除以数组的长度取余以确定键值对在map中的位置
  • ③.当这个位置有多个键值对时,以链表的结构进行存储;
  • ④.在JDK8中,当链表长度大于8时,则将链表结构转换为二叉树进行存储
扩容原理:当map的数组中元素超过数组长度的75%时,表示需要扩容(扩容算法<<1),每次扩容都会导致对所有键值对进行重新排列,会影响map的性能,所以在实际开发中要尽量避免无谓的扩容。


  • Thank you very much for your reading. I hope we can all be good programmers.
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
71 2
|
23天前
|
Java 程序员
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
小米,29岁程序员,分享了一次面试经历,详细解析了Java中&和&&的区别及应用场景,展示了扎实的基础知识和良好的应变能力,最终成功获得Offer。
56 14
|
1月前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
1月前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
1月前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
28天前
|
Java 编译器 程序员
Java面试高频题:用最优解法算出2乘以8!
本文探讨了面试中一个看似简单的数学问题——如何高效计算2×8。从直接使用乘法、位运算优化、编译器优化、加法实现到大整数场景下的处理,全面解析了不同方法的原理和适用场景,帮助读者深入理解计算效率优化的重要性。
31 6
|
1月前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
58 4
|
1月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
117 4
|
2月前
|
存储 Java 程序员
Java面试加分点!一文读懂HashMap底层实现与扩容机制
本文详细解析了Java中经典的HashMap数据结构,包括其底层实现、扩容机制、put和查找过程、哈希函数以及JDK 1.7与1.8的差异。通过数组、链表和红黑树的组合,HashMap实现了高效的键值对存储与检索。文章还介绍了HashMap在不同版本中的优化,帮助读者更好地理解和应用这一重要工具。
67 5
|
2月前
|
存储 Java
[Java]面试官:你对异常处理了解多少,例如,finally中可以有return吗?
本文介绍了Java中`try...catch...finally`语句的使用细节及返回值问题,并探讨了JDK1.7引入的`try...with...resources`新特性,强调了异常处理机制及资源自动关闭的优势。
25 1