[2025.2.23] 周记

news/2025/2/23 17:19:22/文章来源:https://www.cnblogs.com/MingHaiZ/p/18732420

引言

在这周的面试当中,我遇到了几个不是很清楚的题目,回家之后进行学习发现了一些比较有意思的事情,在这里记录一下

这周还发现了一个很有帮助的Java知识网站:Java 基础 - 面向对象 | Java 全栈知识体系

1.字符串和常量池

在这次面试当中遇到的一个原题就是

String i = "i"和new String("i")一样吗?如果不一样,为什么?

在面试的时候我因为之前没去研究过这个所以不知道怎么回答,于是我就随便写了个一样,前者隐式调用了构造器(什么JB,乱回答)

在面试结束之后我回去学习了一下,答案是这两个表达式其实是不一样的,这就涉及到了String和虚拟机了

首先我们打开String源码进行查看
img

这里我们看到String字符其实是一个final修饰的Object,final修饰符修饰一个类代表了这个类不能被继承,这里还使用final修饰了value这个char类型的数组(这里还会扩展出自JDK9之后底层改用byte数组实现,大致就是拉丁字符更省空间,如果在中文比较少的情况下是大概节省了一半空间的,这里可以具体去了解一下)

这里我们就可以知道String其实是一个不可变的常量,那么String i = "i"到底做了什么呢?

答案就是在Jvm虚拟机当中的方法池里有一个常量池,这里是阅读了<<深入理解JVM虚拟机>>这本书的第二部分之后看到的
img

String在常量池里找有没有这个字符串,如果没有则添加到常量池并且将当前引用指向字符串的地址

new String("i")则是先检查常量池,如果常量池有则新建一个对象并且拷贝字符,所以new String的内存地址是不在常量池的,如果常量池没有这个字符则向常量池添加这个字符再拷贝新建对象到方法堆里,也就是说无论如何都会新建一个对象.

之前也做过测试,如果有两个s1 , s2,他们都是字面赋值的同一个字符,那么他们的内存地址引用时一样的,也就是说返回的时true(这里只是验证,平时不推荐使用来对比引用对象),同样的字符字面赋值和new出来的String对象的内存地址是不一样的.

Integer的缓存池

在学习常量池的时候还发现一个比较有意思的事情,就是关于int类型的包装类型Integer在常量池里有IntegerCache缓存池(-128,127)

也就是说当Integer赋值为

Integer i = 127
Integer i1 = 127

类似于这种赋值,按理来说valueof两个int值是两个新的对象,但是有缓存池的存在所以这两个引用对象的内存地址是一样的,也就是说==返回的是true

但是如果使用new Integer的话那么就是新建一个对象了,不指向缓存池里的地址了.

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv5 的量化及部署 - RGB 专题

技术背景 YOLOv5 是一种高效的目标检测算法,尤其在实时目标检测任务中表现突出。YOLOv5 通过三种不同尺度的检测头分别处理大、中、小物体;检测头共包括三个关键任务:边界框回归、类别预测、置信度预测;每个检测头都会逐像素地使用三个 Anchor,以帮助算法更准确地预测物体…

Java基础学习(十七)

Java基础学习(十七):网络编程 目录Java基础学习(十七):网络编程概念IP端口号协议UDP 通信TCP 通信 本文为个人学习记录,内容学习自 黑马程序员概念定义:在网络通信协议下,不同计算机上运行的程序进行的数据传输 常见的软件架构:C/S 和 B/SC/S:Client/Server,在用户…

最小费用最大流问题的 SSP 算法

我们已经了解最大流问题,其目标是通过网络中的各条边传输流量,尽可能地从源点流向汇点。通过经典的算法,如 Ford-Fulkerson 增广,我们能够找到一种方式,最大化从源点到汇点的流量。 然而,最大流问题的基本形式并没有考虑流动的成本。一个图的最大流值是一个固定数,可以由…

逆向软件设计-扫雷(C语言)

本人选用了舍友开发的C语言扫雷游戏用以学习逆向软件设计,环境为vs2022 在该程序中,代码被分成了三个部分,分别是game的头文件和源文件,以及test的源文件 在game的头文件中,代码主要包括了游戏的基本信息和函数 #include<stdio.h> #include<stdlib.h> #includ…

将一个数组旋转 k 步

题目:将一个数组旋转 k步。如输入一个数组[1,2,3,4,5,6,7] 和 k = 3, 即旋转 3步。输出 [5,6,7,1,2,3,4] 解题思路:思路1: 把k 后面的元素,挨个pop,然后unshif 到数组前面 思路2: 将 k 后面的所有数据拿出来作为 part1 将 k前面的所有数据拿出来作为part2 返回 part1.conca…

bge-large-zh-v1.5 和 bge-reranker-large模型有什么区别和联系

BGE(BAAI General Embedding)系列模型是智源研究院开发的高性能语义表征工具,其中bge-large-zh-v1.5和bge-reranker-large是两类不同功能的模型。它们的区别和联系如下:核心区别功能定位bge-large-zh-v1.5:属于Embedding模型,主要用于将文本(如句子或段落)转换为高维向…

整数二分查找

整数二分 二分的本质不是单调性 有单调性一定可以二分 可以二分不一定有单调性 二分的本质是边界 -1记得+1 +1不用再补

输入菜单关键字,遍历匹配到 menuIds,展开 匹配节点 的所有父节点以及 匹配节点 本身,高亮 匹配节点

菜单检索,名称、地址、权限标志 等 关键字匹配、展开、高亮(全程借助 DeepSeek ) 便捷简洁的企业官网 的后台菜单管理,图示:改造点:(1)修改 bootstrapTreeTable 的节点class命名方式为:treegrid-{item[options.id]},即采用id作为节点的唯一标识; (2)展开所有父节点 …

动手学大模型应用开发,第5天:大模型评估

第一章、验证迭代的一般思路 根据前文所讲解的大模型开发流程,我们可以发现,以调用、发挥大模型为核心的大模型开发相较传统的 AI 开发更注重验证迭代。由于你可以快速构建出基于 LLM 的应用程序,在几分钟内定义一个 Prompt,并在几小时内得到反馈结果,那么停下来收集一千个…

AI大模型完全本地化部署指南——从零硬件开始

本文将从基础硬件购置开始讲起,真正意义上从零开始,最终通过Ollama、LangChain、DeepSeek的一系列交互,输出本地大模型的第一声啼鸣,带你走进另一片广阔的世界。update:2025-02-23硬件方面 主板选型:主机组装:P40显卡拆解,改散热:kali显卡驱动安装软件方面 ollama服务端…