面试踩过的坑

news2025/7/14 0:04:41

1、 “==”和equals 的区别

  • “==”是运算符,如果是基本数据类型,则比较存储的值;如果是引用数据类型,则比较所指向对象的地址值
  • equals是Object的方法,比较的是所指向的对象的地址值,一般情况下,重写之后比较的是对象的值

ps:问的是:int a = 3;if(a==3){},比较的是值还是内存地址。这个忘了,想到另一个概念整数常量池,是自己想多了,和整数常量池的问题记混了,看到a==3,就想着3不会在内存中新建。傻了,这里再说下在方法中int a = 3。a和3(基本类型)都是保存在栈中的,引用类型对象才会在栈中存堆的内存地址。所以==比较基本类型时只能比较值,没有什么内存地址给你比较。

下面代码

Integer a = 3;//自动装箱:等价于 Integer.valueOf(3)
System.out.println(a==3);
Integer b = new Integer(4);
System.out.println(b==4);

结果是true ,true,虽然Integer是个整数对象,不是基本类型,按理说要比较内存地址,这里应该比较内存了,但是Integer和int一起运算时会拆包成基本类型,所以比的还是值。

Integer p = new Integer(5);
Integer q = new Integer(5);
System.out.println(p == q);  // 输出 false(显式创建新对象)

这里比较的都是引用类型,比较就是内存地址了。 

2、整数常量池

Integer  i = 123;
Integer  i2 = 123;
System.out.println(i==i2);

Integer  i3 = 129;
Integer  i4 = 129;
System.out.println(i3==i4);

输出结果:

true
false

解释如下:

整数常量池的作用场景

  1. 自动装箱(Autoboxing)

    • 当将基本类型 int 转换为包装类 Integer 时(比如赋值给 Integer 变量,或存入集合类),Java 会尝试复用常量池中已缓存的 Integer 对象,而不是每次都创建新对象。

    • 例如:

      Integer a = 100; // 自动装箱,使用常量池中的对象 Integer b = 100; System.out.println(a == b); // 输出 true(同一对象)

  2. 手动创建 Integer 对象

    • 如果直接通过 new Integer() 创建对象,会强制生成新实例,绕过常量池:

      Integer c = new Integer(100); Integer d = new Integer(100); System.out.println(c == d); // 输出 false(不同对象)
      
  3. 超出缓存范围的情况

  4. 当数值超出 -128~127 范围时,即使通过自动装箱,也会生成新对象:

    Integer e = 200;

    Integer f = 200;

    System.out.println(e == f); // 输出 false(超出缓存范围)

 整数常量池的实现原理

Java 在 Integer 类中通过静态内部类 IntegerCache 实现缓存

private static class IntegerCache {
    static final int low = -128;
    static final int high; // 默认 127,可通过 JVM 参数调整
    static final Integer[] cache;
    
    static {
        // 初始化缓存数组
        high = 127;
        cache = new Integer[(high - low) + 1];
        for (int i = 0; i < cache.length; i++) {
            cache[i] = new Integer(i - 128);
        }
    }
}

通过 Integer.valueOf(int) 方法获取 Integer 对象时,会优先从缓存中取:

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + 128];
    return new Integer(i);
}

3 整数塞入map后怎么存放值的

Stdent zzw = new Stdent("zzw", 15);
Map<String ,Object> map = new HashMap<>();
map.put("stu", zzw);
Integer i =new Integer(22);
map.put("size",i);
System.out.println(map);
i =new Integer(33);
zzw.age =20;
System.out.println(map);
static class Stdent{
    public String name ;
    public int age ;

