【java11】java11新特性之增强String的API

Java11在String类上引入了一系列新的API增强,这些改进显著提升了开发者在处理字符串时的便捷性和效率。

以下是Java11中增强String API的主要新特性:

  • String.repeat():重复给定次数的字符串。返回连接的字符串。
  • String.isBlank():检查字符串是否为空或只有空格。
  • String.strip():删除前导和尾随空格。
  • String.stripLeading():删除前导空格。
  • String.stripTrailing():删除尾随空格。
  • String.lines():返回多行字符串的行流。

String.repeat()

repeat方法允许你重复一个字符串指定的次数。这在需要快速生成重复字符串的场景中非常有用。

示例:

String str = "abc".repeat(3);
System.out.println(str); // 结果为 "abcabcabc"

String.isBlank()

isBlank方法检查一个字符串是否为空或者仅包含空白字符(如空格、制表符、换行符等)。这是一个非常实用的方法,可以帮助你判断用户输入是否有效。

示例:

System.out.println("".isBlank()); // 输出 true
System.out.println(" ".isBlank()); // 输出 true
System.out.println("\t".isBlank()); // 输出 true
System.out.println("\n".isBlank()); // 输出 true
System.out.println("hello".isBlank()); // 输出 false

String.strip(), String.stripLeading(), String.stripTrailing()

这三个方法用于删除字符串的前导、尾随或前导和尾随的空白字符。

  • strip():删除字符串的前导和尾随空白字符。
  • stripLeading():仅删除字符串的前导空白字符。
  • stripTrailing():仅删除字符串的尾随空白字符。

示例:

String str = "   hello, world!   ";
System.out.println(str.strip()); // 输出 "hello, world!"
System.out.println(str.stripLeading()); // 输出 "hello, world!   "
System.out.println(str.stripTrailing()); // 输出 "   hello, world!"

String.lines()

lines方法将字符串按行分隔,并返回一个Stream<String>,其中每个元素是字符串中的一行。这对于处理多行文本或文件内容非常有用。

示例:

String str = "line1\nline2\nline3";
str.lines().forEach(System.out::println); // 分别打印三行

String类的重要变化

Java中的String类在不同版本之间经历了一些重要的变化。以下是一些关键的变化:

Java6及之前

String类内部使用字符数组(char[])来存储字符串数据。每个字符占用两个字节(16位),因为Java使用UTF-16编码。

Java7

Java7引入了String类的内部优化,增加了一个称为“字符串池”的概念。这种优化可以减少内存使用和提高性能。

Java 9

Java9之前中的String是使用char[]数组来存储字符的,每个字符通常占用两个字节(在UTF-16编码下)。然而,对于只包含 ASCII字符(或LATIN-1字符集)的字符串,这会导致大量的空间浪费,因为ASCII字符实际上只需要一个字节来存储。

Java9对String类进行了重大改动,改用byte[]数组来存储字符串数据,并通过一个coder字段来标识使用的是Latin-1还是UTF-16编码。对于仅包含Latin-1字符的字符串,这种方式可以节省一半的内存。

public final class String implements java.io.Serializable, Comparable<String>, CharSequence {private final byte[] value;private final byte coder;// ...
}

可以通过下面的代码来观察String内部使用Latin-1或UTF-16编码时,内部数组的情况和coder字段的标识:

