【JVM】剖析字符串与数组的底层实现(二)

news2024/9/25 1:16:40

剖析字符串与数组的底层实现

字符串jdk8和jdk9的区别

在这里插入图片描述

jdk8:底层是一个char[]数组
jdk9及之后:底层是一个byte[]数组

一个中文占两个字节,一个char占两个字节,一个byte占一个字节
Jdk9及之后的版本中,多了一个code属性,这个属性标记是告诉调用者按几个字节来取的问题,
如果按byte存储的话,存不是什么问题,问题是如何取呢?
String在9版本之后是根据code属性来区分的:
如果是英文则按照LATIN编码格式,1个字节1个字节地取
如果是中文则按照UTF16两个字节来取

JDK9的字符串去重:
G1:经历了三次GC,-XX:+UseG1GC -XX:+UseStringDeduplication
底层原理:用== 判断不是同一个字符串,内容是否相等
优缺点:它是一个CPU密集型的

String类重写了hashCode方法

在这里插入图片描述

可以看出String的hashcode与String的内容是有关系的

String类也重写了equals方法

在这里插入图片描述
为什么要重写?因为再使用String创建对象时,我们并不关注它的内存地址,更专注它的内容,所以进行了重写

不同方式创建字符串在JVM中的存在形式

双引号

在这里插入图片描述

这种方式创建的字符串对象,只会在常量池中。因为"11"这个字面量,创建对象s1的时候,JVM会先去常量池中通过equals(key)方法,判断是否有相同的对象。
如果有,则直接返回该对象在常量池中的引用;
如果没有,则会在常量池中创建一个新对象,再返回引用

new String

在这里插入图片描述

这种方式会保证字符串常量池和堆中都有这个对象,没有就创建,最后返回堆内存中的对象印象。
步骤大致如下:
因为有"11"这个字面量,所以会先检查字符串常量池中是否存在字符串"11"
不存在,先在字符串常量池里创建一个字符串对象;再去堆内存中创建一个字符串对象"11";
存在的话,就直接去堆内存中创建一个字符串对象"11";
最后,将堆内存中的引用返回
这是1.7已上的做法了

两个双引号在这里插入图片描述

两个new String

在这里插入图片描述

拼接字符串底层是如何实现的

StringBuilder拼接而成的字面量是不会放入到常量池中的

双引号 + 双引号

在这里插入图片描述

双引号 + new String

在这里插入图片描述

intern方法

在这里插入图片描述

native方法,作用是"如果常量池中存在当前字符串,就会直接返回当前字符串。如果常量池中没有此字符串,会将此字符串放入常量池中后,再返回"。如图所示。它的大体实现结构是JAVA使用JNI调用C++实现的StringTable的intern方法,StringTable的intern方法跟Java中的HashMap的实现是差不多的,只是不能自动扩容。默认大小是1009.要注意的是String的StringPool是一个固定大小的Hashtable,默认值大小是1009,如果放进StringPool的String非常多,就会造成Hash冲突严重,从而导致链表会很长,而链表长了后直接会造成的影响就是当调用String.inern时性能会大幅下降(因为要一个一个找)。
在JDK6中StringTable是固定的,就是1009的长度,所以如果常量池中的字符串过多就会导致效率下降很快。在JDK7中,StringTable的长度可以通过一个参数执行:-XX:StringTableSize=99991.

String s = new String(“abc”);
在上面的语句中创建了两个对象,第一个对象是"abc"字符串存储在常量池中,第二个对象是在Java Heap中的String对象
如果StringTable单链表查找超过100次触发rehash

String s1 = “cover”;
String s2 = s1.intern();
System.out.println(s1 == s2); // false
在JDK1.6中需要将s1复制到字符串常量池里

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

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

相关文章

深入掌握Kubernetes核心:YAML配置详解与实战

Kubernetes 的yaml配置文件 Kubernetes 的 YAML 配置文件是定义和管理集群中的所有资源的关键工具。了解如何编写和使用这些配置文件对管理 Kubernetes 集群至关重要。 1. 基础结构 Kubernetes YAML 配置文件通常由以下几个部分组成: apiVersion: 资源使用的 API …

公司同时使用目标(OKR)(KPI)的用例是什么?

简单的答案:所有使用OKR的公司都使用KPI。 长答案: 在公司层面,大多数OKR与关键绩效指标直接挂钩。举例说明,假设一家公司的目标是:”实现财务目标”,有以下3个关键结果。 1-第二季度公司收入翻番&#…

BeanFactoryPostProcessor 和 BeanPostProcessor

BeanFactoryPostProcessor 和 BeanPostProcessor 基本概念BeanFactoryPostProcessor简单实践BeanFactoryPostProcessor 典型应用BeanFactoryPostProcessor 和 BeanDefinitionRegistryPostProcessor BeanPostProcessor简单实践AOP 简单实践 基本概念 BeanFactoryPostProcessor …

百度翻译与TOP3在线翻译伙伴:2024年的黄金组合

在这个信息丰富的时代,语言帮助人们跨越地域界限进行交流。随着全球化的发展,高效的在线翻译工具变得越来越重要,它能帮我们更好地了解世界和不同的文化。今天,我们就来看看百度翻译和它的三个新对手之间的比较,一起找…

redis作为缓存,mysql的数据如何与redis同步

先介绍自己的业务背景,是一致性要求高的 还是 允许延迟一致,因为两者的回答不一样。 双写一致性 双写一致性:当修改了数据库的数据也要同时更新缓存的数据,缓存和数据库的数据要保持一致。 读操作:缓存命中,直接返回;缓存未命中…

