我是靠谱客的博主 坚强小蝴蝶,最近开发中收集的这篇文章主要介绍JAVA常见基础面试问题汇集,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

本文小结了JAVA常见的基础面试问题,希望对大家面试有帮助。
知识点拓展的链接均为自己这一个月内整理的文章是相关知识点详解。
Welcome reading and learning to progress together.

  • 程序员简历模板请参考:简历制作—心得分享
  • JAVA框架面试知识点参考: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类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。

  • 7.StringBuffer 和 StringBuilder的区别 常考
  • 最主要的:StringBuffer:线程安全StringBuilder:线程不安全
  • 参考我的文章:StringBuffer 和 StringBuilder的面试详解
  • 同步参考:JAVA中String介绍以及常见面试题

  • 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对象实例

  • 详细了解参考:Servlet生命周期及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的性能,所以在实际开发中要尽量避免无谓的扩容。

  • HashMap性能详解请参考:HashMap原理分析及性能优化

  • 26.Redis相关问题我已经整理:Redis的面试基础知识详解

  • Thank you very much for your reading. I hope we can all be good programmers.
    在这里插入图片描述
  • 2020.03.12 辰兮的第26篇博客 thanks~

最后

以上就是坚强小蝴蝶为你收集整理的JAVA常见基础面试问题汇集的全部内容,希望文章能够帮你解决JAVA常见基础面试问题汇集所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部