Java基础语法——字符串(String/StringBuilder/Stringjoiner)

news2025/1/22 19:46:32

String


Java的String类是不可变的,意味着一旦创建,其值就不能被改变。String类提供了丰富的API来操作字符串。

以下是一些常用的方法:

构造方法:

有以下几种常见的:

public class stringlearn {
    public static void main(String[] args) {
        String str1 = "Hello World";
        String str2 = new String(str1);
        String str3 = new String();

        char[] chararray = {'a', 'b', 'c', 'd', 'e'};
        String str4 = new String(chararray);
        String str5 = new String(chararray,0,2);

        byte[] bytearray = new byte[] {97,98,99,100,101,102,103};
        String str6 = new String(bytearray);

        System.out.println(str1);//Hello World
        System.out.println(str2);//Hello World
        System.out.println(str3);//
        System.out.println(str4);//abcde
        System.out.println(str5);//ab
        System.out.println(str6);//abcdefg
    }
}

Java13引入了引入的文本块的语法。

在文本块中,您可以跨多行定义字符串,而不需要使用\n+来拼接字符串。这样可以提高代码的可读性。

String str = """
                sfsdf
                sfdsd
                dsf
                dsf
                """;
System.out.println(str)

//输出的结果是
sfsdf
sfdsd
dsf
dsf

//

获取字符串长度:

此处str为String的变量名

int length = str.length();

字符访问

char firstchar = str.charAt(0);

// 获取指定位置的字符

子字符串

String Str = str.substring(startIndex);

从startIndex开始截取到字符串末尾

String Str = str.substring(startIndex, endIndex);

截取从startIndex到endIndex(不包括endIndex)的子串

startIndex和endIndex是要截取的位置(下标)

比较字符串

一、比较内容是否相等

boolean isEqual = str.equals(anotherStr);

二、忽略大小写比较

if(str1.equals("Hello World")){
            System.out.println("相等");
        }else {
            System.out.println("不相等");
        }

boolean isEqualIgnoreCase = str.equalsIgnoreCase(anotherStr);

三、比较返回一个数 

int compareResult = str.compareTo(anotherStr);

如果两个字符串相等,则返回值为0。 

如果调用compareTo()方法的字符串比传入的字符串小,则返回一个负整数。

如果调用compareTo()方法的字符串比传入的字符串大,则返回一个正整数。

具体返回值的计算规则如下:

  1. 如果两个字符串相等,则返回值为0。

  2. 如果调用compareTo()方法的字符串在按字典顺序排列时排在被比较的字符串之前,则返回一个负整数。这个负整数实际上是两个字符串在第一个不同字符上的 Unicode 编码点的差值。

  3. 如果调用compareTo()方法的字符串在按字典顺序排列时排在被比较的字符串之后,则返回一个正整数。这个正整数实际上也是两个字符串在第一个不同字符上的 Unicode 编码点的差值。

以下是ASCII与Unicode的介绍博客 

Unicode与ASCII-CSDN博客

在Java中,字符串是以Unicode编码的方式存储的。因此,比较字符串时通常会涉及到比较其中包含的字符的Unicode编码点。

compareTo()方法在比较字符串时也是根据两个字符串中的对应字符的Unicode编码点来确定字符串的大小关系的。

了解Unicode编码点的概念对理解字符串比较以及其他涉及Unicode字符集的操作非常重要。Unicode编码点的唯一性可以帮助确保不同的字符在计算机中得到正确的表示和处理。 

查找字符或子串

使用indexOf与lastIndexOf 

indexOf

如果找到相关的字符就返回该字符第一次出现的位置(从0开始数)

lastIndexOf

如果找到相关的字符就返回该字符最后一次出现的位置(从0开始数)

 

替换字符串

有以下四种替换字符串的方法

前三种的替换都是全局调用

replaceAll的使用需要用正则表达式

replaceFirst则就是只替换第一次遇到的

replace与replaceAll的区别:

由于replaceAll使用正则表达式解析,处理速度通常比直接的replace慢,尤其是在处理大量数据时。因此,在不需要正则表达式功能时,优先考虑使用replace。

去除空白

一、trim()

去除字符串首尾的空格 

String str13 = " Hello World ";
String str14 = str13.trim();
System.out.println(str14);//Hello World

使用这个方法会返回一个新的字符串 

二、strip()

 

Java 11起,功能与trim相同,但更高效

 strip()                   删去头尾的空格

stripLeading()       删去头部的空格

stripTrailing()        删去尾部的空格

转换大小写

toUpperCase();  转化为大写

toLowerCase();  转化为小写

String str1 = "Hello World";
String str19 = str1.toLowerCase();
System.out.println(str19);   //hello world
String str20 = str1.toUpperCase();
System.out.println(str20);   //HELLO WORLD

分割字符串

String[] parts = str.split(","); // 根据指定分隔符拆分字符串为数组

String sentence = "Hello World this is Java";
String[] words = sentence.split(" ");
// words 现在是 ["Hello", "World", "this", "is", "Java"]

判断字符串特性

boolean str2 = str.isEmpty();

判断字符串是否为空

boolean str2 = str.isBlank();

Java 11起,判断字符串是否为空白(空格、制表符、换行符或空字符串)

连接字符串

一、concat()

String str1 = "Hello World";
String str2 = new String(str1);
String str21 =str1.concat(str2);
System.out.println(str21);

//Hello WorldHello World

二、join()

使用分隔符连接字符串数组

String str =String.join("_","str1","str2");
System.out.println(str);

//str1_str2

其他操作

转换为字节数组

byte[] bytes = str.getBytes();

格式化字符串

String str23 = String.format("hello|%20s|",str1);
System.out.println(str23);

//输出的结果是:hello|         Hello World|

反转字符串(非String类直接方法,但常用)

String reversed = new StringBuilder(str).reverse().toString(); 


StringBuilder


构造方法                

StringBuilder():创建一个空的StringBuilder实例。

StringBuilder(String str):创建一个StringBuilder实例,并将其初始化为指定的字符串内容。

StringBuilder(int a): 创建一个StringBuilder实例,指定空间

public class Main {
    public static void main(String[] args) {
       StringBuilder a = new StringBuilder();
       StringBuilder aa= new StringBuilder(4);
       StringBuilder aaa= new StringBuilder("abd");

       System.out.println(aaa);//abd
    }
}

添加元素        

 append(char[] str,int a,int len)

复制包含a到len-1索引的元素 

StringBuilder a = new StringBuilder();
char[] b={'a','b','c'};
a.append(b,0,2);
System.out.println(a);//ab

 append(CharSequence s,int start,int end)与以上功能一致

appendCodePoint(int codePoint) 

StringBuilder sb = new StringBuilder("Hello");
sb.appendCodePoint(128516); // 将笑脸 😊 的Unicode代码点添加到StringBuilder末尾
System.out.println(sb); // 输出:Hello😊

用于向StringBuilder对象中追加指定的Unicode代码点。 

插入

insert(int offset, CharSequence s):将指定的字符序列插入此序列中指定的位置。

insert(int offset, char[] str)、insert(int offset, char c)、insert(int offset, boolean b)等:在指定位置插入字符、字符数组或基本类型的值

替换

replace(int start, int end, String str):用指定字符串替换此序列中指定位置的子字符串。

删除

delete(int start, int end):删除此序列中指定位置之间的字符。

查找与索引

indexOf(String str)、lastIndexOf(String str):查找指定字符串第一次或最后一次出现的索引位置

子串

substring(int start)、substring(int start, int end):返回此序列中一个子序列的字符串。

转换

toString():将当前StringBuilder对象转换为字符串。

长度与容量管理

length():返回此序列中的字符数量。

capacity():返回当前容量。

ensureCapacity(int minimumCapacity):确保容量至少为指定的最小值。