动⼿学深度学习

大家如果想获取这个PDF可以关注,收藏点赞并私信我,我把这个PDF文档发给感兴趣的朋友 目录 预备知识 预备知识内容 线性神经网络 线性回归 基本元素 矢量化加速 正态分布与平方损失 从线性回归到深度网络 小结与练习 线性回归的实现 从零开始实现…

safari扩展程序开发

文章目录 safari_web_extensions开发扩展扩展有3个主要部分:使用 WebExtension APIruntime local debugSafari中允许运行 未签名的扩展install extensionupdate extension publish safari的extension文档不是很好,建议参考mozilla文档 https://developer…

【Python零基础】类的概念

文章目录 前言一、创建并使用类二、使用类和实例三、继承四、导入类五、Python标准库六、类的编码风格总结 前言 面向对象编程是现在使用最多的软件编写方法之一。面向对象中最核心的就是类(class),类用来描述现实世界的事物和情景,我们基于这些类来创建…

信号的产生

文章目录 2 信号的产生2.1 键盘组合键2.2 命令和函数调用2.2.1 kill命令2.2.2 raise()函数2.2.3 abort()函数 2.3 硬件异常2.3.1 除0异常2.3.2 空指针异常2.3.3 OS如何感知这些异常--除0异常2.3.4 OS如何感知这些异常--空指针异常 2.4 软件条件2.4.1 13)SIGPIPE信号…

yolov5关键点检测-实现溺水检测与警报提示(代码+原理)

基于YOLOv5的关键点检测应用于溺水检测与警报提示是一种结合深度学习与计算机视觉技术的安全监控解决方案。该项目通常会利用YOLOv5强大的实时目标检测能力,并通过扩展或修改网络结构以支持人体关键点检测,来识别游泳池或其他水域中人们的行为姿态。 项…

12-使用gateway作为微服务网关

本文介绍spring gateway的使用,包括配置文件和使用java代码配置,让大家了解spring gateway的用法。如果不了解什么是微服务网关,就先查查资料,网关相对来说是比较重要的微服务组件。 0、环境 springboot 2.4.2springcloud gatew…

游戏开发设计模式之装饰模式

目录 装饰模式在游戏开发中的具体应用案例是什么? 如何在Unity中实现装饰模式以动态扩展游戏对象的功能? 装饰模式与其他设计模式(如适配器模式、代理模式)相比,有哪些优势和劣势? 优势 劣势 与适配器…

唯众2024年高职人工智能实训室方案解读

随着人工智能(AI)技术在全球范围内的快速发展,越来越多的职业技术学院开始重视AI相关专业的建设和实训室的搭建。作为在人工智能教育领域有着丰富经验的企业,唯众针对2024年的市场需求,推出了一套全面的人工智能实训室…

软件设计师教程(第5版)第8章 算法设计与分析(更新中)

8.1 算法设计与分析的基本概念P416 8.1.1 算法P416 【算法】是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作。P416 一个算法还具有下列5个重要特性:【有穷】性、【确定】性、【可行】性、【输入】、…

Games101学习 - 线性代数综述

1. 叉积矩阵形式 叉乘矩阵形式通常在物理模拟中有运用,处理四元数旋转也类似这样的形式。 // 定义两个向量 A 和 B FVector A(1.0f, 2.0f, 3.0f); FVector B(4.0f, 5.0f, 6.0f);// 计算叉积 FVector CrossProduct FVector::CrossProduct(A, B);if (GEngine) {GEn…

CVPR2024满分论文:基于可变形三维高斯的高质量单目动态重建方法

一、摘要 隐式神经表征为动态场景的重建和渲染开辟了新的途径。然而,尖端的动态神经渲染方法严重依赖这些隐式表征,它们常常难以捕捉场景中物体的复杂细节。此外,隐式方法通常难以实现动态场景的实时渲染,限制了它们在多种任务中的…

Excel公式与图表自动化:在Python中操作Excel公式并自动化生成图表

目录 一、Python操作Excel公式 1.1 读取Excel文件 1.2 识别和处理公式 1.3 批量处理公式 二、自动化生成图表 2.1 使用pandas和matplotlib生成图表 2.2 使用xlwings在Excel中直接生成图表 2.3 自定义图表样式 2.4 自动化生成复杂图表 三、总结 在数据分析和自动化办公…

VMware Workstation Pro for Personal Use (For Windows) 17.0.0

VMware Workstation Pro for Personal Use (For Windows) 17.0.0 弄了半天终于找到下载地址了 现在VMware被博通(broadcom)收购且宣布了17.5版本的VMware Workstation Pro对个人用户免费许可使用。由于现在官网的下载方式有改变,故贴出来一…

【数学分析笔记】第2章第4节收敛准则(4)

2.数列极限 2.4 收敛准则 上节课举了一个例子 a N 1 1 2 p 1 3 p . . . 1 n p a_{N}1\frac{1}{2^{p}}\frac{1}{3^{p}}...\frac{1}{n^{p}} aN​12p1​3p1​...np1​ p > 1 p>1 p>1&#xff0c; { a n } \{a_{n}\} {an​}收敛 0 < p ≤ 1 0<p\le 1 0<p≤…

OpenStack——keystone认证服务

1、作用 认证授权 服务目录 2、组件 keystone-server keystone-DB 3、架构 ①组成 用户认证流程&#xff1a; 1.Horizon为用户提供界面; 2.用户输入用户名密码&#xff0c;有Horizon转发至Keystone做认证授权 ; 3.如果认证鉴权成功&#xff0c;会给用户发放一个临时的unscope…