什么是java的Compact Strings特性,什么情况下使用?

JDK 9 新特性详解 JDK 9引入了模块化系统(Project Jigsaw)、JShell交互式编程工具、集合工厂方法等重大特性。摘要如下: 模块化系统:通过module-info.java文件定义模块依赖,提升封装性和可维护性,解决JAR冲突问题。 JShell:REPL工具支持即时执行Java代码片段,提供交互式开发体验。 集合工厂方法:List.of(), Set.of()等简化不可变集合创建。 接口私有方法:允许接口定义私有方法实现代码复用。 Stream API增强:新增takeWhile/dropWhile方法优 阅读详情

在Java 9中引入了紧凑字符串(Compact Strings)特性,用来优化字符串的内存使用。简单来说,Java改进了字符串的存储方式,将之前的UTF-16字符数组改为字节数组,使得字符串能根据内容使用更节省内存的编码方式。以下是这个特性的核心内容:

什么是紧凑字符串

  1. 内部结构:

    • 在Java 8及之前,字符串是用char[]字符数组存储的,每个字符占两个字节(UTF-16编码)。
    • Java 9开始,字符串改为byte[]字节数组。对于只包含Latin-1(ISO-8859-1)字符的字符串,每个字符只需一个字节;若包含其他字符则仍使用两个字节(UTF-16)。
  2. 编码标识:

    • Java 9中的每个字符串对象都有一个编码标识(coder),用于指示当前字符串的编码方式:
      • LATIN1(值为0):只包含Latin-1字符。
      • UTF16(值为1):包含其他字符(如中文)。
  3. 内存优化:

    • 因为大多数字符串仅含Latin-1字符,这一特性大幅减少内存占用,一般能节省10%到15%的内存,降低垃圾回收的频率。

示例代码

以下代码展示了紧凑字符串的存储方式:

public class CompactStringExample {
    public static void main(String[] args) {
        String latinString = "Hello"; // 仅包含Latin-1字符
        String utf16String = "你好"; // 包含UTF-16字符

        // 打印每个字符串的内部字节数组长度
        System.out.println("Latin String Length: " + latinString.getBytes().length); // 输出5
        System.out.println("UTF-16 String Length: " + utf16String.getBytes().length); // 输出6
    }
}

分析

  • latinString仅包含ASCII字符,因此会被存储为一个5字节的数组。
  • utf16String包含中文字符,每个字符用两个字节表示,因此存储为6字节的数组。

如何判断字符串是否使用紧凑模式

可以使用反射或调试工具查看字符串对象的coder字段:若coder为0,则该字符串使用紧凑模式;若为1,则使用UTF-16。

总结

Java 9的紧凑字符串特性通过优化字符串存储方式,减少了内存占用,并提高了程序性能。这一特性默认启用,帮助开发者在处理大量文本时获得更高效的内存使用。

java技术专家 【JDK各个版本特性讲解】JDK14特性   Oracle在2020年3月17日宣布JAVA14 全面上市,JAVA14通过每六个月发布一次新功能,为企业和开发人员社区提供增强功能,继续了Oracle加快创新的承诺. 最新的JAVA开发工具包提供了新功能,其中包括两项备受期待的新预览功能,实例匹配的匹配模式(JEP 305) 和记录(JEP 359),以及文本块的第二个预览(JEP 368),此外,最新的JAVA版本增加了对switch表达式的语言支持,公开了,用于持续监控JDK Flight Recorder数据的新API,将低延迟的Z垃圾收集器 阅读详情

相关推荐

JDK 17版本特性与环境配置指南

本文还有配套的精品资源,点击获取 简介:JDK 17是Java语言的核心开发工具集,为Windows和macOS平台带来新的特性和改进。本文将详细介绍JDK 17的新特性,包括永久移除 unnamed module 、增强型switch表达式、记录类、文本块以及性能优化。同时,本文将指导读者如何在不同操作系统上安装和配置JDK 17,以及如何使用JDK 17提...

weixin_42163404的博客 1672

Java 9 缩小字符串( Compact String)

从 Java 9 开始,JDK 开始引入了一个叫做 缩小字符串( Compact String)。在中文语境下,压缩和缩小都是削减的意思,很多时候是可以通用的,但是实际上还是有区别的。JDK 9 的处理方式是不改变字符串存储使用的 char[] 数组,而是根据字符集来进行处理。当 String 在创建的时候,如果我们知道这个字符集使用的 LATIN-1 来表示的话,我们就使用一个字节来存储。如果是中文,或者我们知道不能用 1 个字节来存储的话,我们还是使用 2 个字节来存储,与原来的存储方式保持一致。换句话

