java9+的String底层实现为什么从char[]改成byte[]

java9的String底层实现为什么从char[]改成byte[]

从Java 9开始,String的底层实现从char[]改为byte[],以提高存储空间效率。在之前的实现中,String对象使用char[]存储字符,每个字符占用2个字节(UTF-16编码)。然而,许多字符串(特别是拉丁语系的文本)实际上并不需要这么多空间。因此,改用byte[]作为底层存储结构可以节省空间,并提高性能。

Java 9引入了一个新的Unicode编码标准——UTF-8。

UTF-8使用变长字节序列来表示Unicode字符,相比于UTF-16,它更加紧凑,更能节省内存空间和提高性能。由于UTF-8是一种可变长度的编码,每个Unicode字符使用的字节数不同,因此无法像UTF-16一样使用固定大小的char数组来表示。

为了适应这种变化,Java的String类在Java 9中进行了改进,使用byte数组来存储字符串。这种改变意味着Java现在可以更好地支持使用UTF-8编码的字符串,并且可以更有效地处理Unicode字符。

此外,使用byte数组存储字符串还有助于提高性能。由于byte数组在处理大量的文本数据时更加高效,因此String类的内部实现现在可以更快地处理字符串操作。

String内部维护了byte数组跟一个char数组?

Java 9中的String类内部同时维护了一个byte数组和一个char数组。byte数组用于存储字符串的字节表示,而char数组用于存储字符串的UTF-16编码表示。

当使用String类的getBytes()方法或者其他将字符串转换为字节数组的方法时,String类会将其内部的char数组按照UTF-8编码转换为一个字节数组并返回。这个字节数组就是字符串的字节表示,也就是使用UTF-8编码表示的字节序列。

相反地,当使用String类的toCharArray()方法或者其他获取字符串的char数组表示的方法时,String类会直接返回其内部维护的char数组,这个char数组就是使用UTF-16编码表示的字符序列。

因此,String类内部同时维护了byte数组和char数组,以便于在需要时可以轻松地进行字符串的字节表示和字符表示之间的转换。

使用byte[]作为底层存储结构有以下优点:

  1. 存储空间优化:对于ISO-8859-1编码的字符串,使用byte[]可以将存储空间减半,因为每个字符只需要一个字节。这有助于减少内存占用,特别是对于包含大量文本的应用程序。

  2. 有时更快的操作:某些操作(如字符串比较)可能因使用byte[]而更快,特别是对于较短的字符串和主要包含ISO-8859-1字符的字符串。这是因为在这种情况下,可以对字节数组直接执行操作,而无需将其转换为char[]

  3. 字符串拼接优化:字符串拼接操作可以直接在byte[]级别执行,而无需将byte[]转换为char[],从而提高效率。

当然,新的实现也引入了一些复杂性,因为Java需要在运行时确定字符串的编码。然而,总体来说,这种改变为Java的String实现带来了更高的存储空间和性能优势。

ISO-8859-1编码在String中byte数组表示中需要多少个字节

其实上面说的存储空间优化, ASCII码倒是真的用的一个字节,但是ISO-8859-1编码嘛

对于ISO-8859-1编码的字符集中除了ASCII字符以外的字符,它们在UTF-8编码中需要使用多个字节来表示。因此,将包含非ASCII字符的ISO-8859-1字符串表示为UTF-8编码时,其字节表示会比原来的ISO-8859-1编码的字节表示更长

所以当使用String类的getBytes()方法将字符串转换为字节数组时,默认情况下会使用UTF-8编码来表示字符串。在UTF-8编码中,ISO-8859-1编码的字符通常只需要使用一个字节来表示,但是对于某些ISO-8859-1字符,它们在UTF-8编码中需要使用多个字节来表示。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

这是一篇能够教会你运营阿里巴巴国际站的文章

对于很多跨境人来说,运营真的是一个让人头疼的大事情。不知道要从哪个方面下手,不知道要往哪方面努力等等问题都是很常见的,所以今天龙哥就解剖一下阿里巴巴国际站的运营方法,简单地给大家讲一下要掌握哪些方面的知识。运营这条路…

【数据结构篇C++实现】- 哈希表

文章目录🚀一、哈希表的原理精讲🚢(一)概念🚢(二)常见哈希函数的构造方法1.直接定址法2.数字分析法3.平方取中法4.除留余数法5.随机数法🚢(三)哈希冲突与处理…

web服务器—nginx

一、nginx介绍Nginx(“engine x”)是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。和apache一样,都是web服务器软件,因为其性能优异,所以被广大运维喜欢。又因…

【python】【protobuf】逆向还原protobuf结构

文章目录一、前言二、示例三、python demo一、前言 在很多场景,都有一个需求: 得到了一个编码后的protobuf数据(比如竞品调研的的数据包),需要逆向还原其proto结构文件。 有3种方案去做这件事情: 从编码入…

Linux常用文件管理命令

Linux常用文件管理命令 目录Linux常用文件管理命令前言常用命令练习题创建文件夹题目代码复制题目代码移动题目代码删除题目代码系列操作题目代码前言 本文将讲解我们在使用Linux操作系统时经常需要使用的命令,也可以当成是一篇笔记的记录,当然光看这些…

Ubuntu安装交叉编译器gcc

