String的基本特;String的内存分配;字符串拼接操作;intern()的使用;经典面试题

news/2024/9/18 22:58:45/ 标签: java

目录

    • String的基本特性
    • String的内存分配
    • 字符串拼接操作
    • intern()的使用
    • 经典面试题

String的基本特性

创建的两种方式
String s = “a” //字面量的定义方式
String s2 = new String(“fd”)

String类声明为final,不可被继承,实现了Serializable接口,表示字符串是支持序列化的,实现了Comparable接口,表示String可以比较大小

在jdk8及以前内部定义了final char[] value用于存储字符串数据,jdk9时改为byte[]

String代表不可变的字符序列。简称:不可变性
1:当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值
2:当对现有字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有value进行赋值
3:当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域赋值,不能使用原有value进行赋值

通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中

字符串常量池是不会存储相同内容的字符串的

String的String Pool是一个固定大小的Hashtable,默认值大小长度是1009,如果放进String Pool的String非常多,就会造成Hash冲突严重,从而导致链表会很长,而链表长了后会直接造成当调用String.intern时性能会大幅下降
使用-XX:StringTableSize可设置StringTable的长度
在jdk6中StringTable是固定的,就是1009的长度,在jdk7中,StringTable的长度默认值就是60013,StringTableSize设置没有要求,jdk8开始1009是可设置的最小值
可以在命令行查看:jinfo -flag StringTableSize 进程id

String的内存分配

jdk6及以前,字符串常量池存放在永久代
jdk7中字符串常量池位置调整到Java堆内
jdk8元空间,字符串常量池还在堆
StringTable为什么要调整?
1:permSize默认比较小,StringTable在里面容易导致oom
2:永久代垃圾回收频率低

字符串拼接操作

常量与常量的拼接结果在常量池,原理是编译期优化
常量池中不会存在相同内容的常量
只要其中有一个是变量,结果就在堆中(此处指不在常量池中),变量拼接的原理是StringBuilder,相当于在堆空间中new String(),具体内容为拼接的结果
如果拼接的结果调用intern()方法,则主动将常量池中还没有的字符串对象放入池中,并返回此对象地址,如果有,则直接返回常量池中该结果地址

intern()的使用

如果不是双引号声明的String对象,可以使用String提供的intern方法:intern方法会从字符串常量池中查询当前字符串是否存在,如果不存在就会将当前字符串放入常量池中

如何保证变量s指向的是字符串常量池中的数据呢?
1:使用字面量声明方式String s = “hello”;
2:使用intern()

intern()的使用:
jdk1.6:将这个字符串对象尝试放入串池
如果串池中有,则并不会放入,返回已有的串池中的对象的地址
如果没有,把此对象复制一份,放入串池,并返回串池中的对象地址
jdk1.7起:将这个字符串对象尝试放入串池
如果串池中有,则并不会放入,返回已有的串池中的对象的地址
如果串池中没有,则会把对象的引用地址复制一份,放入串池,并返回串池中的引用地址

对于程序中大量存在的字符串,尤其存在很多重复字符串,使用intern()可以节省内存空间

经典面试题

String str = new String(“ab”)会创建几个对象?
看字节码就知道是两个,一个对象是:new 关键字在堆空间创建的;另一个对象是:字符串常量池中的对象
String str = new String(“ab”);
字节码中会有ldc操作,ldc是从常量池中获取值,所以是两个,如果在这之前字符串常量池中已经有了该字符串,应该是创建一个

String str = new String(“a”) + new String(“b”);创建了几个对象?
对象一:StringBuilder
对象2:new String()
对象3:常量池中的"a"
对象4:new String()
对象5:常量池中的"b"
对象6:new String()
一共六个,注意这里常量池中无"ab"

String s3 = new String(“1”) + new String(“1”);
s3.intern();
String s4 = “11”;
System.out.println(s3 == s4);
在jdk6中答案是false,在jdk7/8中答案是true

String s = new String(“a”)+new String(“b”);
String s2 = s.intern();
System.out.println(s2 == “ab”);
System.out.println(s == “ab”);
在jdk8中答案都是true