package com.morris.java11;import java.lang.reflect.Field;public class StringCoderDemo {public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {Field valueField = String.class.getDeclaredField("value");valueField.setAccessible(true);Field coderField = String.class.getDeclaredField("coder");coderField.setAccessible(true);String aa = "hello";System.out.println(((byte[])valueField.get(aa)).length); // 5System.out.println(coderField.get(aa)); // 0String bb = "中a";System.out.println(((byte[])valueField.get(bb)).length); // 4System.out.println(coderField.get(bb)); // }
}

运行时增加此--add-opens java.base/java.lang=ALL-UNNAMEDJVM参数,否则会抛出Unable to make field private final byte[] java.lang.String.value accessible错误。

Java 11

Java 11增加了一些实用的方法,如strip(), isBlank(), lines(), repeat()等,提升了字符串处理的便利性。内部结构保持与Java 9一致。

这些变化主要是为了提高性能和减少内存使用,同时也增加了字符串操作的便利性。每个版本的改进都对开发者在处理字符串时带来了不同程度的影响。

Compressed Strings与Compact Strings

Compressed Strings与Compact Strings是Java在处理字符串时所采用的两种不同机制,它们在Java的不同版本中有所体现,具体区别如下:

Compressed Strings(压缩字符串):

  • 引入版本:Java 6。
  • 特性:Compressed Strings对于每个字符占用一个字节(one byte per character)的情况使用byte[],而对于每个字
    占用两个字节(two bytes per character)的情况则继续使用char[]。
  • 启用与废弃:之前可以通过-XX:+UseCompressedStrings选项来启用这一特性,但它在Java 7中被废弃,并在Java 8中被完全移除。

Compact Strings(缩小字符串):

  • 引入版本:Java 9。
  • 特性:Compact Strings是Java 9中引入的一种新机制,用于取代Java 6中的Compressed Strings。它的实现更为彻底,完全使用byte[]来替代char[]存储字符串数据。同时,为了标识字符串是使用LATIN1编码还是UTF-16编码,新引入了一个字段coder。
  • 优势:由于字符串在Java中非常常见,使用byte[]而非char[]可以显著减少堆内存的使用,这对于那些大量使用字符串的Java应用来说是一个重要的优化。

总结来说,Compressed Strings和Compact Strings都是Java为了优化字符串处理而引入的机制。Compressed Strings在Java 6中引入,但在后续版本中被废弃;而Compact Strings则在Java 9中引入,作为Compressed Strings的替代方案,它使用byte[]替代char[]来存储字符串数据,并通过引入新的字段来标识编码方式,从而实现了更高效的内存使用。

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

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

相关文章

ldap协议(常用于统一身份认证)与dict协议(在线词典)

文章目录 LDAPDICT LDAP LDAP&#xff08;Light Directory Access Portocol&#xff09;&#xff0c;轻量目录访问协议。 目录是一个为查询、浏览和搜索而优化的数据库&#xff0c;它成树状结构组织数据&#xff0c;类似文件目录一样。 目录数据库和关系数据库不同&#xff0c…

spring security 使用记录

spring security 使用记录 Bad credentials配置类密码匹配 Bad credentials org.springframework.security.authentication.BadCredentialsException: Bad credentialsat org.springframework.security.authentication.dao.DaoAuthenticationProvider.additionalAuthenticatio…

Docker安装极简版(三分钟搞定)

什么是Docker? Docker是一个开源的应用容器引擎&#xff0c;它允许开发者打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的Linux机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之间不会有任何接口。 化。容器是…

日志脱敏功能

前言 数据安全尤为重要&#xff0c;最为简单的防线就是防止重要信息&#xff08;身份证、手机号、姓名等&#xff09;明文显示&#xff0c;对此需要在数据库层、日志层等做好数据加解密。 思路 1、编写需加密的正则模板、加密字段 2、重写ch.qos.logback.classic.pattern.Me…

简易图像处理器的设计

1 概述 Python是一种高级、通用、解释型的编程语言&#xff0c;由Guido van Rossum于1991年创造。它被设计为易读易写的语言&#xff0c;具有简洁而清晰的语法&#xff0c;使得它成为许多领域的首选语言&#xff0c;如Web开发、科学计算、人工智能、数据分析等。结合本科阶段以…

三维地图校内导航系统解决方案

在如今的数字化时代&#xff0c;越来越多的学校开始实施智慧校园计划&#xff0c;旨在为学生和教师提供更高效、便捷的学习和教学环境。智慧校园运用互联网、大数据、人工智能等技术&#xff0c;对校园内各信息进行收集、整合、分析和应用&#xff0c;实现教学、管理、服务等多…

【matlab】绘图插入并放大/缩小子图

参考链接 代码分为两个&#xff1a;绘图代码与magnify.m 绘图代码就是普通的绘图代码&#xff0c;以下为例 %https://zhuanlan.zhihu.com/p/655767542 clc clear close all x 0:pi/100:2*pi; y1 sin(x); plot(x,y1,r-o); hold on y2sin(x)-0.05; y3sin(x)0.05; xlim([0 2*…

C#关键字概览

C#是一种面向对象的编程语言&#xff0c;由微软开发并作为.NET框架的一部分。它具有丰富的关键字&#xff0c;用于定义程序的结构和行为。本文将详细介绍C#中的关键字&#xff0c;包括基本关键字、上下文关键字以及它们在C#编程中的使用方式。 访问修饰符 访问修饰符控制成员…

Python变量age:深入探索其内涵与运用

Python变量age&#xff1a;深入探索其内涵与运用 在Python的世界里&#xff0c;变量age不仅是一个简单的标识符&#xff0c;它更是一个承载着丰富信息和功能的实体。今天&#xff0c;我们就来深入探索这个看似简单的age变量&#xff0c;揭示其背后的奥秘和魅力。 四个方面&am…

供应SKYA21001思佳讯芯片现货

长期供应各进口品牌芯片现货&#xff1a; SKYA21001 QM11024TR13 QM12113TR13 QM42391 QM45392 QM28005 RF8020TR13 QM77033DTR13 QM56021TR13-5K 885171 QM77043 QM78207 QM77038TR13 SKY58081-11 QPF5752QTR13-5K RF7198TR13-5K SKY58255-11 SKY85720-11 …

Ubuntu中安装和配置SSH的完全指南

目录 前言 第1步&#xff1a;安装SSH服务器 第2步&#xff1a;检查防火墙设置 第3步&#xff1a;连接到SSH服务器 第4步&#xff1a;配置SSH服务器&#xff08;可选&#xff09; 更改SSH端口 禁用root登录 第5步&#xff1a;公钥认证&#xff08;建议&#xff09; 结论…

XSS Challenges 闯关游戏环境准备:深入指南

在网络安全领域&#xff0c;理解并掌握跨站脚本攻击&#xff08;XSS&#xff09;的防御技巧至关重要。为了帮助学习者深入实践XSS攻击与防御&#xff0c;“XSS Challenges” 闯关游戏提供了一个实操平台。本文将详细介绍如何准备这一环境。 1. 环境准备概述 XSS Challenges 闯…

Kubernetes 之 Secret

Kubernetes 之 Secret Secret 的定义 Secret 解决了密码、token、秘钥等敏感数据的配置问题&#xff0c;它避免了把这些敏感数据直接暴露在镜像或者 Pod 的配置文件中。但是它只是一种相对安全的策略&#xff0c;我们还是可以在容器内找到这些信息。 Secret 的认证方式 认证…

eclipse-向Console控制台输出信息

首先这里主要用到的是org.eclipse.ui.console这个包&#xff0c;所以现在顺道先来了解一下&#xff1a; org.eclipse.ui.console是一个可扩展的console视图插件&#xff0c;利用它可以实现各种console&#xff0c;并把它们显示出来。该插件本身就实现了一个Message Console&…

本地 Java API 访问云上 HDFS 集群的问题与解决

前言 这篇文章默认是已经在云上配置好了 Haoop 集群&#xff0c;因此本文主要是记录一些可能会出现错误的地方。 如果还不会配置 Hadoop 集群&#xff0c;那么可以参考本专栏的另一篇文章&#xff1a;云上配置 Hadoop 集群详解 另外在进行本文的学习之前也建议先看看该文章&…

边缘计算的AI小板——OrangePi AI Pro

简介 OrangePi AI Pro是一款基于Allwinner H6处理器的嵌入式AI计算设备&#xff0c;适用于物联网和边缘计算。它具有强大的性能、低功耗、多接口和小尺寸。 本文分为三个部分&#xff1a; 一、对该板进行简单的开箱介绍。 二、 将SD卡中的系统迁移到由于该板支持SD卡、SSD…

必看——怎么让网站实现HTTPS访问?

让网站实现HTTPS访问的步骤可以简化为以下几个基本步骤&#xff0c;非常适合非技术背景人士理解&#xff1a; 1. 申请SSL证书&#xff1a; - SSL证书是实现HTTPS的关键&#xff0c;它能加密网站数据&#xff0c;保证用户信息的安全。你可以从一些提供免费SSL证书的机构&#xf…

Spring boot集成mybatis

Spring boot集成mybatis maven依赖 我的spring boot版本是2.5.0&#xff0c;集成mybatis&#xff0c;首先需要数据库的支持&#xff0c;这里我选择mysql数据库&#xff0c;版本是8.0.11&#xff0c;然后使用druid连接池&#xff0c;其次就需要加上mybatis的依赖。 <!--mys…

[ue5]建模场景学习笔记(2)——用vectornoise降低重复率

1.问题分析&#xff1a; 利用改uv的方式降低重复率并不理想&#xff0c;在一定程度上的确能够达到降低重复率的效果&#xff0c;但远看仍然有较清晰的重复效果&#xff0c;尝试优化一下。 2.操作实现&#xff1a; 1.首先先看一下修改后的效果&#xff1a; 这是未修改前&#…

centos打包离线phtone3安装包rpm

在有网络的环境中&#xff0c;下载Python3的RPM包及其所有依赖。 打包离线phtone3安装包centos7rmp # 安装 yum-utils&#xff0c;这个包包含了 yumdownloader yum install yum-utils # 创建一个目录来保存下载的RPM包 mkdir python3-rpms # 下载Python3及其所有依赖 yu…