Java企业面试题5

news/2024/10/22 4:28:40/

1. Java 的泛型是什么?有什么好处和优点?JDK 不同版本的泛型有什么区别?(软*动力)

  • 泛型是 Java 语言中引入的一种特性,允许在定义类、接口和方法时使用类型参数(Type Parameters)。它提供了编译时类型安全检查机制,允许程序员在使用集合类时不必进行显式的类型转换。
  • 好处和优点
    • 类型安全:泛型增强了代码的可读性和安全性,避免了类型转换错误。
    • 代码复用:泛型允许编写通用的代码,适用于多种数据类型。
    • 减少强制类型转换:使用泛型后,集合操作时不需要手动转换类型。
  • JDK 不同版本的泛型区别
    • JDK 5 引入了泛型,之前的版本不支持泛型。
    • JDK 7 引入了菱形语法,简化了泛型实例化。
    • JDK 8 引入了类型推断,进一步简化了泛型代码。

2. 说说你对泛型的了解(*软国际)

  • 泛型是 Java 中用于实现类型参数化的一种机制,它允许在类、接口和方法中使用类型变量。泛型的主要目的是提供编译时的类型检查和消除类型转换。

3. 链表和数组有什么区别?(腾*)

  • 数组是固定大小的数据结构,一旦创建,大小不可变。数组中的元素通过索引直接访问,访问速度快,但插入和删除操作效率较低。
  • 链表是一种动态的数据结构,大小可变。链表中的元素通过指针连接,插入和删除操作效率高,但访问元素需要遍历链表,速度较慢。

4. 栈是如何运行的?(西*信息技术)

  • 栈是一种后进先出(LIFO)的数据结构,只允许在一端进行插入(push)和删除(pop)操作。栈的操作类似于一叠盘子,最后放上去的盘子必须是第一个被取走的。

5. ArrayList的默认大小是多少,以及扩容机制(顺*、凡*科技)

  • 默认大小为 10。
  • 当 ArrayList 达到容量限制时,会自动扩容,通常是当前容量的1.5倍。

6. ArrayList的底层是怎么实现的?(腾*)

  • ArrayList 底层是基于动态数组实现的,它封装了一个 Object[] 数组来存储元素。
  • 数组在初始化时具有一定的容量,当容量不足以容纳更多的元素时,数组会被重新创建并复制原有的元素。

7.在ArrayList中remove后面几个元素该怎么做?(惠*、中*亿达)

  • ArrayList 没有直接的方法来移除后面几个元素,但可以通过循环调用 remove(index) 方法来逐个移除。

8.ArrayList1.7和1.8的区别(拓*思)

  • 主要区别在于 1.8 引入了对 Lambda 表达式和 Stream API 的支持,以及一些性能优化。

9.数组和 ArrayList 的区别(阿*、*科软)

  • 数组是固定大小的,而 ArrayList 可动态调整大小。
  • 数组可以是基本类型,而 ArrayList 只能存储对象。
  • ArrayList 提供了更多便捷的方法,如自动扩容。

10.什么是线程安全的List?(平*金服)

  • 线程安全的List是指多个线程可以并发访问而不出现数据一致性问题的List。例如,Vector和Collections.synchronizedList(new ArrayList<>())都是线程安全的实现。

11.说说HahMap底层实现(新*股份、顺*、猫*娱乐)

  • HashMap使用了数组+链表/红黑树的数据结构。每个元素的键通过哈希函数计算得到一个索引,相同索引的元素形成一个链表或者红黑树。

12.HashMap初始值16,临界值12是怎么算的(软**力)

  • 初始容量为16是因为这是一个2的幂,可以优化哈希函数的性能。临界值12是基于负载因子(默认0.75)计算得出的,即16 * 0.75 = 12。

13.HashMap长度为什么是2的幂次方(国*时代)

  • 当HashMap的容量是2的幂次方时,可以通过位运算来计算索引,这比使用取模运算更快。