1.创建文件并把压缩包复制到文件夹下 2.解压到文件夹下 先找到放置的目录 也可以直接找到文件夹右键-在终端打开 通过-C选项指定解压后的目标目录 tar -jxvf gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux.tar.bz2 -C /opt 注意:输入文件名时可以Tab键自动补齐 输入…

计算机网络中端到端与点到点的区别

计算机网络中端到端与点到点的区别 数据传输的可靠性是通过数据链路层和网络层的点对点和传输层的端对端保证的。端到端与点到点是针对网络中传输的两端设备间的关系而言的。 在一个网络系统的不同分层中,可能用到端到端传输,也可能用到点到点传输。如…

限流、熔断、服务降级

在分布式系统中,如果某个服务节点发生故障或者网络发生异常,都有可能导致调用方被阻塞等待,如果超时时间设置很长,调用方资源很可能被耗尽。这又导致了调用方的上游系统发生资源耗尽的情况,最终导致系统雪崩。 举例&a…

[Vulfocus解题系列]Spring WebFlow 远程代码执行漏洞(CVE-2017-4971)

简介 Spring WebFlow 是一个适用于开发基于流程的应用程序的框架(如购物逻辑),可以将流程的定义和实现流程行为的类和视图分离开来。在其 2.4.x 版本中,如果我们控制了数据绑定时的field,将导致一个SpEL表达式注入漏洞…

科大奥瑞物理实验——声速的测量

实验名称:声速的测量 1. 实验目的: (1)了解超声波的发射和接收方法。 (2)加深对振动合成、波动干涉等理论知识的理解。 (3)掌握用驻波法和相位法测声速。 2. 实验器材&#xff1a…

如何挖掘用户需求的真正动机?关键是4大因素

需求分析实质是挖掘用户内心真正的目标,并转化为产品需求的过程。而用户需求是用户基于自身角度提出的表层需求,这些需求往往有用户期望的产品功能指向。而在产品功能指向的背后,暗藏着潜在的用户动机,这是用户真正希望解决的核心…

【尚硅谷】Java数据结构与算法笔记13 - 图

文章目录一、图的基本介绍1.1 为什么要有图1.2 图的举例说明1.3 图的常用概念二、图的表示方式2.1 邻接矩阵2.2 邻接表三、图的快速入门案例四、图的遍历4.1 深度优先遍历 DFS4.1.1 基本思想4.1.2 算法步骤4.1.3 图示4.2 广度优先遍历 BFS4.2.1 基本思想4.2.2 算法步骤4.2.3 图…

【机器学习】P8 过拟合与欠拟合、正则化与正则化后的损失函数和梯度下降

过拟合与欠拟合、正则化与正则化后的损失函数和梯度下降过拟合与欠拟合过拟合与欠拟合直观理解线性回归中 过拟合与欠拟合逻辑回归中 过拟合与欠拟合过拟合与欠拟合的解决办法过拟合解决方案欠拟合解决方案包含正则化的损失函数正则化线性回归损失函数正则化逻辑回归损失函数包…

java爬虫利器Jsoup的使用

对于长期使用java做编程的程序猿应该知道,java支持的爬虫框架还是有很多的,如:ebMagic、Spider、Jsoup等。今天我们就用Jsoup来实现一个小小的爬虫程序,Jsoup作为kava的HTML解析器,可以直接对某个URL地址、HTML文本内容…

焦虑真的好吗 过度的焦虑存在哪些影响

日常常见的焦虑情绪真的好吗?焦虑是我们七情中的一种正常情绪表现,我们生活当中很多因素都可能会导致我们产生焦虑的情绪表现,如一场考试、一次挑战、一个活动等等。这种焦虑情绪的产生并不是一件坏事,相反,焦虑情绪的…

ROS学习笔记(零):ROS与机器人概述

ROS学习笔记(零):ROS与机器人概述ROSROS的起源ROS的特点ROS架构设计机器人机器人的定义机器人的组成执行机构驱动系统传感系统控制系统ROS ROS的起源 ROS(Robot Operating System)是一个广泛使用的机器人操作系统&…

Python图片相册批处理器的设计与实现批量添加图片水印、批量命名等功能

课题研究使用Python语言开发一个包含批量添加图片水印、批量命名等功能的图片批处理程序,功能模块大概包含以下模块: (1)首页模块:首页是整个软件的初始页面,包含用户登录、注册、关于本软件等功能&#xf…

红日(vulnstack)5 内网渗透ATTCK实战

环境配置 链接:百度网盘 请输入提取码 提取码:l8r7 攻击机:kali2022.03 192.168.135.128(NET模式) win7 192.168.138.136 (仅主机模式) 192.168.135.150 (NET模式) win2008 192.168.138.138 (仅主机模式) web渗透 1.nmap探测目标靶机开…

Qt学习笔记之SQLITE数据库

1. SQLite数据库介绍 SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且已经在很多嵌入式产品中使用了它,…

SpringBoot(1)基础入门

SpringBoot基础入门SpringBoot项目创建方式Idea创建SpringBoot官网创建基于阿里云创建项目手工搭建SpringBoot启动parentstarter引导类内嵌tomcat基础配置属性配置配置文件分类yaml文件yaml数据读取整合第三方技术整合JUnit整合MyBatis整合Mybatis-Plus整合DruidSpringBoot是由…
最新文章