就只说 3 个 Java 面试题

在面试时,即使是经验丰富的开发人员,也可能会发现这是一些很棘手的问题:

1、Java中"transient"关键字的用途是什么?如何才能实现这一目标?

在 Java 中,"transient"关键字用于指示类的特定字段不应包含在对象的序列化形式中。

这意味着当对象被序列化时,其状态将转换为可以写入文件或通过网络发送的字节序列。

通过将字段标记为瞬态,您就告诉 Java 在序列化对象时不应包含该字段的值。

您可能想要使用"transient"关键字的原因有多种。例如,您可能有一个包含临时值的字段,在序列化对象时不需要保留该临时值。或者,可能有一个字段包含敏感数据,出于安全原因,这些数据不应包含在对象的序列化形式中。

java 复制代码
public class MyClass implements Serializable {  
    private int myInt;  
    private transient String myTransientString;  
    // 构造器、getters & setters
    // 其他方法......  
}

在这个例子中,字段"myTransientString"被标记为transient,这意味着当MyClass的实例被序列化时,它的值将不会被包含在内。

2、你能解释一下"继承"和"组合"有何不同吗?举例说明。**

继承和组合是在面向对象编程中创建类之间关系的两种基本方法。这两种方法都支持代码重用和抽象,但它们的实现以及在类之间创建的关系类型有所不同。

以下是每种方法的简要概述:

  • 继承:这是一种通过从现有类派生属性和特征来创建新类的机制。新类(称为子类或派生类)继承现有类(称为超类或基类)的方法和字段。子类还可以重写超类的方法以提供自己的实现。继承在超类和子类之间创建了"is-a"关系。
  • 组合:它是一种机制,其中一个类包含另一个类的一个或多个实例作为其字段。所包含的类称为组件或零件类。包含组件类的类称为容器或整个类。该组合在容器类和组件类之间创建了"has-a"关系。

在图中,我们有两个类:"Vehicle"和"Engine"。 Vehicle 类可以使用继承或组合来合并 Engine 类。

  • 继承示例:Vehicle类扩展了Engine类,这意味着它继承了Engine类的所有字段和方法。这会在 Vehicle 和 Engine 类之间创建"is-a"关系,其中 Vehicle "是一种"类型的 Engine。
java 复制代码
public class Vehicle extends Engine {  
  
}
  • 组合示例:Vehicle 类包含 Engine 类的一个实例作为其字段。这在车辆和引擎类之间创建了"有一个"关系,其中车辆"有一个"引擎。
java 复制代码
public class Vehicle {  
    private Engine engine;  
    public Vehicle(Engine engine) {  
    this.engine = engine;  
}  
...
}

一般来说,当类之间存在明确的"is-a"关系,并且子类可以被视为超类的专门版本时,继承更合适。当类之间存在"has-a"关系时,以及当容器类需要使用或管理另一个类的一个或多个实例时,组合更为合适。

3、你能解释一下Java中HashSet和TreeSet的区别吗?另外,解释一下数据是如何在内部存储的。

假设我们有以下整数数据:{7, 3, 9, 4, 1, 8}。

  • 对于HashSet,数据内部存储在哈希表中。哈希表使用每个元素的 hashCode() 方法来确定应存储该元素的唯一索引。

在上面的示例图中,哈希表有八个桶,标记为"51"到"56"。每个存储桶都是一个集合,其中包含具有映射到该存储桶的哈希码的元素。例如,索引"53"处的集合包含元素 3 和 4,它们的哈希码都是 [197]。索引"56"处的集合包含元素 7、8 和 9,它们都有哈希码 [195]。

  • 对于TreeSet,数据内部存储在红黑树中。树根据元素的自然顺序或传递给 TreeSet 构造函数的自定义比较器定义的顺序进行排序。以下是如何将数据存储在红黑树中的示例:

在这个例子中,红黑树有六个节点,每个节点包含元素{1,3,4,7,8,9}之一。节点颜色为红色或黑色,红色节点表示发生了违反红黑树属性的情况。元素在树中按排序顺序存储,较小的元素位于左侧,较大的元素位于右侧。例如,元素1是最小的元素,存储在最左边的叶子节点,而元素9是最大的元素,存储在最右边的叶子节点。

相关推荐
diediedei4 分钟前
C++编译期正则表达式
开发语言·c++·算法
学海无涯书山有路11 分钟前
Android FragmentContainerView 新手详解(Java 版)
android·java·开发语言
夏鹏今天学习了吗16 分钟前
【LeetCode热题100(97/100)】二叉搜索树中第 K 小的元素
算法·leetcode·职场和发展
炽烈小老头25 分钟前
【 每天学习一点算法 2026/01/26】缺失数字
学习·算法
小桃酥ღ33 分钟前
[力扣每日习题][1339]. 分裂二叉树的最大乘积 2026.01.07
算法·leetcode·职场和发展
XiYang-DING1 小时前
【Java SE】数据类型、变量、类型转换、运算符以及程序逻辑控制
java·开发语言
闻哥1 小时前
Redis 避坑指南:从命令到主从的全链路踩坑实录
java·数据库·redis·缓存·面试·springboot
Jinkxs1 小时前
基于 Java 的消息队列选型年度总结:RabbitMQ、RocketMQ、Kafka 实战对比
java·kafka·java-rocketmq·java-rabbitmq
独自破碎E1 小时前
JDK版本的区别
java·开发语言
hrrrrb2 小时前
【算法设计与分析】贪心算法
算法·贪心算法·代理模式