首页 > 编程语言 >2024最新版Java面试题及答案汇总

2024最新版Java面试题及答案汇总

时间:2024-09-23 14:53:34浏览次数:14  
标签:面试题 Java HashMap ArrayList 面试 线程 抽象类 最新版 方法

1. 对字符串的都有哪些方法?详细说明下。

具体有String、StringBuffer和StringBuilder这三个类。

  • String是不可变类,每次操作都会生成新的String对象,并将结果指针指向新的对象,由此会产生内存碎片。

  • 如果要频繁对字符串修改,建议采用StringBuffer 和 StringBuilder。

  • StringBuffer 和 StringBuilder的差别在于,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,由于无需维护线程安全的操作,所以StringBuilder 的性能要高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。由于大多数环境下是单线程,所以大多是用 StringBuilder。

2. String str="abc"与 String str=new String(“abc”)的定义方法一样吗?

不一样,String str="abc"的方式,java 虚拟机会将其分配到常量池中;所以建议这种写法。

而 String str=new String(“abc”) 则会被分到堆内存中,如果再频繁修改,会导致内存碎片。

3. 如何将字符串反转?

使用 StringBuilder 或 stringBuffer 的 reverse() 方法。

4. String 类的常用方法都有那些?

  • indexOf():返回指定字符的索引。

  • length():返回字符串长度。

  • equals():字符串比较。

  • replace():字符串替换。

  • trim():去除字符串两端空白。

  • split():分割字符串,返回一个分割后的字符串数组。

  • toLowerCase():将字符串转成小写字母。

  • toUpperCase():将字符串转成大写字符。

  • substring():截取字符串。

你面试时,说出其中的一两个即可,但需要说明如下的意思。

  • String s  = “abc”;,这是常量,放常量池管理。

  • 不建议频繁对String修改,因为会产生内存碎片。

  • 如果要频繁对字符串修改,建议采用StringBuffer 和 StringBuilder

5. 抽象类必须要有抽象方法吗?

不需要的,抽象类不一定非要有抽象方法。但从面向对象思想角度来分析,不建议这样做。

因为在设计的时候,会把逻辑上存在但实际不存在的类设置成抽象类,比如动物类,毕竟不能直接展示“动物”。

正因为不存在,所以里面的方法未必能实现,比如“奔跑”方法,所以此类方法需要设置成没方法体的抽象方法。

如果在抽象类里方法,全都有方法体,那么要么是抽象类设计不当,或者实现了未必能实现的方法,所以建议修改。

篇幅限制下面就只能给大家展示小册部分内容了,这边整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题

 需要全套面试笔记的【点击此处即可】免费获取

6. 一般的类和抽象类有哪些区别?

  • 一般的类不能包含没有方法体的抽象方法,而抽象类可以包含抽象方法。

  • 抽象类不能直接用new来实例化,普通类可以直接实例化。

7. 抽象类能使用 final 修饰吗?

首先说明,语法上不能,然后再进一步从面向对象思想角度来说明。

定义抽象类的本意是,让其它类继承的,从而进一步完善对象。如果定义为 final 该类就不能被继承,这样就会有矛盾,所以 final 不能修饰抽象类。

8. 接口和抽象类有什么区别?

  • 抽象类的子类要用 extends 来继承;而实现接口要用 implements 。

  • 抽象类可以定义构造函数,而接口不能。

  • 抽象类里可以定义 main 方法,但接口不能有 main 方法。

  • 实现数量:类可以实现很多个接口;但是只能继承一个抽象类。

  • 访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。

上述是从语法上来归纳,然后建议大家再从面向对象思想的角度来说明

  • 抽象类是对逻辑的归纳,比如动物类可以是抽象类,人类可以extends动物这个抽象类。

  • 而接口是对功能的归纳,比如可以定义一个“提供数据库访问功能”的 接口,在其中封装若干操作数据库的方法。

9. java 中 IO 流分为几种?

按功能来分可以分输入流(input)和输出流(output)。从类型来分可以是字节流和字符流。

10. BIO、NIO、AIO 有什么区别?

  • BIO的英语全称是Block IO, 同步阻塞式 IO,就是平常经常使用的传统 IO,特点是简单方便,但并发处理能力低。

  • NIO,叫New IO, 同步非阻塞 IO,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。

  • AIO,Asynchronous IO, 是 NIO 的升级,实现了异步非堵塞 IO ,它是基于事件和回调机制。

