Java面试黄金宝典4

news2025/3/20 11:47:36

1. 什么是泛型 ?与 T 的区别

  • 原理

泛型是 Java 编程语言中的一个强大特性,它提供了编译时类型安全检查机制,允许在定义类、接口和方法时使用类型参数。这些类型参数在使用时会被具体的类型所替代,从而实现代码的复用和类型安全。泛型的实现基于类型擦除机制,在编译时,泛型类型信息会被擦除,替换为原始类型。

例如,定义一个泛型类 Box<T>

java

public class Box<T> {
    private T item;

    public void setItem(T item) {
        this.item = item;
    }

    public T getItem() {
        return item;
    }
}

在使用时,可以指定具体的类型,如 Box<Integer>Box<String>

T 是泛型类型参数的一个常用命名约定,它代表 “Type”,表示未知的类型。在 Java 中,你可以使用任意合法的标识符作为类型参数名,但通常遵循一些约定,如 T 用于一般的类型,E 用于集合元素类型,KV 用于键值对。

  • 要点

  1. 编译时类型检查:泛型在编译时进行类型检查,确保代码的类型安全性,避免了运行时的 ClassCastException
  2. 代码复用:通过泛型,可以编写通用的代码,减少重复代码的编写。
  3. 类型参数命名T 只是一个常用的类型参数名,你可以根据需要使用其他合法的标识符。

  • 应用

  1. 泛型通配符:Java 提供了通配符 ? 来表示未知类型,分为上界通配符 ? extends T 和下界通配符 ? super T。上界通配符用于限制泛型类型的上限,下界通配符用于限制泛型类型的下限。
  2. 泛型方法:除了泛型类,还可以定义泛型方法。泛型方法可以在普通类中定义,也可以在泛型类中定义。
  3. 泛型接口:可以定义泛型接口,实现该接口的类需要指定具体的类型参数。

2. 什么是枚举类型,字节码层面理解 Enum

  • 原理

在 Java 中,枚举类型(enum)是一种特殊的类。从字节码层面看,枚举类型在编译后会被转换为一个继承自 java.lang.Enum 的类。每个枚举常量都是该类的一个静态最终实例,并且会在类加载时被初始化。

例如,以下枚举类型:

java

public enum Color {
    RED, GREEN, BLUE;
}

编译后,Color 会变成一个类,其中 REDGREENBLUE 是该类的静态最终实例。编译器会为枚举类型生成一些额外的方法,如 values() 用于返回所有枚举常量的数组,valueOf() 用于根据名称获取枚举常量。

  • 要点

  1. 继承自 java.lang.Enum:枚举类型在字节码层面是一个普通的类,继承自 java.lang.Enum
  2. 静态最终实例:枚举常量是该类的静态最终实例,在类加载时被初始化。
  3. 额外方法:编译器会为枚举类型生成一些额外的方法,方便使用。

  • 应用

  1. 枚举属性和方法:枚举类型可以有自己的属性和方法,并且可以实现接口。通过为枚举常量添加属性和方法,可以实现更复杂的逻辑。
  2. switch 语句中的枚举:在 switch 语句中使用枚举类型可以提高代码的可读性和安全性。

3. 什么是值传递与引用传递,有什么区别

  • 原理

  1. 值传递:在 Java 中,基本数据类型(如 intdouble 等)的参数传递是值传递。当调用方法时,会将实际参数的值复制一份传递给方法的形式参数,方法内部对形式参数的修改不会影响实际参数的值。
  2. 引用传递:对象类型的参数传递实际上也是值传递,但传递的是对象的引用(内存地址)。当调用方法时,会将对象的引用复制一份传递给方法的形式参数,方法内部可以通过这个引用修改对象的状态,但不能改变引用本身的值(即不能让引用指向另一个对象)。

  • 要点

  1. 值传递:传递的是实际参数的值的副本,方法内部对形式参数的修改不会影响实际参数。
  2. 引用传递:传递的是对象引用的副本,方法内部可以通过引用修改对象的状态,但不能改变引用本身。
  3. Java 只有值传递:Java 中只有值传递,没有真正意义上的引用传递。

  • 应用

  1. 理解值传递和引用传递的重要性:理解值传递和引用传递对于处理方法参数和对象状态的修改非常重要,特别是在处理复杂的对象和数据结构时。
  2. 避免意外的副作用:在编写方法时,要明确方法是否会修改传入的对象状态,以避免意外的副作用。