14.HashMap怎么计算哈希值和索引?扩容机制?怎么解决hash冲突?(*软国际、中软*腾)

  • 哈希值由键对象的hashCode()方法返回,索引通过哈希值与数组长度的掩码计算得出。当达到阈值时,HashMap会自动扩容,通常是原容量的两倍,并且重新计算每个键的哈希值。解决hash冲突的方法包括链地址法(使用链表或红黑树存储相同索引的键值对)。

15.HashMap底层是数组+链表,有数组很快了,为什么加链表?(润*软件)

  • 使用链表是为了处理哈希冲突的情况,当多个键映射到同一个索引时,链表可以保存这些键值对。

16.HashMap为什么长度达到一定的长度要转化为红黑树(*度)

  • 当链表过长时,搜索效率降低,因此当链表达到一定长度时,为了提高查找速度,会转换成红黑树。

17.HashMap什么时候扩充为红黑树,什么时候又返回到链表?(汉*)

  • 当链表长度小于阈值(6)时,红黑树会退化为链表。

18.在 JDK1.8中,HashMap的数据结构与1.7相比有什么变化,这些变化的好处在哪里?(海*科)

  • 引入了红黑树来优化高冲突情况下的性能。
  • 改进的扩容机制和链表与红黑树的转换机制提高了性能。

19.HashMap的get()方法的原理?(顺*)

  • 根据 key 的哈希值计算索引,然后在对应的链表或红黑树中查找元素。

20.hashcode和equals区别?(海*供应链管理)

  • hashCode() 返回对象的哈希码,用于快速查找。
  • equals() 方法用于比较两个对象的内容是否相等。

21.hashCode() 与 equals() 生成算法、方法怎么重写?(阿*校招)

  • 重写时应保证相等的对象返回相同的哈希码,并且在 equals() 中比较所有关键字段。

22.说一下equals和==的区别,然后问equals相等hash值一定相等吗?hash值相等equals一定相等吗?(南*电网、上海*智网络)

  • ==用来比较两个对象的引用是否指向同一个内存地址,而equals()比较的是两个对象的内容是否相等。equals()相等时hashCode()应该相等,但hashCode()相等时equals()不一定相等。

23.HashSet存放数据的方式?(拓*软件)

  • HashSet内部使用HashMap来存储元素,元素作为键(key),值(value)是一个常量。

24.Set是如何实现元素的唯一性?(湖**利软件)

  • Set接口要求所有实现类保证元素的唯一性。通过重写equals()和hashCode()方法来确保没有重复元素。

25.用哪两种方式来实现集合的排序(凡*科技)

  • 可以通过实现Comparable接口来定义自然顺序,或者使用Comparator接口来定义外部排序规则。

26.谈谈Java IO里面的常用类,字节流,字符流(银*数据)

  • 在Java IO中,常用的类包括但不限于 InputStream 和 OutputStream 用于处理字节流,而 Reader 和 Writer 则用于处理字符流。例如,FileInputStream 和 FileOutputStream 用于文件的读写,而 BufferedReader 和 BufferedWriter 则提供了带缓冲的字符读写功能。

27.Java 中有几种类型的流?JDK为每种类型的流提供一些抽象类以供继承,请说出他们分别是哪些类?(上海*厦*联网、极*科技)

  • Java中的流主要分为字节流和字符流两种类型。对于字节流,抽象基类是 java.io.InputStream;对于字符流,则是 java.io.Reader。此外,还有其他流如 FilterOutputStream 和 Writer 的子类等。

28.流一般需不需要关闭?如果关闭的话用什么方法?处理流是怎么关闭的?(银*数据)

  • 流通常需要关闭来释放系统资源。关闭流使用 close() 方法。在处理流时,通常推荐使用 try-with-resources 语句来自动关闭实现了 AutoCloseable 接口的资源,或者在 finally 块中手动调用 close() 方法。