11. Files的常用方法都有哪些?

  • Files.exists():检测路径是否存在。

  • Files.createFile():创建文件。

  • Files.createDirectory():创建文件夹。

  • Files.delete():删除文件或文件夹。

  • Files.copy():复制文件。

  • Files.move():移动文件,即复制后删除。

  • Files.size():查看文件的个数。

  • Files.read():读取文件。

  • Files.write():写入文件。


第二部分,Java的集合,也叫容器

==================================================================================

12. java 的集合容器都有哪些?

如下给出了大致的结构

  • 所有线性表对象的父类是Collection

  • 有线性表类,比如ArrayList和Set等。

  • 有键值对类,比如HashMap。

19. Collection 和 Collections 有什么区别?

  • Collection 是一个集合接口,是所有线性表对象的父类。

  • Collections是集合类的一个工具类,包含了对集合元素进行排序和线程安全等各种操作方法。

20. List、Set、Map 之间的区别是什么?

 篇幅限制下面就只能给大家展示小册部分内容了,这边整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题

 需要全套面试笔记的【点击此处即可】免费获取

21. HashMap 和 Hashtable 有什么区别?

首先说,两者都是键值类的对象

  • HashTable线程安全的,而HashMap线程不安全的,大多数的场景是单线程环境,在单线程环境下,HashMap效率上比hashTable要高。

  • HashMap允许空键值,而hashTable不允许。

22. 如何决定使用 HashMap 还是 TreeMap?

对于在Map中进行插入、删除和定位元素这类操作,可以选HashMap。但如果你要对一个有序的key集合进行遍历,需要选TreeMap。

23. 说一下 HashMap 的实现原理?

HashMap是基于数据结构里的散列表,在大数据情况下,能保证get的高效性。

HashMap不保证映射的顺序,特别是它不保证该顺序恒久不变。

HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。

当向Hashmap对象里put元素时,会根据key的hashcode计算hash值,根据hash值得到这个元素在数组中的位置,如果该数组在该位置上已经存放了其他元素,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放入链尾.如果数组中该位置没有元素,就直接将该元素放到数组的该位置上。

注意Jdk 1.8中对HashMap的实现做了优化,当链表中的节点数据超过八个之后,该链表会转为红黑树来提高查询效率,从原来的O(n)到O(logn)

24. 说一下 HashSet 的实现原理?

  • HashSet在底层上,是由HashMap实现的

  • HashSet的值放在HashMap的key上

  • HashMap的value统一为PRESENT

25. ArrayList 和 LinkedList 的区别是什么?

ArrrayList底层实现的数据结构是数组,支持随机访问,而 LinkedList 的底层数据结构是双向循环链表,不支持随机访问。

使用下标访问一个元素,ArrayList 的时间复杂度是 O(1),而 LinkedList 是 O(n)。

26. 如何做到数组和 List之间的转换?

  • List对象转换成为数组:可以调用ArrayList(或其它List)的toArray方法。

  • 数组转换成为List:调用Arrays的asList方法。

27. ArrayList 和 Vector 的区别是什么?(面试大概率会问)

  • Vector是线程安全的,而ArrayList不是。所以在单线程情况下,建议使用ArrayList

  • 在扩容时,Vector是扩容100%,但ArrayList是50%,后者更节省内存

结论:大多数开发场景是单线程环境,所以建议使用ArrayList

28. Array 和 ArrayList 有何区别?

  • Array能容纳基本数据类型和自定义对象,而ArrayList只能容纳自定义的对象,对于基本数据类型,需要转换成封装类才能存储。

  • Array是指定大小的,要手动扩容,而ArrayList大小虽然可以在定义时指定,但遇到容量满时会自动扩容。

  • Array没有提供ArrayList那么多功能,比如addAll、removeAll和iterator等。

所以建议使用ArrayList

 篇幅限制下面就只能给大家展示小册部分内容了,这边整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题

 需要全套面试笔记的【点击此处即可】免费获取

29. 在 Queue 中 poll()和 remove()有什么区别?

poll() 和 remove() 都是从队列中取出一个元素,但是 poll() 在获取元素失败的时候会返回空,但是 remove() 失败的时候会抛出异常。