4. 什么是字节流 字符流,有什么区别

  • 原理

  1. 字节流:以字节为单位进行数据的读写操作,主要用于处理二进制数据,如图片、音频、视频等。Java 中的字节流类都继承自 InputStreamOutputStream,如 FileInputStreamFileOutputStream
  2. 字符流:以字符为单位进行数据的读写操作,主要用于处理文本数据。Java 中的字符流类都继承自 ReaderWriter,如 FileReaderFileWriter

  • 要点

  1. 数据处理单位:字节流处理的是字节数据,适用于任何类型的数据;字符流处理的是字符数据,适用于文本数据。
  2. 字符编码和解码:字符流在读写时会进行字符编码和解码操作,而字节流不会。
  3. 读写效率:字符流的读写效率通常比字节流高,因为它一次可以处理多个字节组成的字符。

  • 应用

  1. 使用场景:在处理文本文件时,建议使用字符流,以避免字符编码问题;在处理二进制文件时,必须使用字节流。
  2. 字节流和字符流的转换:可以使用 InputStreamReaderOutputStreamWriter 进行字节流和字符流的转换。

5. 什么是静态内部类 匿名类,有什么区别

  • 原理

  1. 静态内部类:是定义在另一个类内部的类,使用 static 修饰。静态内部类不依赖于外部类的实例,可以直接创建对象。它只能访问外部类的静态成员。
  2. 匿名类:是一种没有显式名称的类,通常用于创建一个实现了某个接口或继承了某个类的对象。匿名类在创建时会立即实例化,并且只能使用一次。

  • 要点

  1. 类名和使用次数:静态内部类有自己的类名,可以在多个地方使用;匿名类没有类名,只能使用一次。
  2. 成员变量和方法:静态内部类可以有自己的成员变量和方法;匿名类通常只重写接口或父类的方法。
  3. 外部类实例依赖:静态内部类不依赖于外部类的实例;匿名类可以访问外部类的成员变量和方法(如果是局部匿名类,访问外部局部变量时,该变量必须是 finaleffectively final 的)。

  • 应用

  1. 静态内部类的使用场景:静态内部类可以用于封装一些与外部类相关的功能,提高代码的可读性和可维护性。
  2. 匿名类的使用场景:匿名类常用于事件处理、回调函数等场景,简化代码的编写。

6. 什么是 hashtable 和 hashmap,有什么区别

  • 原理

  1. Hashtable:是 Java 早期的哈希表实现,它继承自 Dictionary 类,并且是线程安全的。Hashtable 使用哈希算法来存储和查找键值对,通过键的哈希码来确定存储位置。
  2. HashMap:是 Java 1.2 引入的哈希表实现,它继承自 AbstractMap 类,不是线程安全的。HashMap 同样使用哈希算法来存储和查找键值对,当发生哈希冲突时,HashMap 使用链表或红黑树(Java 8 及以后)来处理。

  • 要点

  1. 线程安全性Hashtable 是线程安全的,而 HashMap 不是。因此,在多线程环境下,如果需要保证线程安全,可以使用 HashtableConcurrentHashMap;在单线程环境下,建议使用 HashMap,因为它的性能更高。
  2. null 值处理Hashtable 的键和值都不允许为 null,而 HashMap 的键和值都允许为 null
  3. 迭代器Hashtable 的迭代器是 Enumeration,而 HashMap 的迭代器是 Iterator

  • 应用

  1. HashMap 的优化:在 Java 8 中,HashMap 进行了优化,引入了红黑树来处理哈希冲突,当链表长度超过一定阈值时,会将链表转换为红黑树,提高了查找效率。
  2. 使用建议:在单线程环境下,优先使用 HashMap;在多线程环境下,如果对线程安全要求不高,可以使用 Collections.synchronizedMap() 方法将 HashMap 转换为线程安全的映射;如果对并发性能要求较高,建议使用 ConcurrentHashMap

7. 什么是匿名类

  • 原理

匿名类是一种没有显式名称的类,它是在创建对象的同时定义的。匿名类通常用于创建一个实现了某个接口或继承了某个类的对象,并且只能使用一次。