29.OutputStream里面的write()是什么意思?(君*科技)

  • OutputStream 类中的 write() 方法用于将指定的字节写入输出流。它可以接受一个字节数组作为参数,并将这些字节写入底层的物理设备或者目标。

30.BufferedReader属于哪种流?他主要是用来做什么的?(国*电网)

  • BufferedReader 属于字符输入流,并且具有内部缓冲区。它主要用于提高从文本文件中读取字符的效率。

31.什么是缓冲区?有什么作用?(北京中油**)

  • 缓冲区是一个用于暂时存储数据的数据结构,在Java IO中,缓冲区可以提高读写操作的速度。通过预先读取或延迟写入大量数据到缓冲区,可以减少对底层物理设备的访问次数。

32.字节流和字符流是什么?怎么转换?(北京蓝*、*海*供应链管理)

  • 字节流处理的是字节数据,而字符流处理的是字符数据。要在这两者之间进行转换,可以使用 InputStreamReader 将字节流转换为字符流,或者使用 OutputStreamWriter 将字符流转换为字节流。

33.什么是Java序列化,如何实现(君*科技、上海*厦物联网)

  1. Java序列化是指将对象的状态信息转换为可以存储或传输的形式的过程。在Java中,实现序列化通常需要让对象所属的类实现 Serializable 接口,并且可以通过 ObjectOutputStream 和 ObjectInputStream 来实现对象的序列化和反序列化。

34.Java有些类中为什么需要实现Serializable接口?(阿*校招)

  • 在Java中,某些类需要实现 Serializable 接口是因为它们的状态需要被持久化保存或者在网络上传输。实现这个接口意味着该类的对象可以被序列化成字节流,从而可以在以后被重新创建出来,或者通过网络传输到另一个位置重新构造。

35.TCP协议(Transmission Control Protocol,传输控制协议)和UDP协议(User Datagram Protocol,用户数据报协议)的主要区别如下:

  • 连接性:TCP是一种面向连接的协议,它在数据传输之前需要建立一个连接(即三次握手),而UDP是无连接的,即发送数据之前不需要建立连接。
  • 可靠性:TCP提供可靠的数据传输服务,确保数据按顺序无差错地到达目的地。而UDP则是不可靠的,不保证数据的顺序和到达,也不检测数据是否丢失。
  • 流量控制:TCP支持流量控制机制,防止发送方发送速度过快而导致接收方无法处理。UDP没有流量控制机制。
  • 拥塞控制:TCP能够根据网络状况调整传输速率,避免拥塞的发生。UDP则不具备这样的功能。
  • 开销:由于TCP提供了可靠的服务和额外的功能,因此它的开销比UDP大。UDP则更轻量级,适用于实时应用,如语音通话或视频流。

36.TCP协议的三次握手(Three-way Handshake)与四次挥手(Four-way Handshake)机制:

三次握手:

  • 第一步:客户端向服务器发起请求,发送SYN包,表示想要建立连接。
  • 第二步:服务器接收到客户端的SYN包后,会回应一个SYN+ACK包,表示同意建立连接。
  • 第三步:客户端接收到服务器的SYN+ACK后,发送一个ACK包确认,至此三次握手完成,TCP连接建立成功。

四次挥手:

  • 第一步:客户端向服务器发送FIN包,表示客户端已经没有数据发送了,但是仍然可以接收数据。
  • 第二步:服务器接收到FIN后,发出一个ACK确认包给客户端。
  • 第三步:当服务器完成所有数据的发送后,也向客户端发送FIN包,表示服务器端也没有数据发送了。
  • 第四步:客户端接收到FIN后,再向服务器发送ACK确认包,表示同意关闭连接,此时四次挥手完成,TCP连接被关闭。

三次握手的主要目的是为了同步连接双方的初始序列号,并确认双方的发送与接收能力;四次挥手是为了确保两端都完成了数据的发送任务。