其他

reverse():将此序列中的字符逆序。

setCharAt(int index, char ch):将给定索引处的字符设置为指定字符。

charAt(int index):返回此序列中指定索引处的字符。

setLength(int newLength):设置字符序列的长度,如果新长度小于原长度,则截断;如果大于原长度,则填充空字符。


Stringjoiner


 使用需要加入

import  java.util.StringJoiner

构造方法:

StringJoiner(CharSequence delimiter)

创建一个 StringJoiner 实例,使用指定的分隔符,前缀和后缀默认为空字符串。

StringJoiner(CharSequence delimiter, CharSequence prefix, CharSequence suffix)

创建一个 StringJoiner 实例,可以指定分隔符、前缀和后缀。

添加元素:

StringJoiner add(CharSequence newElement)

将指定的元素追加到此 StringJoiner 的内部缓冲区,之间插入分隔符。如果这是第一次调用 add,则在添加元素之前会先添加前缀。

合并 :

StringJoiner merge(StringJoiner other)

将另一个 StringJoiner 的元素合并到此 StringJoiner,不会添加其他 StringJoiner 的前缀,但会正确应用分隔符和后缀。

设置空值:

StringJoiner setEmptyValue(CharSequence emptyValue)

设置当没有添加任何元素时返回的字符串。默认情况下,如果没有添加元素,toString 方法将返回由前缀和后缀组成的字符串。

获取结果字符串:

String toString()

返回由已添加的元素构成的字符串,元素之间以分隔符隔开,并且在开始处有前缀,在结束处有后缀。如果没有添加任何元素,则返回通过 setEmptyValue 设置的值或默认构造的前缀+后缀。


String/StringBuilder/Stringjoiner不同点

1. String

不可变性:String类代表的是不可变的字符序列。一旦创建了一个String对象,它的内容就不能改变。任何对String的操作,比如连接、替换等,都会返回一个新的String对象,而不是修改原有的对象。

性能:由于其不可变性,在进行大量的字符串拼接操作时,会产生大量的临时字符串对象,可能导致性能下降和内存消耗增加。

适用场景:适用于字符串内容不经常改变,或不需要频繁进行修改操作的情况,比如常量定义、比较字符串等。

2. StringBuilder

可变性:StringBuilder是String的一个可变版本,专为字符串的修改设计。它允许我们在原来的字符序列基础上进行添加、删除和替换操作,而不需要创建新的对象。

性能:相较于使用+操作符或String的拼接,StringBuilder在进行大量字符串操作时性能更好,因为它减少了内存中对象的创建。

适用场景:适用于需要频繁修改字符串内容的情况,如构建SQL语句、拼接HTML代码等。

3. StringJoiner

StringJoiner是Java 8引入的一个工具类,专门用于以某种分隔符连接多个字符串,形成一个新的字符串。它比直接使用StringBuilder或String的拼接更加方便和直观。

特点:StringJoiner允许你指定前缀、后缀以及分隔符,非常适合于生成CSV样式的数据、日志记录等。


字符串底层相关原理

1、字符串存储的内存原理

String s = “abc”

特点:

此时字符串abc是存在字符串常量池中的。

先检查字符串常量池中有没有字符串abc,如果有,不会创建新的,而是直接复用。如果没有abc,才会创建一个新的。

所以,直接赋值的方式,代码简单,而且节约内存。

2、new关键字,一定是在堆里面开辟了一个小空间。

String s1 = new String(“abc”);

String s2 = “abc”;

s1记录的是new出来的,在堆里面的地址值。

s2是直接赋值的,所以记录的是字符串常量池中的地址值。

3、如果比较的是基本数据类型:比的是具体的数值是否相等。

如果比较的是引用数据类型:比的是地址值是否相等。

==只能用于比较基本数据类型。不能比较引用数据类型。

4、字符串拼接的底层原理