30. 哪些集合类是线程安全的?

  • Vector:就比arraylist多了个同步化机制(线程安全),因为效率较低,现在已经不太建议使用。在web应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑的。

  • Statck:堆栈类,先进后出,项目中用得并不多。

  • Hashtable:就比hashmap多了个线程安全,所以建议使用HashMap。

  • enumeration:枚举,所以现在建议用Iterator来迭代。

结论是,如果在单线程情况下,不建议使用这些线程安全对象。

31. 迭代器 Iterator 是什么?

迭代器是一种设计模式,也是一个对象,可以用来遍历并选择序列(比如ArrayList或HashMap)中的对象,而开发人员不需要了解该序列的底层结构。

迭代器通常被称为“轻量级”对象,因为创建它的代价小。

32. Iterator 怎么用?有什么特点?

Iterator比较好用,而且只能单向移动:

(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。比如list.iterator()

(2) 用next()得到序列中的下一个元素。

(3) 使用hasNext()检查是否还有其它元素。

(4) 使用remove()将迭代器新返回的元素删除。但不建议一遍迭代一边删除,有可能引发并发问题。

Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。

33. Iterator 和 ListIterator 有什么区别?

  • Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。

  • Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。

  • ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引等等,但在实际用的时候,大多也是只用到迭代的功能。

  • 一般只建议使用Iterator,别区分地对List对象用ListIterator。


 篇幅限制下面就只能给大家展示小册部分内容了,这边整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题

 需要全套面试笔记的【点击此处即可】免费获取

第三部分、多线程

==========================================================================

35. 并行和并发有什么区别?

  • 并行是指两个或多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。

  • 并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。

  • 在一台处理器上“同时”处理多个任务,在多台处理器上同时处理多个任务。如hadoop分布式集群。

  • 实际应用场景里,一般是考虑多并发问题,而不是多并行问题。

36. 线程和进程的区别?

进程是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程,但一个进程一般有多个线程。

进程在运行过程中,需要拥有独立的内存单元,否则如果申请不到,就会挂起。而多个线程能共享内存资源,这样就能降低运行的门槛,从而效率更高。

线程是是cpu调度和分派的基本单位,在实际开发过程中,一般是考虑多线程并发。

37. 守护线程是什么?

守护线程(daemon thread),是个服务线程,用来监视和服务其它线程。

38. 创建线程有哪几种方式?

①. 继承Thread类创建线程类

  • 通过extends Thread定义Thread类的子类,并重写该类的run方法。

  • 创建Thread子类的实例,并调用线程对象的start()方法来启动该线程。

②. 通过Runnable接口创建线程类

  • implements Runnable接口的实现类,并重写该接口的run()方法。

  • 创建 Runnable实现类的实例,并依此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。

  • 调用线程对象的start()方法来启动该线程。

③. 通过Callable和Future创建线程

  • 创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并且有返回值。

  • 创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。

  • 使用FutureTask对象作为Thread对象的target创建并启动新线程。

  • 调用FutureTask对象的get()方法来获得子线程执行结束后的返回值。

另外,还有通过线程池来创建线程

39. 说一下 runnable 和 callable 有什么区别?

  • Runnable接口中的run()方法的返回值是void,在其中可以定义线程的工作任务,但无法返回值。

  • Callable接口中的call()方法是有返回值的,是一个泛型,一般会和Future、FutureTask配合,能异步地得到线程的执行结果。

40. 线程有哪些状态?

线程通常都有五种状态,创建、就绪、运行、阻塞和死亡。

  • 创建状态。创建好线程对象,并没有调用该对象的start方法,此时线程处于创建状态。

  • 就绪状态。当调用线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,也就是说还没进入运行状态。或者在线程运行之后,从等待或者睡眠状态中回来之后,也会处于就绪状态,等待被调度进入运行状态。

  • 运行状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码。

  • 阻塞状态。线程正在运行的时候,被暂停,通常是为了等待某个实践的发生(比如说某项资源就绪)之后再继续运行。wait方法都可以导致线程阻塞。

  • 死亡状态。如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪

     篇幅限制下面就只能给大家展示小册部分内容了,这边整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题

     需要全套面试笔记的

标签:面试题,Java,HashMap,ArrayList,面试,线程,抽象类,最新版,方法
From: https://blog.csdn.net/edcb2312/article/details/142457736

相关文章

  • 最新整理Java面试八股文(程序员必备)
    1.面向对象的三大特性?封装:核心思想就是“隐藏细节”,对外提供访问属性的方法。保证了数据的安全和程序的稳定。继承:将子类共性的属性或者方法抽取出来成为父类,子类继承后就不用重复定义父类的属性和方法,只需要扩展自己的个性化。强制继承父类非私有的属性和方法,破坏了封装性原......
  • 2024Java核心面试题合集
    1.保证并发安全的三大特性? 原子性:一次或多次操作在执行期间不被其他线程影响可见性:当一个线程在工作内存修改了变量,其他线程能立刻知道有序性:JVM对指令的优化会让指令执行顺序改变,有序性是禁止指令重排2.volatile保证变量的可见性和有序性,不保证原子性。使用了volatile......
  • 2024年全新Java面试题整理
    1、多线程的价值?(1)发挥多核CPU的优势多线程,可以真正发挥出多核CPU的优势来,达到充分利用CPU的目的,采用多线程的方式去同时完成几件事情而不互相干扰。(2)防止阻塞从程序运行效率的角度来看,单核CPU不但不会发挥出多线程的优势,反而会因为在单核CPU上运行多线程导致线......
  • idea运行java项目main方法报build failure错误的解决方法BR
    当在使用IntelliJIDEA运行Java项目的main方法时遇到"BuildFailure"错误,这通常意味着在项目的构建过程中遇到了问题。解决这类问题通常需要系统地检查和调整项目设置、代码、依赖项等多个方面。以下是一些详细的解决步骤,以及一个简单的代码示例,用于展示如何确保Java程......
  • ECMAScript与JavaScript的区别:深入解析与代码实践
    ECMAScript与JavaScript的区别:深入解析与代码实践在Web开发领域,ECMAScript(通常缩写为ES)和JavaScript是两个密不可分但又有所区别的概念。尽管它们之间有着紧密的联系,理解它们之间的区别对于开发者来说至关重要。本文将深入探讨ECMAScript与JavaScript的区别,并通过代码示例......
  • 基于SSM的高校毕业设计(选题)管理系统。Javaee项目。
    演示视频:基于SSM的高校毕业设计(选题)管理系统。Javaee项目。项目介绍:采用M(model)V(view)C(controller)三层体系结构,通过Spring+SpringMvc+Mybatis+Jsp+Bootstrap来实现。MySQL数据库作为系统数据储存平台,实现了基于B/S结构的Web系统。系统设计思想一个成功的......
  • java毕业设计下载(全套源码+配套论文)——基于javaEE+SSH+mysql的医院在线挂号系统设计
    基于javaEE+SSH+mysql的医院在线挂号系统设计与实现(毕业论文+程序源码)大家好,今天给大家介绍基于javaEE+SSH+mysql的医院在线挂号系统设计与实现,更多精选毕业设计项目实例见文末哦。文章目录:基于javaEE+SSH+mysql的医院在线挂号系统设计与实现(毕业论文+程序源码)1、项......
  • java毕业设计下载(全套源码+配套论文)——基于javaEE+SSH+mysql的百货中心供应链管理系
    基于javaEE+SSH+mysql的百货中心供应链管理系统设计与实现(全套源码+配套论文)大家好,今天给大家介绍基于javaEE+SSH+mysql的百货中心供应链管理系统设计与实现,更多精选毕业设计项目实例见文末哦。文章目录:基于javaEE+SSH+mysql的百货中心供应链管理系统设计与实现(全套......
  • 03 Java流程控制
    一、顺序结构前面学的就是顺序结构二、分支结构1.if分支根据条件(真或假)来决定执行某段代码if(条件){},()后不能跟“;”,否则{}中的代码将不受if的控制如果if语句的{}中只有一行代码的情况,{}可以省略不写(但是不推荐省略)1.1 if分支的三种形式①if(条i按表达式){   代......
  • python面试题
    python是什么?Python是一种开放原始码、直译式、可携式、面向对象的程序语言,具有模块、多线程、异常处理以及自动内存管理功能。广泛应用包括Web开发(如Django和Flask框架)、数据科学(如Pandas和NumPy库)、机器学习(如TensorFlow和PyTorch框架)、自动化脚本、科学计算等。算法是什么?......