PS:高版本兼容低版本,低版本不兼容高版本


http://www.ppmy.cn/news/1519386.html

相关文章

昇腾AI处理器的计算核心 - AI Core即DaVinci Core

昇腾AI处理器的计算核心 - AI Core即DaVinci Core flyfish 从一段代码的解释开始 template <typename T> class GlobalTensor { public:void setGlobalBuffer(T* buffer, uint32_t buffersize) {// 在这里实现设置全局缓冲区的逻辑} };语法的说明&#xff0c;主要用于…

优化 Webpack 打包体积的思路

在现代前端开发中&#xff0c;优化 Webpack 打包体积是提升应用性能的重要手段。以下是一些有效的优化思路&#xff1a; 提取第三方库&#xff1a;将第三方库单独打包&#xff0c;并通过 CDN 引入。这样不仅减少了打包体积&#xff0c;还利用了 CDN 的缓存优势&#xff0c;提高…

索迪迈科技油罐车监控系统中车载摄像头的布局策略

随着科技的不断发展&#xff0c;车载监控系统在油罐车上的安装已经成为了一种趋势。这不仅大大降低了车辆的安全隐患与运营成本&#xff0c;更对石油运输企业优化资源配置、提高市场竞争力起到了积极的促进作用。那么&#xff0c;在油罐车监控系统中&#xff0c;如何合理布局车…

html table tbody deleteRow有残留?

html table tbody deleteRow有残留? 问题描述&#xff1a;这个问题描述的是在使用 HTML 的 deleteRow 方法从一个 table 的 tbody 中删除行时&#xff0c;表格中仍然存在某些行。 参考方法1&#xff1a;表格移除多行的时候, 移除行数字索引顺序要从大到小, 而不能从小到大。 …

【华为OD】2024D卷——查找众数与中位数

题目&#xff1a; 众数是指一组数据中出现次数量多的那个数&#xff0c;众数可以是多个。 中位数是指把一组数据从小到大排列&#xff0c;最中间的那个数&#xff0c;如果这组数据的个数是奇数&#xff0c;那最中间那个就是中位数&#xff0c;如果这组数据的个数为偶数&#xf…

【我的Android进阶之旅】使用TabLayout自定义一个TitleTabView

文章目录 零、效果图一、自定义一个TitleTabView1.1 自定义属性(attrs.xml 中)1.2 自定义TitleTabView1.3 TabItem的子布局1.4 颜色值二、在 XML 中使用 `TitleTabView`2.1 布局文件(XML)2.1.1属性说明三、在 Kotlin 中使用 `TitleTabView`:零、效果图 其中Tab 2是选中的效果…

【笔记】数据结构——8月27日

toc 静态链表 静态链表的存储结构 #define maxn 15struct space {int cur;int key; }s[maxn];int LocateElem_SL(SLinkList *s,ElemType e) {//在静态链表中查找第一个值为e的元素//若找到&#xff0c;则返回它在链表中的位置&#xff0c;否则返回0 is[0].cur;while(i&…

使用本地IP无法访问前端项目的问题

说明&#xff1a;记录一次使用本机IP无法访问前端项目的问题 场景&解决 前端项目在我本机电脑上部署完成&#xff0c;我想通过局域网的IP把地址发给测试&#xff0c;发现使用localhost和127.0.0.0都能访问到前端项目&#xff0c;但是这个地址只能在自己的电脑上访问。 解…

记一次学习--webshell绕过(利用清洗函数)

目录 样本 样本修改 样本 <?php $a array("t", "system"); shuffle($a); $a[0]($_POST[1]); 通过 shuffle 函数打乱数组,然后通过$a[0]取出第一个元素&#xff0c;打乱后第一个元素可能是t也可能是system。然后再进行POST传参进行命令执行。 这里抓…

使用 Puppeteer 在 PHP 中解决 reCAPTCHA 以进行网页抓取

您是否在抓取数据时遇到 reCAPTCHA 障碍&#xff1f;我也遇到过。这些 CAPTCHA 挑战会将简单的抓取任务变成一大障碍。但别担心&#xff0c;我有一个解决方案可以帮助您轻松绕过这些障碍。 在本博文中&#xff0c;我将引导您使用 Puppeteer&#xff08;一个功能强大的 Node.js…

瑞芯微RK3566开发板USB OTG模式介绍及命令切换,触觉智能EVB3566主板鸿蒙硬件厂商

一、USB OTG的模式 host模式&#xff08;下行&#xff09;&#xff1a;为u盘等设备供电&#xff0c;不可以进行调试&#xff0c;连接adb或者烧录等操作。 device模式&#xff08;上行&#xff09;&#xff1a;可以进行调试&#xff0c;连接adb或者烧录等操作&#xff0c;即US…

基于xr-frame实现微信小程序的人脸识别3D模型叠加AR功能(含源码)

前言 xr-frame是一套小程序官方提供的XR/3D应用解决方案&#xff0c;基于混合方案实现&#xff0c;性能逼近原生、效果好、易用、强扩展、渐进式、遵循小程序开发标准。xr-frame在基础库v2.32.0开始基本稳定&#xff0c;发布为正式版&#xff0c;但仍有一些功能还在开发&#…

商圣集团:数字创新,引领智慧生活新篇章

在全球化经济不断演进的大潮中&#xff0c;数字经济已成为推动社会进步的关键引擎&#xff0c;重塑着我们的生产与生活模式。商圣集团&#xff0c;以服务社会、创新驱动为核心价值观&#xff0c;致力于利用数字化技术&#xff0c;为个人和企业带来高效、便捷的服务体验&#xf…

OpenCV绘图函数(7)从一个椭圆定义中提取出多边形的顶点坐标函数ellipse2Poly()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 近似一个椭圆弧为一个多边形线。 函数 ellipse2Poly 计算近似指定椭圆弧的多边形线的顶点。它被 ellipse 函数所使用。如果 arcStart 大于 arcEn…

自学数据结构的网站

自学数据结构的网站有很多&#xff0c;以下是一些推荐的高质量和受欢迎的网站&#xff1a; LeetCode 描述&#xff1a;LeetCode是一个知名的在线编程训练平台&#xff0c;特别适合算法和数据结构的学习与练习。它提供了大量的编程题目&#xff0c;涵盖了从简单到困难的各个难度…

基于YOLO的车牌检测识别(YOLO+Transformer)

概述&#xff1a; 基于深度学习的车牌识别&#xff0c;其中&#xff0c;车辆检测网络直接使用YOLO侦测。而后&#xff0c;才是使用网络侦测车牌与识别车牌号。 车牌的侦测网络&#xff0c;采用的是resnet18&#xff0c;网络输出检测边框的仿射变换矩阵&#xff0c;可检测任意形…

「bug」nvitop ERROR: Failed to initialize curses

nvitop 作为一个优秀个 Nvidia显卡查询库&#xff0c;简单易用且显示信息十分丰富&#xff0c;相比 Nvidia-smi 更方便&#xff0c;简直是每个 开发人员必备的库&#xff0c;安装也十分方便&#xff0c;直接采用 pip install nvitop 即可&#xff0c;调用的时候也是直接在 Term…

【Python报错已解决】“ModuleNotFoundError: No module named ‘timm‘”

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引言&#xff1a;一、问题描述1.1 报错示例&#xff1a;当我们尝试导入timm库时&#xff0c;可能会看到以下错误信息。…

k8s sa

在Kubernetes&#xff08;K8S&#xff09;中&#xff0c;SA是Service Account&#xff08;服务账户&#xff09;的简称。Service Account是Kubernetes集群中的一种资源对象&#xff0c;用于识别和验证Pod访问集群中其他资源的身份。以下是关于K8S SA的详细解释&#xff1a; 一、…

JavaScript中将style的String类型转换成Object类型

在React开发中&#xff0c;我们或许经常遇到要将font-size:20px;转换成对象类型{fontSize:"20px"},如下我自己写了个类&#xff0c;正则匹配-后面的第一个字为大写字母&#xff0c;并且去掉-,然后将:后的属性转换为字符串类型&#xff0c;代码如下 function styleSt…