如果拼接字符串的没有变量,那再编译时会触发字符拼接优化机制,编译时拼接的多个字符或者字符串就已经是最终结果。

JDK8字符串拼接的底层原理

StringBuilder的扩容原理如下:

原始容量:当创建一个新的StringBuilder对象时,会初始化一个默认容量的字符数组,通常为16个字符长度。

扩容策略:当需要追加的字符个数超出了当前字符数组的容量时,StringBuilder会通过如下公式计算新的容量:
newCapacity = (oldCapacity + 1) * 2

        StringBuilder he = new StringBuilder();
        he.append("aaa,0,2");
        System.out.println(he.capacity());//16
        System.out.println(he.length());//7

        he.append("sjfdklsflslfjalsflaajslf");
        System.out.println(he.capacity());//34
        System.out.println(he.length());//31

        he.append("sj]]f");
        System.out.println(he.capacity());//70
        System.out.println(he.length());//36

复制元素:在扩容之前,会先检查当前容量是否能够容纳新的字符,如果不行则会创建一个新的字符数组,长度为新的容量。接着会将原来数组中的元素复制到新的数组中。

扩容操作:最后,StringBuilder会将新的字符数组设置为内部的字符数组,从而完成扩容操作。

需要注意的是,每次扩容都会导致字符数组的拷贝,这样会增加一定的开销。

为了减少扩容的次数,可以在创建StringBuilder对象时指定一个较大的初始容量,以避免多次扩容操作,提高性能。

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

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

相关文章

基于知识图谱分析贸易关系走向

基于知识图谱分析贸易关系走向 前言一、基础数据二、贸易规则三、知识图谱可视化四、完整代码 前言 知识图谱是一种用图模型来描述知识和建模世界万物之间的关联关系的技术方法。在贸易关系的分析中,知识图谱可以将各个国家、地区、商品、贸易政策等作为节点&#…

【文件fd】回顾C语言文件操作 | 详细解析C语言文件操作写w追加a | 重定向和“w““a“