例如,以下是一个实现了 Runnable 接口的匿名类:

java

Runnable runnable = new Runnable() {
    @Override
    public void run() {
        System.out.println("Running in anonymous class");
    }
};

  • 要点

  1. 无类名和一次性使用:匿名类没有类名,只能使用一次。
  2. 实现接口或继承类:匿名类可以实现接口或继承类,并重写其中的方法。
  3. 访问外部类成员:匿名类可以访问外部类的成员变量和方法(如果是局部匿名类,访问外部局部变量时,该变量必须是 finaleffectively final 的)。

  • 应用

  1. 使用场景:匿名类常用于事件处理、回调函数等场景,简化代码的编写。
  2. Lambda 表达式替代:在 Java 8 及以后的版本中,Lambda 表达式可以替代部分匿名类的使用,使代码更加简洁。

8. 什么是 Hashtable

  • 原理

Hashtable 是 Java 早期的哈希表实现,它继承自 Dictionary 类,并且是线程安全的。Hashtable 使用哈希算法来存储和查找键值对,通过键的哈希码来确定存储位置。当发生哈希冲突时,Hashtable 使用链表来处理。

  • 要点

  1. 线程安全性Hashtable 是线程安全的,它的所有方法都是同步的,因此在多线程环境下可以保证数据的一致性。
  2. null 值处理Hashtable 的键和值都不允许为 null,如果尝试插入 null 键或 null 值,会抛出 NullPointerException
  3. 迭代器Hashtable 的迭代器是 Enumeration,它不支持快速失败机制。

  • 应用

  1. 性能开销:由于 Hashtable 的所有方法都是同步的,在单线程环境下会有较大的性能开销,因此在单线程环境下建议使用 HashMap
  2. 替代方案:在多线程环境下,如果需要更高的并发性能,可以使用 ConcurrentHashMap

9. 什么是 ConcurrentHashMap

  • 原理

ConcurrentHashMap 是 Java 1.5 引入的线程安全的哈希表实现,它继承自 AbstractMap 类。ConcurrentHashMap 在多线程环境下提供了高效的并发访问,它采用了分段锁(Java 7 及以前)或 CAS(Compare-And-Swap,Java 8 及以后)和 synchronized 相结合的机制来实现线程安全。

  • 要点

  1. 线程安全性和并发性能ConcurrentHashMap 是线程安全的,并且在多线程环境下具有较高的并发性能。
  2. null 值处理ConcurrentHashMap 的键和值都不允许为 null
  3. 弱一致性迭代器ConcurrentHashMap 的迭代器是弱一致性的,即迭代器在遍历过程中可能会反映出其他线程对映射所做的修改。

  • 应用

  1. Java 8 优化:在 Java 8 中,ConcurrentHashMap 进行了重大优化,放弃了分段锁机制,采用了 CAS 和 synchronized 相结合的方式,进一步提高了并发性能。
  2. 使用场景ConcurrentHashMap 适用于多线程环境下的读写操作频繁的场景,如缓存、计数器等。

10. 什么是 HashMap

  • 原理

HashMap 是 Java 1.2 引入的哈希表实现,它继承自 AbstractMap 类,不是线程安全的。HashMap 使用哈希算法来存储和查找键值对,通过键的哈希码来确定存储位置。当发生哈希冲突时,HashMap 使用链表或红黑树(Java 8 及以后)来处理。

  • 要点

  1. 非线程安全和高性能HashMap 不是线程安全的,在单线程环境下性能较高。
  2. null 值处理HashMap 的键和值都允许为 null
  3. 快速失败迭代器HashMap 的迭代器是快速失败的,即当在迭代过程中发现映射被其他线程修改时,会抛出 ConcurrentModificationException

  • 应用

  1. Java 8 优化:在 Java 8 中,HashMap 引入了红黑树来处理哈希冲突,当链表长度超过一定阈值(默认为 8)时,会将链表转换为红黑树,提高了查找效率。
  2. 使用建议:在单线程环境下,优先使用 HashMap;在多线程环境下,如果需要线程安全,可以使用 ConcurrentHashMapCollections.synchronizedMap() 方法将 HashMap 转换为线程安全的映射。

 

 友情提示:本文已经整理成文档,可以到如下链接免积分下载阅读