37.对反射了解吗?反射有什么好处?为什么需要反射?(微*银行)

  • 反射是Java编程语言的一个特性,允许程序在运行时检查类、接口、字段和方法的信息,并创建对象实例。反射的好处在于它提供了灵活性,使得程序能够在运行时动态地加载类、创建对象和调用方法,这在某些情况下是非常有用的,特别是在需要编写高度可配置的应用程序时。

38.反射的使用场合和作用、及其优缺点(*软国际)

  1. 反射通常用于框架开发、插件架构、动态代理、序列化/反序列化、ORM映射等领域。其优点是可以增强代码的灵活性和扩展性,缺点是可能引入性能开销,并且可能破坏封装性和安全性。

39.实现Java反射的类有什么?(君*科技)

  • 实现Java反射的类主要包括 java.lang.Class、java.lang.reflect.Method、java.lang.reflect.Constructor、java.lang.reflect.Field 等。

40.反射是怎么实现的?(上海立*网络)

  • 反射是通过调用 Class 类的方法来实现的,比如 forName()、getDeclaredMethods()、newInstance() 等方法。

41.Class类的作用?生成Class对象的方法有哪些?(顺*)

  • Class 类代表类和接口的信息,它允许程序获取类的对象,并通过这个对象来创建实例和调用方法。生成 Class 对象的方法包括:通过对象调用 .getClass() 方法,通过类名直接调用 .class,通过 Class.forName(String name) 加载类。

42.Class.forName("全路径") 会调用哪些方法 ? 会调用构造方法吗?加载的类会放在哪?(上*银行外包)

  • Class.forName("全路径") 会调用类加载器的 loadClass() 方法来加载类。它不会自动调用构造函数来创建对象实例,除非显式地调用 newInstance() 或者 getDeclaredConstructor().newInstance()。加载的类会被放置在类加载器的内存空间中。

43.类加载流程(汇**通、同*顺、凡*科技)

  • 类加载流程通常包括加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)和初始化(Initialization)五个阶段。在这个过程中,类加载器会按照一定的顺序查找并加载类。

44.说一下创建对象的几种方法?(华油***集团、*科软、凡*科技)

  • 创建对象的方法包括:使用 new 关键字、反射 (newInstance() 或 getDeclaredConstructor().newInstance())、克隆 (clone()) 和反序列化 (deserialize() 或 readObject() 方法)。

45.如何找到对象实际类的?(*度)

  • 要找到对象的实际类,可以使用 instanceof 关键字或者调用对象的 getClass() 方法。

46.Java反射创建对象效率高还是通过new创建对象的效率高?(三*重工)

  • 使用反射创建对象的效率通常比使用 new 关键字要低,因为反射涉及到更多的元数据查找和权限检查。

47.如何利用反射机制来访问一个类的方法?(神州**软件)

  • 利用反射机制访问一个类的方法,首先需要得到该类的 Class 对象,然后使用 getDeclaredMethod(String name, Class<?>... parameterTypes) 获取方法对象,最后调用 invoke(Object obj, Object... args) 来执行方法。

48.说一下Java反射获取私有属性,如何改变值?(阿****麻信用项目组)

  • 使用反射获取并修改私有属性,需要先得到字段的 Field 对象,然后设置可访问性 setAccessible(true),接着使用 set(Object obj, Object value) 方法来改变字段的值。需要注意的是,这样做可能会破坏封装性,并且可能违反安全策略。

49.谈谈java8新特性(京*旗下、时代\*宇,信必\*、招\*信诺,中\*外包,金\*软件、阿\*\*巴)

Lambda 表达式:

  • Lambda 表达式允许你像传递普通对象一样传递代码块,使得代码更为简洁、易读。它极大地促进了Java中的函数式编程风格的发展。

方法引用:

  • 方法引用是Lambda表达式的补充,提供了更加简洁的方式来引用已有类或对象的方法。

Stream API:

  • Stream API 提供了一种新的数据处理方式,可以让你以声明式的方式来处理数据集合。它支持并行操作,可以自动利用多核处理器的优势。