目录 前言 回顾C语言的操作 Q1 Q2 Q3 C语言文件操作 w方式 a方式 重定向和"w""a"方式 前言 前面进程虚拟地址空间让我们对进程的理解更加深入。在基础IO我们会详细介绍文件和文件系统。本专题的核心内容是文件。 深刻理解文件(站在…

力扣Hot100-有效的括号(栈stack)

给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括…

⌈ 传知代码 ⌋ 基于BERT的语义分析实现

💛前情提要💛 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间,对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

江苏大信环境科技有限公司:环保领域的开拓者与引领者

2009 年,江苏大信环境科技有限公司在宜兴环保科技工业园成立。自创立之始,该公司便笃定坚守“诚信为本、以质量求生存、以创新谋发展”这一经营理念,全力以赴为客户构建专业的工业有机废气治理整体解决方案,进而成为国家高新技术企…

Java基础语法规范

语法规范 public class HelloWorld{ //类名: 1. 首字母要大写 2. 源文件名与类名相同// 单行注释/* 多行注释除这两个之外还有文档注释。不重要* /public static void main (String[] args){ /* 1. main()⽅法是类体中的主⽅法,该⽅法从{开始到}结束…

基于 Apache Doris 的实时/离线一体化架构,赋能中国联通 5G 全连接工厂解决方案

作者:田向阳,联通西部创新研究院 大数据专家 共创:SelectDB 技术团队 导读: 数据是 5G 全连接工厂的核心要素,为支持全方位的数据收集、存储、分析等工作的高效进行,联通 5G 全连接工厂从典型的 Lambda 架…

华为SSH实验

华为SSH实验 实验拓扑: 实验要求:从SSH客户端AR1采用stelnet方式登录到SSH 服务器端。 实验步骤: 1.完成基本配置(略) sys Enter system view, return user view with CtrlZ. [AR1]sys CLIENT [CLIENT]INT g0/0/0 [C…

【IB Protocal Serial--WQE】

IB Protocal Serial--WQE 1 Intro1.1 What1.2 IBA WQE 本系列文章介绍RDMA技术的具体实现–InfiniBand Protocal; Introduce the features, capalities,components, and elements of IBA. the principles of operation. 1 Intro 1.1 What 理解IB协议下面这三句话对…

思迈特受邀参加工信部等权威机构行业盛会,探讨AI领域前沿技术

近日,思迈特软件作为国产BI领域知名厂商,多次受邀出席行业盛会,与众多业内专家学者、行业精英及知名企业代表等汇聚一堂共襄盛会,探讨行业前沿热点研究及最新趋势,分享企业数字化建设创新成果与成功实践,共…

一文学懂Base64编码原理

前言 Base64编码与ASCII编码一样,也是一种编码方式。不同的是ASCII码采用7位二进制数表示(包括大小写字母、数字、标点符号和一些不可见字符),而Base64采用6位二进制数表示(包括大小写字母、0~9数字、和/)…

【考试100】安全员B证《建设工程安全生产技术》单选题

​ 题库来源:考试100 【考试100】安全员B证《建设工程安全生产技术》单选题 1.在悬空部位作业时,操作人员应( ) A.遵守操作规定 B.进行安全技术交底 C.戴好安全帽 D.系好安全带 【考试100答案】:D…

Nginx企业级负载均衡:技术详解系列(14)—— 账户认证功能

你好,我是赵兴晨,97年文科程序员。 你有没有听说过Nginx的账户认证功能?这可不只是一个技术问题,它关系到我们上网时的安全和便利。就像家里需要一把钥匙才能进们一样,Nginx的账户认证功能就是确保有只有授权的人才能…

C# 写一个简单的Windows Service的服务程序

项目创建及设定部分 使用VS2019创建项目,选择C# Service的选项 按照你喜欢的方式命名,我这边就默认了 添加安装服务,在Service1.cs[Design]中 在设计界面右击,选择如下的"Add Installer" 在出现的"ProjectInstall…

python爬取每日天气情况

python爬取每日天气情况 一、项目简介二、完整代码一、项目简介 本次爬取的目标数据来源于天气网,数据所在的页面如下图所示,本次任务较为简单,按照正常操作流程操作即可,即抓包分析数据接口,发送请求获取数据,解析数据并持久化存储。发送请求使用requests库,解析数据使…

jenkins 用户权限(Manage-Roles)

本次需求将DEV环境和SIT环境分开,SIT用户登录上来只能看他的SIT项目和视图 安装roles插件 进入 manage role 项目授权 用户 正则匹配你需要的项目 dev .*-dev*或者.*-dev$ sit .*-sit最后细分assign role 测试使用sit账号登录 ,视图和项目都是SIT账号的

PG 窗口函数

一,简介 窗口函数也叫分析函数,也叫OLAP函数,通过partition by分组,这里的窗口表示范围,,可以不指定PARATITION BY,会将这个表当成一个大窗口。 二,应用场景 (1)用于分…

LeeCode热题100(1)

本文纯干货,看不懂来打我! 自己先去看一下第一题的题目两数之和:. - 力扣(LeetCode) 简单来说就是让你在一个数组里面找两个数,这两个数的和必须满足等于目标值target才行。 我认为你要是没有思路的话&a…

【R语言基础】如何更新R版本

文章目录 概要流程细节具体步骤 概要 提示:由于软件包的更新,所以需要更新R至新版本 流程细节 查看当前R版本 R.version下载更新包:installr install.packages("installr")library(installr)跟着向导一步步执行安装 具体步骤 …

输入3个字符串,要求将字母按由小到大顺序输出

对于将3个整数按由小到大顺序输出,是很容易处理的。可以按照同样的算法来处理将3个字符串按大小顺序输出。可以直接写出程序。 编写程序: 运行结果: 这个程序是很好理解的。在程序中对字符串变量用关系运算符进行比较,如同对数值…