https://download.csdn.net/download/ylfhpy/90496302

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从 Snowflake 到 Databend Cloud:全球游戏平台借助 Databend 实现实时数据处理

导读&#xff1a;某全球游戏平台为全球数百万玩家提供实时的技能型游戏体验与无缝的实时互动。对该游戏平台而言&#xff0c;保持数据的实时更新和实时分析&#xff0c;对提升玩家互动和留存率至关重要。他们在使用 Snowflake 进行实时数据摄取和分析时遇到了重大挑战&#xff…

Docker搭建MySQL主从服务器

一、在主机上创建MySQL配置文件——my.cnf master服务器配置文件路径&#xff1a;/data/docker/containers/mysql-cluster-master/conf.d/my.cnf slave服务器配置文件路径&#xff1a; /data/docker/containers/mysql-cluster-master/conf.d/my.cnf master服务配置文件内容 …

C语言每日一练——day_12(最后一天)

引言 针对初学者&#xff0c;每日练习几个题&#xff0c;快速上手C语言。第十二天。&#xff08;最后一天&#xff0c;完结散花啦&#xff09; 采用在线OJ的形式 什么是在线OJ&#xff1f; 在线判题系统&#xff08;英语&#xff1a;Online Judge&#xff0c;缩写OJ&#xff0…

10、STL中的unordered_map使用方法

一、了解 1、unordered_map(哈希) unordered_map是借用哈希表实现的关联容器。 访问键值对O&#xff08;1&#xff09;&#xff0c;最坏情况O&#xff08;n&#xff09;&#xff0c;例如哈希冲突严重时。【n是一个哈希桶的元素数量】 unordered_map特性 键值对存储&#xff…

本地部署deepseek-r1建立向量知识库和知识库检索实践【代码】

目录 一、本地部署DS 二、建立本地知识库 1.安装python和必要的库 2.设置主目录工作区 3.编写文档解析脚本 4.构建向量数据库 三、基于DS,使用本地知识库检索 本地部署DS,其实非常简单,我写了一篇操作记录,我终于本地部署了DeepSeek-R1(图文全过程)-CSDN博客 安装…

监控视频联网平台在智慧水利中的应用

随着智慧城市建设的深入推进&#xff0c;智慧水利作为其中的重要组成部分&#xff0c;正逐步实现数字化、智能化和网络化转型。在这一过程中&#xff0c;监控视频联网平台凭借其高效的数据采集、传输与分析能力&#xff0c;成为智慧水利建设的关键技术支撑。以下是监控视频联网…

深入解析素数筛法:从埃氏筛到欧拉筛的算法思想与实现

素数筛法是一种用于高效生成素数的算法。常见的素数筛法包括埃拉托斯特尼筛法&#xff08;埃氏筛&#xff09;和欧拉筛&#xff08;线性筛&#xff09;。下面我们将详细讲解这两种筛法的思想&#xff1a; 一、 埃拉托斯特尼筛法&#xff08;埃氏筛&#xff09; 思想&#xff1…

ubuntu20.04系统没有WiFi图标解决方案_安装Intel网卡驱动

文章目录 1. wifi网卡配置1.1 安装intel官方网卡驱动backport1.1.1 第四步可能会出现问题 1.2 ubuntu官方的驱动1.3 重启 1. wifi网卡配置 我的电脑是华硕天选4&#xff08;i7&#xff0c;4060&#xff09;&#xff0c;网卡型号intel ax201 ax211 ax210通用。 参考文章&#…

网络编程---多客户端服务器

写一个服务器和两个客户端 运行服务器和2个客户端&#xff0c;实现聊天功能 客户端1 和 客户端2 进行聊天 客户端1将聊天数据发送给服务器 服务器将聊天数据转发给客户端2 要求&#xff1a; 服务器使用 select 模型实现 客户端1使用 poll 模型实现 客户端2使用 多线程实现…

LeetCode 2614.对角线上的质数:遍历(质数判断)

【LetMeFly】2614.对角线上的质数&#xff1a;遍历(质数判断) 力扣题目链接&#xff1a;https://leetcode.cn/problems/prime-in-diagonal/ 给你一个下标从 0 开始的二维整数数组 nums 。 返回位于 nums 至少一条 对角线 上的最大 质数 。如果任一对角线上均不存在质数&…

红日靶场(二)——个人笔记