    public Stdent(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Stdent{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

结果:

{size=22, stu=Stdent{name='zzw', age=15}}
{size=22, stu=Stdent{name='zzw', age=20}}

这里为什么age变了,size没有变?

标下每个变量在内存中怎么存的

关键解释

  1. 对象存储位置

    • new Stdent("zzw", 15) 和 new Integer(22) 是对象实例,存储在堆中。

    • 它们的地址分别是 0x100 和 0x200(假设的内存地址)。

  2. 引用变量存储位置

    • zzw 和 i 是引用变量,存储在栈中。

    • 它们的值是堆中对象的地址(如 zzw = 0x100)。

  3. put 操作存储的内容

    • map.put("stu", zzw) 和 map.put("size", i) 存入的是 堆中对象的地址(即 0x100 和 0x200),而不是变量 zzw 或 i 的栈地址。

    • Map 的键值对中存储的是实际对象的引用。

然后后面改变值的时候,zzw.age =20 ,只是改变stu对象里的值,map的引用并不变,就是stu存的还是student对象在堆中的内存地址,所以后面打印的会变。那为什么map中的size的输出不变呢。因为Intger对象是final修饰的,这个对象不可以修改,i =new Integer(33);后面半句会在堆中建一个新的内存地址,然后前半句把i在栈中存的内存地址换成这个新的,但是map里存的还是之前对象的地址。所以不会输出不会变。

4、map的操作都是深拷贝还是浅拷贝?

上个例子其实可以看出来,zzw.age=20,然后map里的stu里的age也跟着变了,所以map的put方法是个浅拷贝,问了下deepseek告诉我map的操作几乎都是浅拷贝,那我想putall也是了?

Stdent zzw = new Stdent("zzw", 15);
Map<String ,Object> map = new HashMap<>();
map.put("stu", zzw);
map.put("size",22);
Map<String ,Object> map2 = new HashMap<>();
map2.putAll(map);
map.clear();
System.out.println(map);
System.out.println(map2);

结果是

{}
{size=22, stu=Stdent{name='zzw', age=15}} 

 deepseek给的解释

3. map2.putAll(map)

ok,所以clear只是清除map在堆中的信息,切断了这个map和stu和整数对象的引用。

但是map2还是没有变,不是说浅拷贝,map2和map就指向同一个内存地址.

Stdent zzw = new Stdent("zzw", 15);
Map<String ,Object> map = new HashMap<>();
map.put("stu", zzw);
map.put("size",22);
Map<String ,Object> map2 = map;
map.clear();
System.out.println(map);
System.out.println(map2);

结果:

{}
{}

再看一个

Stdent zzw = new Stdent("zzw", 15);
Map<String ,Object> map = new HashMap<>();
map.put("stu", zzw);
map.put("size",22);
Map<String ,Object> map2 = new HashMap<>();
map2.putAll(map);
Stdent zzw2 = new Stdent("zzw2", 30);
map.put("stu", zzw2);
map.put("size", 32);
System.out.println(map);
System.out.println(map2);

 结果:

{size=32, stu=Stdent{name='zzw2', age=30}}
{size=22, stu=Stdent{name='zzw', age=15}}

所以结论就是

Map<String ,Object> map2 = new HashMap<>();
map2.putAll(map);

这里有个2个关键点,1:这里我new了一个map,在堆中新建了内存地址,和之前map不是同一个了,但是2:map里面的对象没有重新new一个新的,还是复用,只是大家(map和map2)都指向这些对象的内存地址。

然后clear只是清空这个map在堆中的内容,他存的对象不回清理。

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

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

相关文章

多物理场耦合低温等离子体装置求解器PASSKEy2

文章目录 PASSKEy2简介PASSKEY2计算流程PASSKEy2 中求解的物理方程电路模型等离子体模型燃烧模型 PASSKEy2的使用 PASSKEy2简介 PASSKEy2 是在 PASSKEy1 的基础上重新编写的等离子体数值模拟程序。 相较于 PASSKEy1&#xff0c; PASSKEy2 在具备解决低温等离子体模拟问题的能力…

视频噪点多,如何去除画面噪点?

你是否遇到过这样的困扰&#xff1f;辛辛苦苦拍摄的视频&#xff0c;导出后却满屏 “雪花”&#xff0c;夜景变 “噪点盛宴”&#xff0c;低光环境秒变 “马赛克现场”&#xff1f; 无论是日常拍摄的vlog、珍贵的家庭录像&#xff0c;还是专业制作的影视作品&#xff0c;噪点问…

09前端项目----分页功能

分页功能 分页器的优点实现分页功能自定义分页器先实现静态分页器调试分页器动态数据/交互 Element UI组件 分页器的优点 电商平台同时展示的数据很多&#xff0c;所以采用分页功能实现分页功能 Element UI已经有封装好的组件&#xff0c;但是也要掌握原理&#xff0c;以及自定…

第十二届蓝桥杯 2021 C/C++组 直线

目录 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 思路&#xff1a; 核心思路&#xff1a; 两点确定一条直线&#xff1a; 思路详解&#xff1a; 代码&#xff1a; 第一种方式代码详解&#xff1a; 第二种方式代码详解&#xff1a; 题目&#xff1a;…

《Piper》皮克斯技术解析:RIS系统与云渲染如何创造奥斯卡级动画短片

本文由专业专栏作家 Mike Seymour 撰写&#xff0c;内容包含非常有价值的行业资讯。 译者注 《Piper》是皮克斯动画工作室的一部技术突破性的短片&#xff0c;讲述了一只小鸟在海滩上寻找食物并面对自然挑战的故事。它不仅凭借其精美的视觉效果和细腻的情感表达赢得了2017年奥…

Java在excel中导出动态曲线图DEMO

1、环境 JDK8 POI 5.2.3 Springboot2.7 2、DEMO pom <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</version></dependency><dependency><groupId>commons…

Kotlin Multiplatform--02:项目结构进阶

Kotlin Multiplatform--02&#xff1a;项目结构进阶 引言正文 引言 在上一章中&#xff0c;我们对 Kotlin Multiplatform 项目有了基本的了解&#xff0c;已经可以进行开发了。但我们只是使用了系统默认的项目结构。本章介绍了如何进行更复杂的项目结构管理。 正文 在上一章中&…

代码随想录算法训练营第五十八天 | 1.拓扑排序精讲 2.dijkstra(朴素版)精讲 卡码网117.网站构建 卡码网47.参加科学大会

1.拓扑排序精讲 题目链接&#xff1a;117. 软件构建 文章讲解&#xff1a;代码随想录 思路&#xff1a; 把有向无环图进行线性排序的算法都可以叫做拓扑排序。 实现拓扑排序的算法有两种&#xff1a;卡恩算法&#xff08;BFS&#xff09;和DFS&#xff0c;以下BFS的实现思…

linux ptrace 图文详解(七) gdb、strace跟踪系统调用

目录 一、gdb/strace 跟踪程序系统调用 二、实现原理 三、代码实现 四、总结 &#xff08;代码&#xff1a;linux 6.3.1&#xff0c;架构&#xff1a;arm64&#xff09; One look is worth a thousand words. —— Tess Flanders 相关链接&#xff1a; linux ptrace 图…

【前端】ES6 引入的异步编程解决方案Promise 详解

Promise 详解 1. 基本概念 定义&#xff1a;Promise 是 ES6 引入的异步编程解决方案&#xff0c;表示一个异步操作的最终完成&#xff08;或失败&#xff09;及其结果值。核心作用&#xff1a;替代回调函数&#xff0c;解决“回调地狱”问题&#xff0c;提供更清晰的异步流程控…

const(C++)

打印出来的结果是 a是12 *p是200 const修饰指针 const修饰引用

python21-循环小作业

课程&#xff1a;B站大学 记录python学习&#xff0c;直到学会基本的爬虫&#xff0c;使用python搭建接口自动化测试就算学会了&#xff0c;在进阶webui自动化&#xff0c;app自动化 循环语句小作业 for-in作业斐波那契 for 固定数值计算素数字符统计数字序列range 函数 水仙花…

小白电路设计-设计11-恒功率充电电路设计

介绍 作为电子信息工程的我&#xff0c;电路学习是一定要学习的&#xff0c;可惜目前作为EMC测试工程师&#xff0c;无法兼顾太多&#xff0c;索性不如直接将所学的知识进行运用&#xff0c;并且也可以作为契机&#xff0c;进行我本人的个人提升。祝大家与我一起进行提升。1.本…

Spring AI 快速入门:从环境搭建到核心组件集成

Spring AI 快速入门&#xff1a;从环境搭建到核心组件集成 一、前言&#xff1a;Java开发者的AI开发捷径 对于Java生态的开发者来说&#xff0c;将人工智能技术融入企业级应用往往面临技术栈割裂、依赖管理复杂、多模型适配困难等挑战。Spring AI的出现彻底改变了这一局面——…

http://noi.openjudge.cn/——2.5基本算法之搜索——200:Solitaire

文章目录 题目宽搜代码总结 题目 总时间限制: 5000ms 单个测试点时间限制: 1000ms 内存限制: 65536kB 描述 Solitaire is a game played on a chessboard 8x8. The rows and columns of the chessboard are numbered from 1 to 8, from the top to the bottom and from left t…

架构师面试(三十六):广播消息

题目 在像 IM、短视频、游戏等实时在线类的业务系统中&#xff0c;一般会有【广播消息】业务&#xff0c;这类业务具有瞬时高流量的特点。 在对【广播消息】业务实现时通常需要同时写 “系统消息库” 和更新用户的 “联系人库” 的操作&#xff0c;用户的联系人表中会有未读数…

TortoiseGit使用图解

前言 记录GitTortoiseGit使用&#xff0c;记录下开发中常用命令&#xff0c;健忘时用到方知好。 TortoiseGit使用 图解 commit-提交代码 pull-拉取远程分支最新代码 push-将本地分支代码推送到远程分支 show log-查看分支提交记录 show log - 切换分支查看 show log - 远程分…

【时时三省】(C语言基础)循环程序举例

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 例题: 用公式4/π≈1-3/1+5/1-7/1+...求π的近似值,直到发现某一项的绝对值小于10的-6次方为止(该项不累加)。 解题思路: 这是求值的近似方法中的一种。求π值可以用不同的近似方法。如下面的表达式都可以…

珍爱网:从降本增效到绿色低碳,数字化新基建价值凸显

2024年12月24日&#xff0c;法大大联合企业绿色发展研究院发布《2024签约减碳与低碳办公白皮书》&#xff0c;深入剖析电子签在推动企业绿色低碳转型中的关键作用&#xff0c;为企业实现环境、社会和治理&#xff08;ESG&#xff09;目标提供新思路。近期&#xff0c;法大大将陆…

电子电子架构 --- 主机厂视角下ECU开发流程

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…