日期时间API:

  • Java 8引入了一个全新的日期时间API,位于java.time包下,如LocalDate、LocalTime、LocalDateTime等,这些类设计得更为直观易用,取代了旧有的java.util.Date和java.util.Calendar。

Optional 类:

  • Optional 类是一个容器类,旨在避免空指针异常,为可能为空的值提供了一种更好的处理方式。

默认方法和静态方法在接口中的使用:

  • 在Java 8中,接口可以拥有默认方法和静态方法,这有助于在不修改现有实现的情况下添加新的方法到接口中。

Base64 编码/解码:

  • Java 8提供了内置的支持来处理Base64编码和解码,使得在处理HTTP请求和响应时更加方便。

并行数组操作:

  • Java 8增加了对并行数组操作的支持,例如并行排序和平行流操作,使得处理大数据集更为高效。

新的JavaScript引擎(Nashorn):

  • Nashorn 是一个新的JavaScript引擎,它被设计成与Java集成得更好,适合用于脚本编写和内联JavaScript执行。

类型推断:

  • Java 8中的类型推断使得在某些情况下可以省略泛型参数,使代码更加简洁。

50.JDK1.8在数据结构上发生了哪些变化 ?(银*数据)

  • JDK 1.8(即JDK 8)在数据结构上的一些显著变化包括HashMap和ConcurrentHashMap的改进。HashMap现在使用了树化的技术来提高查找性能,在某些情况下(例如链表长度超过一定阈值时),链表将会转化为红黑树,从而提高了查找效率。同时,ConcurrentHashMap也进行了重大的重构,取消了Segment锁,转而采用CAS + synchronized来保证线程安全,提高了并发性能。

51.你说的了解 Java的新特性 ,你说说JDK8改进的地方?(银*科技)

  • JDK 8引入了许多新的特性,其中最重要的是Lambda表达式和支持函数式编程的Stream API。Lambda表达式使得代码更加简洁易读,Stream API则提供了高效处理集合的方法。另外,还引入了默认方法和静态方法到接口中,优化了日期时间API(java.time包),增强了字符串处理能力等。

52.JDK1.8用的是哪个垃圾回收器?(O**O)

  • JDK 1.8默认的垃圾回收器是Parallel GC(G1 Garbage Collector),不过也可以选择使用CMS(Concurrent Mark Sweep)或其他垃圾回收器。G1是一个平衡吞吐量和暂停时间的垃圾收集器,旨在最小化应用暂停时间的同时保持良好的吞吐量。

53.Lambda表达式有了解吗,说说如何使用的(O**O)

  • Lambda表达式是一种匿名函数,可以用来创建函数式接口的实例。使用Lambda表达式可以让代码更简洁,因为它允许你不用定义完整的类就能定义行为。语法格式如下:

54.什么是函数式接口?有几种函数式接口(阿**巴)

  • 函数式接口指的是仅有一个抽象方法的接口,可以被Lambda表达式所代替。Java 8中定义了一些标准的函数式接口,如 Function<T, R>、Predicate<T>、Consumer<T> 和 Supplier<T> 等。

55.创建Stream的方式(阿**巴)

  • 从集合中创建:Collection.stream()
  • 从数组中创建:Arrays.stream(T[])
  • 从迭代器中创建:Iterator.forEachRemaining(Consumer)
  • 创建无限流:Stream.iterate() 或 Stream.generate()

56.你讲讲stream表达式是咋用的,干啥的?(中*国际,上海**网络)

  • Stream表达式是用来处理集合的一种方式,它允许我们对集合中的元素进行排序、过滤、映射、归约等操作。使用Stream API可以写出更简洁的代码,同时也能利用多核处理器的优势进行并行处理。

57.集合用Stream流怎么实现过滤?(润*软件)

  • 使用Stream API实现集合过滤可以通过.filter()方法来完成。

58.用Stream怎么选出List里想要的数据?(惠*)

  • 使用Stream API选出列表中符合条件的数据可以使用.filter()方法结合.findFirst()或.findAny()来获得单个元素,或者使用.collect()来收集所有满足条件的元素。