HONEY MOOSE 1281

【ISP图像处理】Demosaic去马赛克技术演进与边缘优化策略

本文深入解析了ISP图像处理中的Demosaic(去马赛克)技术。从Bayer阵列原理出发,梳理了从双线性插值、Hamilton-Adams边缘导向算法到利用通道相关性与自相似性的技术演进历程,并重点探讨了针对边缘与纹理伪影的优化策略,为工程实践中的算法选型与硬件协同设计提供了专业指导。

weixin_29091445的博客 389

JDK17新特性之--新的Compact Strings(JEP 254)

JDK9将String底层的数据结构从char改成了byte,带来了更少的内存占用,和更快String性能

赵侠客 1446

SAP生产订单(创建-下达-发料-报工-入库)全流程及反向流程

SAP创建下达报工入库发料以及取消发料取消入库,批量下达删除关闭,生产订单出入库查询和状态更改查询记录

weixin_38974136的博客 2万+

什么是论文的创新点?公式化描述算是创新点吗?

写科研论文时,挑战之一就是如何让你的工作“脱颖而出”,也就是要有创新性。不管实验多么精确、推导多么复杂,若没有真正的创新,论文很可能会被拒。关于如何创新问题上,我最近在看刘雪峰老师的《科技论文写作指南》,看到了很多关于写作的新论述,在这里和大家进行分享。

加百力 的技术博客 1928

String

String final concat

woainiainisheng的博客 645

Java 缩小字符串( Compact String)和 压缩字符串(Compressed String)

正如我们在上面文章提到的内容,在英文语境中上面 2 个方法还是有区别的,在中文环境下主要表达就是字符串压缩。JDK 6 使用的压缩字符串方法,主要原因是我们修改了 String 的存储结构,char[] 在 Java 的很多地方都会用到,并且 String 因为这个修改就只能接受使用 char[] 为参数的构造方法了。在很多算法中,String 的操作又严重依赖 char[] 数组,如果我们进行这样修改的话,很多程序的代码都会需要跟着修改,这个显然是不划算的。在后面我们使用的缩小字符串的处理方案来说也会有问

HONEY MOOSE 2431

详解在linux上安装vpn客户端

详解在linux上安装vpn客户端

FuncPlotCalc 8433

手把手教您同花顺如何设置大盘分时均价线

本文将手把手教你如何在同花顺PC端开启大盘指数分时图📈

XiaoqiangClub的博客 4433

java strings_聊聊Java 9的Compact Strings

序本文主要研究一下Java 9的Compact StringsCompressed Strings(Java 6)Java 6引入了Compressed Strings,对于one byte per character使用byte[],对于two bytes per character继续使用char[];之前可以使用-XX:+UseCompressedStrings来开启,不过在java7被废弃...

weixin_35125597的博客 474

64、5G 侧链通信技术详解

本文详细解析了5G侧链通信的关键技术,包括资源感知与选择、UE间协调、混合ARQ、功率控制、信道探测与CSI报告以及侧链同步。资源感知与选择通过周期性或随机方式实现资源分配,UE间协调通过主动或被动方式避免资源冲突。混合ARQ机制确保数据传输可靠性,功率控制和信道探测优化传输质量并减少干扰。侧链同步则通过多种方式确保设备间时间一致性。这些技术相互配合,构建了高效稳定的5G侧链通信体系,适用于智能交通、物联网、应急通信等多个领域,为未来无线通信发展提供强大支撑。

oil88的博客 102

什么是java的Compact Strings特性,什么情况下使用

内部结构在Java 8及之前,字符串是用char[]字符数组存储的,每个字符占两个字节(UTF-16编码)。Java 9开始,字符串改为byte[]字节数组。对于只包含Latin-1(ISO-8859-1)字符的字符串,每个字符只需一个字节;若包含其他字符则仍使用两个字节(UTF-16)。编码标识Java 9中的每个字符串对象都有一个编码标识(coder),用于指示当前字符串的编码方式:LATIN1(值为0):只包含Latin-1字符。UTF16(值为1):包含其他字符(如中文)。内存优化。

ffella的博客 167

C# NX二次开发-查找连续倒圆角面

可以通过ufun函数 UF_MODL_ask_face_type 和 UF_MODL_ask_face_props 可判断处理选择相应的一组圆角面。在QQ群里有人问怎么通过一个选择一个倒圆角面来自动选中一组倒圆角面。这个是初步思路,如果有更好的思路可回复讨论一下。

fhqiwmc的博客 621

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

聊聊Java 9的Compact Strings