靶场搭建 新增VMnet2网卡 **web&#xff1a;**需要配置两张网卡&#xff0c;分别是外网出访NAT模式和内网域环境仅主机模式下的VMnet2网卡。 **PC&#xff1a;**跟web一样&#xff0c;也是需要配置两张网卡&#xff0c;分别是外网出访NAT模式和内网域环境仅主机模式下的VMn…

实时视频分析的破局之道:蓝耘 MaaS 如何与海螺 AI 视频实现高效协同

一、蓝耘 MaaS 平台&#xff1a;AI 模型全生命周期管理的智能引擎 蓝耘 MaaS&#xff08;Model-as-a-Service&#xff09;平台是由蓝耘科技推出的 AI 模型全生命周期管理平台&#xff0c;专注于为企业和开发者提供从模型训练、推理到部署的一站式解决方案。依托云原生架构、高…

走进Java:String字符串的基本使用

❀❀❀ 大佬求个关注吧~祝您开心每一天 ❀❀❀ 目录 一、什么是String 二、如何定义一个String 1. 用双引号定义 2. 通过构造函数定义 三、String中的一些常用方法 1 字符串比较 1.1 字符串使用 1.2 字符串使用equals() 1.3 使用 equalsIgnoreCase() 1.4 cpmpareTo…

python系列之元组(Tuple)

不为失败找理由&#xff0c;只为成功找方法。所有的不甘&#xff0c;因为还心存梦想&#xff0c;所以在你放弃之前&#xff0c;好好拼一把&#xff0c;只怕心老&#xff0c;不怕路长。 python系列之元组&#xff08;Turple&#xff09; 一、元组是什么&#xff1f;——给新手的…

破解验证码新利器:基于百度OCR与captcha-killer-modified插件的免费调用教程

破解验证码新利器&#xff1a;基于百度OCR与captcha-killer-modified插件的免费调用教程 引言 免责声明&#xff1a; 本文提供的信息仅供参考&#xff0c;不承担因操作产生的任何损失。读者需自行判断内容适用性&#xff0c;并遵守法律法规。作者不鼓励非法行为&#xff0c;保…

批量删除 PPT 中的所有图片、某张指定图片或者所有二维码图片

PPT 文档中的图片如何删除呢&#xff1f;相信很多小伙伴或碰到类似的需求。比如我们需要删除 PPT 文档中的某一张图片或者某张二维码图片&#xff0c;如果每一页都有这张图片&#xff0c;或者有很多 ppt 都有同一张要删除的图片&#xff0c;我们应该怎么快速的完成删除呢&#…

大模型开发(六):LoRA项目——新媒体评论智能分类与信息抽取系统

LoRA项目——新媒体评论智能分类与信息抽取系统 0 前言1 项目介绍1.1 项目功能1.2 技术原理1.3 软硬件环境1.4 项目结构 2 数据介绍与处理2.1 数据集介绍2.2 数据处理2.3 数据导入器 3 模型训练3.1 配置文件3.2 工具函数3.3 模型训练3.4 模型评估 4 模型推理 0 前言 微调里面&…

mysql-innodb存储引擎主键索引叶子结点数据结构(非单纯的双向链表)

我们应该清楚行记录是放在页中的。 compact行记录格式&#xff1a; 主要介绍几个比较重要的参数 heap_no&#xff1a; 页号 record_type&#xff1a; 0 表示普通类型&#xff08;叶子结点&#xff09;&#xff0c;1表示B树的非叶子节点 &#xff0c;2 表示最小记录&#xff…

物联网为什么用MQTT不用 HTTP 或 UDP?

先来两个代码对比&#xff0c;上传温度数据给服务器。 MQTT代码示例 // MQTT 客户端连接到 MQTT 服务器 mqttClient.connect("mqtt://broker.server.com:8883", clientId) // 订阅特定主题 mqttClient.subscribe("sensor/data", qos1) // …

Vmware中的centos7连接上网

有很多刚刚开始配置了centos7&#xff0c;然后发现不能上网现在来解决这个问题。 测试能不能上网 先还原这个设置&#xff0c;如果没有动过的话就不用&#xff0c;连接模式是NAT模式 然后进去设置网络环境&#xff0c;记得是用超级用户设置 vi /etc/sysconfig/network-script…