59.说说JDK15、JDK16、JDK17中的新特性都有什么?(银*数据)

  • JDK 15:引入了预览特性如Text Blocks(文本块),Record(记录)类型等,并增强了Pattern Matching for instanceof(模式匹配)等。
  • JDK 16:包含Sealed Classes(密封类),Records成为最终特性,以及其他改进如Elastic Metaspace等。
  • JDK 17:成为长期支持版本(LTS),包括Vector API进入第二个预览阶段,以及其他性能和工具方面的改进。


http://www.ppmy.cn/news/1532756.html

相关文章

策略(政策)模式

简介 策略模式&#xff08;Strategy Pattern&#xff09;又叫作政策模式&#xff08;Policy Pattern&#xff09;&#xff0c;它将定义的算法家族分别封装起来&#xff0c;让它们之间可以互相替换&#xff0c;从而让算法的变化不会影响到使用算法的用户&#xff0c;属于行为型…

22.4k star,好用、强大的链路监控软件,skywalking

skywalking其实用的比较少&#xff0c;但其实目前持续更新下&#xff0c;功能还是蛮强大的&#xff0c;目前支持的agent也是蛮多的&#xff0c;如下是一些常规的支持agent&#xff0c;如果在选择链路监控的话&#xff0c;可以看下这款。 当谈到应用性能监控&#xff08;Applica…

Docker精讲:基本安装,简单命令及核心概念

docker服务部署 docker是一个容器管理工具&#xff0c;其内部容器才是具体服务&#xff0c;所以我们在安装docker时不需要有太多定制内容&#xff0c;只需要通过yum安装即可 1. 更新系统包 #更新现有依赖包&#xff0c;防止现有依赖包版本过低影响docker安装 yum update2. 安…

docker简介、安装、基础知识

基础知识 Docker简介&#xff1a; 1.Docker是一种用于构建、发布及运行应用程序的开源项目&#xff0c;他通过容器化技术简化了应用程序的部署和管理 2.Docker是一个开源的应用容器引擎&#xff0c;基于go语言开发&#xff0c;为应用打包、部署平台&#xff0c;而非单纯的虚…

Mac安装Manim并运行

1.在macOS上创建Python虚拟环境&#xff0c;可以使用venv模块&#xff0c;这是Python自带的库&#xff0c;也可以使用conda。以下是使用venv创建和使用Python虚拟环境的步骤&#xff1a; 打开终端。 创建一个新的目录来存放你的项目&#xff0c;并进入该目录&#xff1a; mk…

【解决】Mac 上 M系列芯片用 Vmware Fusion安装 win11 遇到的主要的问题汇总

此文很短&#xff0c;没闲话&#xff0c;干活满满 Mac 版本最干净版本的 win11 免费下载链接 &#xff1a;链接&#xff1a;https://pan.quark.cn/s/4e8e8bb93564 本文实验电脑为&#xff1a;Macbook Air M3 第一个问题&#xff1a;如何解决安装Windows11时出现“这台电脑无…

YOLOv5改进:Shuffle Attention注意力机制【注意力系列篇】(附详细的修改步骤,以及代码)

如果实验环境尚未搭建成功&#xff0c;可以参考这篇文章 ->【YOLOv5超详细环境搭建以及模型训练&#xff08;GPU版本&#xff09;】 文章链接为&#xff1a;http://t.csdnimg.cn/Ke0bb ---------------------------------------------------------------------------​ 1…

数据结构之链表(2),双向链表

目录 前言 一、链表的分类详细 二、双向链表 三、双向链表的实现 四、List.c文件的完整代码 五、使用演示 总结 前言 接着上一篇单链表来详细说说链表中什么是带头和不带头&#xff0c;“哨兵位”是什么&#xff0c;什么是单向什么是双向&#xff0c;什么是循环和不循环。然后实…