金三银四面试题(十四):Java基础问题(5)

这部分面试题多用于面试的热身运动,对很多找实习和准备毕业找工作的小伙伴至关重要。

避免序列化

可以使用transient 关键字修饰不想进行序列化的变量。

transient 关键字的作用是:阻止实例中那些用此关键字修饰的变量序列化;当对象被反序列化时,被transient 修饰的变量值不会被持久化和恢复。

注意transient 只能修饰变量,不能修饰类和方法。

强弱软虚四种引用

  1. 强引用

    强引用是平常中使用最多的引用,强引用在程序内存不足(OOM)的时候也不会被回收

  2. 软引用

    软引用在程序内存不足时,会被回收,

    // 注意:wrf 这个引用也是强引用,它是指向SoftReference 这个对象的,
    // 这里的软引用指的是指向new String("str")的引用,也就是SoftReference 类中T
    SoftReference wrf = new SoftReference(new String("str"));

创建缓存的时候,创建的对象放进缓存中,当内存不足时,JVM 就会回收早先创建的对象。

  1. 弱引用
    弱引用就是只要JVM 垃圾回收器发现了它,就会将之回收,

    WeakReference wrf = new WeakReference(str);

  2. 虚引用
    虚引用的回收机制跟弱引用差不多,但是它被回收之前,会被放入ReferenceQueue
    中。注意哦,其他引用是被JVM 回收后才被传入中的。由于
    这个机制,所以虚引用大多
    被用于引用销毁前的处理工作。还有就是,虚引用创建的时候,必须带有ReferenceQueue

    PhantomReference prf = new PhantomReference(new String("str"),new ReferenceQueue<>());

深拷贝和浅拷贝

浅拷贝(shallowCopy)只是增加了一个指针指向已存在的内存地址,

深拷贝(deepCopy)是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个

新的内存,

使用深拷贝的情况下,释放内存的时候不会因为出现浅拷贝时释放同一个内存的错误。

最好是结合克隆以及原型模式联系在一起哈,记得复习的时候,把这几个联系起来的。

sublist方法

这个之前面腾讯被问过。

List 接口提供了一个名为 subList(int fromIndex, int toIndex) 的方法,用于获取原始列表中从 fromIndex(包括)到 toIndex(不包括)之间的子列表。这个子列表是原始列表的一个视图,对子列表的修改会影响原始列表,反之亦然。

这个方法的用法如下:

java 复制代码
import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        ArrayList<Integer> originalList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            originalList.add(i);
        }

        // 获取子列表(包括第3个元素,不包括第7个元素)
        List<Integer> subList = originalList.subList(2, 7);

        System.out.println("Original List: " + originalList);
        System.out.println("Sub List: " + subList);

        // 修改子列表
        subList.set(0, 100);
        System.out.println("Original List after modifying Sub List: " + originalList);
        System.out.println("Sub List after modifying: " + subList);

        // 修改原始列表
        originalList.set(3, 200);
        System.out.println("Original List after modifying: " + originalList);
        System.out.println("Sub List after modifying Original List: " + subList);
    }
}

我们创建了一个包含0到9的整数的 ArrayList,然后使用 subList() 方法获取了一个子列表,从索引2(包括)到索引7(不包括)。修改子列表或原始列表都会相互影响。

往期文章

金三银四面试题(十三):Java基础问题(4)2024-04-03

金三银四面试题(十二):Java基础问题(3)2024-04-02

金三银四面试题(十一):Java基础问题(2)2024-04-01

金三银四面试题(十):Java基础问题(1)2024-03-31

金三银四面试题(九):JVM常见面试题(3)2024-03-30

金三银四面试题(八):JVM常见面试题(2)2024-03-30

金三银四面试题(七):JVM常见面试题(1)2024-03-28

金三银四面试题(六):对象大小知多少2024-03-27

金三银四面试题(五):JVM之TLAB2024-03-26

金三银四面试题(四):Full GC 和 Minor GC2024-03-25

相关推荐
guodingdingh2 小时前
软件开发工作问题总结0718
java·开发语言·数据库
咖啡八杯4 小时前
GoF设计模式——解释器模式
java·后端·spring·设计模式
优橙教育4 小时前
5G网优培训 vs Java开发:转行选哪个?
java·开发语言·5g
糖果店的幽灵4 小时前
【DeepAgents 从入门到精通】Context Management 上下文管理
java·人工智能·后端·spring·中间件·langgraph·deepagents
腻害兔6 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
SeaTunnel6 小时前
从 Python Script 地狱到标准化数据集成框架
大数据·开发语言·python·程序员·代码·seatunnel
碎光拾影6 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
Marst Code7 小时前
(python)2026Plotly 库评估:交互式可视化到底值不值得引入?
开发语言·python
Miao121317 小时前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施
java·开发语言
腻害兔7 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:支付模块 yudao-module-pay,一个让产品经理都看懂的支付中台设计
java·前端·vue.js·产品经理·ai编程