【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.pswp.cn/bicheng/21604.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/21604.shtml
英文地址,請注明出處:http://en.pswp.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…