序 本文主要研究一下Java 9的Compact Strings Compressed Strings(Java 6) Java 6引入了Compressed Strings,对于one byte per character使用byte[],对于two bytes per character继续使用char[];之前可以使用-XX:+UseCompressedStrings来开启,不过在java7...

weixin_34120274的博客 1737

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

JDK 9 Compact Strings 深度解析:原理、实现与性能优势

在 JDK 9 之前,Java 中的字符串是基于 UTF-16 编码实现的。也就是说,每个字符都占用两个字节(char 类型),即使你只使用 ASCII 字符(实际上只需 1 字节)。这种设计在国际化方面是兼容的,但它在处理大量只包含英文或 Latin-1 字符的字符串时会造成明显的内存浪费。为了解决这一问题,JDK 9 引入了,这是JEP 254提出的特性,目标是在不破坏兼容性的前提下压缩内存占用,提高缓存效率。JDK 9 的 Compact Strings 是一次对 Java 核心类String。

Yangyuanwang的博客 804

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

JDK9的新特性:String压缩和字符编码

文章目录简介底层实现总结 简介 String的底层存储是什么?相信大部分人都会说是数组。如果要是再问一句,那么是以什么数组来存储呢?相信不同的人有不同的答案。 在JDK9之前,String的底层存储结构是char[],一个char需要占用两个字节的存储单位。 据说是JDK的开发人员经过调研了成千上万的应用程序的heap dump信息,然后得出了一个结论:大部分的String都是以Latin-1字符编码来表示的,只需要一个字节存储就够了,两个字节完全是浪费。 据说他们用了大数据+人工智能,得出的结论由不得我们

程序那些事 9383

也许你并不了解 java.lang.String | JDK 11 源码阅读分析(灌水)与优化实测

JDK 8 之后的 String 有什么变化了解吗?为什么 JDK 9 要引入新的编码?平时常用的 String 的方法(例如 substring 等)实现逻辑了解吗?也许有些人无惧 HashMap,但一问 String......

wu_weijie的博客 8690

关于String在java9中的新特性

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34150830的博客 249

java 11 新特性源码分析和使用

java 11 新特性源码分析和使用 Java 11 的一些重要功能包括: 使用单个命令运行 Java 文件 String 类中的新实用程序方法 Lambda 参数的局部变量语法 基于嵌套的访问控制 JEP 321:HTTP 客户端 在文件中读取/写入字符串 JEP 328:飞行记录器 Java 字符串方法 isBlank() –此实例方法返回一个布尔值。空字符串和仅包含空格的字符串将被视为空...

超级英雄吉姆的博客 430

Java 9 新特性(JKD9)

这些特性没有专门的语法,但是它们可以通过使用 Java 9 的新特性和 API 来实现。这些特性没有专门的语法,但是它们可以通过使用 Java 9 的新特性和 API 来实现。这些特性没有专门的语法,但是它们可以通过使用 Java 9 的新特性和 API 来实现。这些特性没有专门的语法,但是它们可以通过使用 Java 9 的新特性和 API 来实现。在上面的示例中,我们使用 Java 9 的新特性和 API 来定义变量。在上面的示例中,我们使用 Java 9 的新特性和 API 来定义变量。

qq_40698086的博客 1093

Java字符串原理、优化与最佳实践详解

字符串是编程中最基础的数据结构之一,Java中的String类采用不可变设计确保线程安全,并通过字符串常量池实现内存优化。从JDK9开始引入的紧凑字符串(Compact Strings)技术大幅降低了内存占用,特别是对Latin字符可节省50%空间。理解字符串的底层存储机制和JVM优化原理,对编写高性能代码至关重要。在实际工程中,字符串拼接应优先使用StringBuilder而非'+'操作符,正则表达式需要预编译Pattern提升性能。这些优化技巧在日志处理、文本解析等场景能带来显著性能提升,也是Java开

weixin_34128839的博客 727

Java新特性梳理——Java14

highlight: xcode theme: vuepress 概述 Oracle 在 2020 年 3 月 17 日宣布 Java 14 全面上市,Java 14 通过每六个月发布一次新功能,为企业和开发人员社区提供增强功能,继续了 Oracle 加快创新的承诺。最新的 Java 开发工具包提供了新功能,其中包括两项备受期待的新预览功能,实例匹配的匹配模式(JEP 305)和记录(J...

weixin_45254062的博客 1208
上一篇: MySQL中的WHERE 1=1对性能的影响有多大?一个实证式分析
下一篇: Java中的代码简化技巧:让开发更轻松!
加班不秃顶
博客等级 码龄7年 1822粉丝 599原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值