Java中字符串相关的类

news2025/1/18 20:29:38

目录

String类

StringBuffer类

StringBuilder类


String类

String类:代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。
String是一个final类,代表不可变的字符序列。
字符串是常量,用双引号引起来表示。它们的值在创建之后不能更改。
String对象的字符内容是存储在一个字符数组value[]中的。

public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];
    /** Cache the hash code for the string */
    private int hash; // Default to 0
    ......
}

 String 对象的创建

String str = "hello";
//本质上this.value = new char[0];
String s1 = new String(); 
//this.value = original.value;
String s2 = new String(String original); 
//this.value = Arrays.copyOf(value, value.length);
String s3 = new String(char[] a); 
String s4 = new String(char[] a,int startIndex,int count);

 

String str1 = “abc”;与String str2 = new String(“abc”);的区别?

字符串常量存储在字符串常量池,目的是共享;字符串非常量对象存储在堆中。

 

字符串对象的存储

String s1 = "javaEE";
String s2 = "javaEE";
String s3 = new String("javaEE");
String s4 = new String("javaEE");
System.out.println(s1 == s2);//true
System.out.println(s1 == s3);//false
System.out.println(s1 == s4);//false
System.out.println(s3 == s4);//false

Person p1 = new Person("Tom",12);
Person p2 = new Person("Tom",12);
System.out.println(p1.name == p2.name);//true

 

字符串的特性

常量与常量的拼接结果在常量池,且常量池中不会存在相同内容的常量。只要其中有一个是变量,结果就在堆中。如果拼接的结果调用intern()方法,返回值就在常量池中。

String s1 = "hello" ;
String s2 = "world" ;
String s3 = "hel1o" + "world";
String s4 = s1 + "world";
String s5 = s1 + s2;
String s6 = (s1 + s2).intern();

System.out.print1n(s3==s4); //false
System.out.print1n(s3==s5); //false
System.out.print1n(s4==s5); //false
System.out.println(s3==s6); //true

String的使用陷阱

String s1 = "a"; 

说明:在字符串常量池中创建了一个字面量为"a"的字符串。

s1 = s1 + "b"; 

说明:实际上原来的“a”字符串对象已经丢弃了,现在在堆空间中产生了一个字符串s1+"b"(也就是"ab")。如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响程序的性能。

String s2 = "ab";

说明:直接在字符串常量池中创建一个字面量为"ab"的字符串。

String s3 = "a" + "b";

说明:s3指向字符串常量池中已经创建的"ab"的字符串。

String s4 = s1.intern();

说明:堆空间的s1对象在调用intern()之后,会将常量池中已经存在的"ab"字符串赋值给s4。

String的常用方法

序号方法描述
1

char charAt(int index)

返回指定索引处的 char 值。

2

int compareTo(Object o)

把这个字符串和另一个对象比较。

3

int compareTo(String anotherString)

按字典顺序比较两个字符串。

4

int compareToIgnoreCase(String str)

按字典顺序比较两个字符串,不考虑大小写。

5

String concat(String str)

将指定字符串连接到此字符串的结尾。

6

boolean contentEquals(StringBuffer sb)

当且仅当字符串与指定的StringBuffer有相同顺序的字符时候返回真。

7

static String copyValueOf(char[] data)

返回指定数组中表示该字符序列的 String。

8

static String copyValueOf(char[] data, int offset, int count)

返回指定数组中表示该字符序列的 String。

9

boolean endsWith(String suffix)

测试此字符串是否以指定的后缀结束。

10

boolean equals(Object anObject)

将此字符串与指定的对象比较。

11

boolean equalsIgnoreCase(String anotherString)

将此 String 与另一个 String 比较,不考虑大小写。

12

byte[] getBytes()

使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。

13

byte[] getBytes(String charsetName)

使用指定的字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。

14

void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)

将字符从此字符串复制到目标字符数组。

15

int hashCode()

返回此字符串的哈希码。

16

int indexOf(int ch)

返回指定字符在此字符串中第一次出现处的索引。

17

int indexOf(int ch, int fromIndex)

返回在此字符串中第一次出现指定字符处的索引,从指定的索引开始搜索。

18

int indexOf(String str)

返回指定子字符串在此字符串中第一次出现处的索引。

19

int indexOf(String str, int fromIndex)

返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始。

20

String intern()

返回字符串对象的规范化表示形式。

21

int lastIndexOf(int ch)

返回指定字符在此字符串中最后一次出现处的索引。

22

int lastIndexOf(int ch, int fromIndex)

返回指定字符在此字符串中最后一次出现处的索引,从指定的索引处开始进行反向搜索。

23

int lastIndexOf(String str)

返回指定子字符串在此字符串中最右边出现处的索引。

24

int lastIndexOf(String str, int fromIndex)

返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索。

25

int length()

返回此字符串的长度。

26

boolean matches(String regex)

告知此字符串是否匹配给定的正则表达式。

27

boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len)

测试两个字符串区域是否相等。

28

boolean regionMatches(int toffset, String other, int ooffset, int len)

测试两个字符串区域是否相等。

29

String replace(char oldChar, char newChar)

返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。

30

String replaceAll(String regex, String replacement)

使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。

31

String replaceFirst(String regex, String replacement)

使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。

32

String[] split(String regex)

根据给定正则表达式的匹配拆分此字符串。

33

String[] split(String regex, int limit)

根据匹配给定的正则表达式来拆分此字符串。

34

boolean startsWith(String prefix)

测试此字符串是否以指定的前缀开始。

35

boolean startsWith(String prefix, int toffset)

测试此字符串从指定索引开始的子字符串是否以指定前缀开始。

36

CharSequence subSequence(int beginIndex, int endIndex)

返回一个新的字符序列,它是此序列的一个子序列。

37

String substring(int beginIndex)

返回一个新的字符串,它是此字符串的一个子字符串。

38

String substring(int beginIndex, int endIndex)

返回一个新字符串,它是此字符串的一个子字符串。

39

char[] toCharArray()

将此字符串转换为一个新的字符数组。

40

String toLowerCase()

使用默认语言环境的规则将此 String 中的所有字符都转换为小写。

41

String toLowerCase(Locale locale)

使用给定 Locale 的规则将此 String 中的所有字符都转换为小写。

42

String toString()

返回此对象本身(它已经是一个字符串!)。

43

String toUpperCase()

使用默认语言环境的规则将此 String 中的所有字符都转换为大写。

44

String toUpperCase(Locale locale)

使用给定 Locale 的规则将此 String 中的所有字符都转换为大写。

45

String trim()

返回字符串的副本,忽略前导空白和尾部空白。

46

static String valueOf(primitive data type x)

返回给定data type类型x参数的字符串表示形式。

47

contains(CharSequence chars)

判断是否包含指定的字符系列。

48

isEmpty()

判断字符串是否为空。

String的类型转换

基本数据类型、包装类 --> 字符串:

调用String类的public String valueOf(int n)可将int型转换为字符串。
相应的valueOf(byte b)、valueOf(long l)、valueOf(float f)、valueOf(double d)、valueOf(boolean b)可由参数的相应类型到字符串的转换。

字符串 --> 基本数据类型、包装类:

Integer包装类的public static int parseInt(String s):可将由“数字”字符组成的字符串转换为整型。
类似地,使用java.lang包中的Byte、Short、Long、Float、Double类调相应的类方法可以将由“数字”字符组成的字符串,转化为相应的基本数据类型。

字符数组 --> 字符串:

String 类的构造器:String(char[]) 和 String(char[],int offset,int length) 分别用字符数组中的全部字符和部分字符创建字符串对象。

字符串 --> 字符数组:

public char[] toCharArray():将字符串中的全部字符存放在一个字符数组中的方法。
public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin):提供了将指定索引范围内的字符串存放到数组中的方法。

字节数组 --> 字符串:

String(byte[]):通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。 
String(byte[],int offset,int length) :用指定的字节数组的一部分,即从数组起始位置offset开始取length个字节构造一个字符串对象。 

字符串 --> 字节数组:

public byte[] getBytes() :使用平台的默认字符集将此 String 编码为byte 序列,并将结果存储到一个新的 byte 数组中。
public byte[] getBytes(String charsetName) :使用指定的字符集将 此 String 编码到 byte 序列,并将结果存储到新的 byte 数组。

StringBuffer类

当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。
和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。

java.lang.StringBuffer代表可变的字符序列,JDK1.0中声明,可以对字符串内容进行增删,此时不会产生新的对象。所以如果需要对字符串进行修改推荐使用 StringBuffer。

作为参数传递时,方法内部可以改变值。

abstract class AbstractstringBuilder implements Appendable, CharSequence {
    /**
     * The value is used for character storage.
     * value没有final声明,value可以不断扩容。
     */
    char[] value;

    /**
     * The count is the number of characters used.
     * count记录有效字符的个数。
     */
    int count ;
    ......
}

构造方法

StringBuffer类不同于String,其对象必须使用构造器生成。有三个构造器:

StringBuffer()初始容量为16的字符串缓冲区
StringBuffer(int size)构造指定容量的字符串缓冲区
StringBuffer(String str)将内容初始化为指定字符串内容

常用方法

序号方法描述
1public StringBuffer append(String s)
将指定的字符串追加到此字符序列。
2public StringBuffer reverse()
 将此字符序列用其反转形式取代。
3public delete(int start, int end)
移除此序列的子字符串中的字符。
4public insert(int offset, int i)
将 int 参数的字符串表示形式插入此序列中。
5insert(int offset, String str)
将 str 参数的字符串插入此序列中。
6replace(int start, int end, String str)
使用给定 String 中的字符替换此序列的子字符串中的字符。

当append和insert时,如果原来value数组长度不够,可扩容。

如上这些方法支持方法链操作。方法链的原理:


 

StringBuilder类

StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。

StringBuilder 和 StringBuffer 很类似,均代表可变的字符序列,而且提供相关功能的方法也一样。由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。

 StringBuffer 类的其他常用方法:

序号方法描述
1int capacity()
返回当前容量。
2char charAt(int index)
返回此序列中指定索引处的 char 值。
3void ensureCapacity(int minimumCapacity)
确保容量至少等于指定的最小值。
4void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
将字符从此序列复制到目标字符数组 dst
5int indexOf(String str)
返回第一次出现的指定子字符串在该字符串中的索引。
6int indexOf(String str, int fromIndex)
从指定的索引处开始,返回第一次出现的指定子字符串在该字符串中的索引。
7int lastIndexOf(String str)
返回最右边出现的指定子字符串在此字符串中的索引。
8int lastIndexOf(String str, int fromIndex)
返回 String 对象中子字符串最后出现的位置。
9int length()
 返回长度(字符数)。
10void setCharAt(int index, char ch)
将给定索引处的字符设置为 ch
11void setLength(int newLength)
设置字符序列的长度。
12CharSequence subSequence(int start, int end)
返回一个新的字符序列,该字符序列是此序列的子序列。
13String substring(int start)
返回一个新的 String,它包含此字符序列当前所包含的字符子序列。
14String substring(int start, int end)
返回一个新的 String,它包含此序列当前所包含的字符子序列。
15String toString()
返回此序列中数据的字符串表示形式。

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

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

相关文章

[论文分享]MR-MAE:重构前的模拟:用特征模拟增强屏蔽自动编码器

论文题目&#xff1a;Mimic before Reconstruct: Enhancing Masked Autoencoders with Feature Mimicking 论文地址&#xff1a;https://arxiv.org/abs/2303.05475 代码地址&#xff1a;https://github.com/Alpha-VL/ConvMAE&#xff08;好像并未更新为MR-MAE模型&#xff09; …

不容错过!10个Python自动化办公库免费送!(上)

大家好&#xff0c;这里是程序员晚枫&#xff0c;小红薯也叫这个名。 今天给大家分享一下&#xff0c;花费2周时间整理的Python自动化办公库。 本次内容涵盖了Excel、Word、PPT、PDF、微信、文件处理等所有能在办公场景实现自动化的库&#xff0c;希望能够对大家有所帮助。 提…

部署LAMP 平台(二十四)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、概述 二、PHP安装配置 1. PHP的作用 2. PHP安装 2.1 yum安装 2.2 PHP语言简介 三、安装 四、启动 五、书写测试页面 六、客户端访问 七、书写连接数据库页…

C++图形开发(13):得分系统

文章目录 1.定义变量2.得分系统3.分数清零系统4.输出分数5.整段代码 今天来对这个“别碰方块”的游戏进行一个完善&#xff0c;并增加一个得分系统 1.定义变量 首先是定义用于储存得分的变量&#xff1a; int score 0;2.得分系统 那么怎样才能得分呢&#xff1f; 没错&…

数据分析——AB测试应用与实战

摘要 某电商公司非常注重自己的落地页设计&#xff0c;希望通过改进设计来提高转化率。以往该公司全年转化率平均在13%左右&#xff0c;现在希望设计的新页面能够带来更高的转化率&#xff0c;希望新页面的转化率能有2%的提升&#xff0c;达到15%。在正式推出新页面之前&#…

HCIA配置命令集

目录 扩展 交换机 路由器 路由器网关配置 DHCP服务器 Telnet &#xff1a;远程登录协议 静态路由配置 动态路由 OSPF RIP NAT—网络地址转换 ACL—访问控制列表 ACL的分类&#xff1a; 配置 配置基础ACL &#xff1a; 例一&#xff1a; 例二&#xff1a; 配…

微服务 云原生:K8S 核心组件

参考 Kubernetes 官方文档&#xff0c;简要概述 Kubernetes 中的核心组件用途及部分原理。 一个 K8S 集群&#xff0c;可以分为两个部分&#xff1a; 控制平面(Control Plane)。它是一套管理系统&#xff0c;专门来管理集群节点和服务&#xff0c;为集群做出全局决策&#xff…

apache doris数据库集群搭建(二)

1. 概述 该文档主要介绍了主要基于apache doris数据库搭建&#xff08;一&#xff09;的基础上进行集群搭建、升级、扩容操作讲解编写。 2.软硬件需求 Doris 作为一款开源的 MPP 架构 OLAP 数据库&#xff0c;能够运行在绝大多数主流的商用服务器上。为了能够充分运用 MPP 架…

java Exception输出错误详细信息

1、直接输出Exception try {//上传代码} catch (Exception e) {throw new RuntimeException("上传训练数据失败&#xff1a;" e);}输出结果&#xff1a;只输出错误原因&#xff0c;不输出错误发生的位置 2、e.getMessage() throw new RuntimeException("上…

Thymeleaf解析

thymeleaf是一个XML/XHTML/HTML5模板引擎&#xff0c;可用于Web与非Web环境中的应用开发 最开始网站开始发展时&#xff0c;使用HTML展示网页&#xff0c;随着技术的发展和需求变化&#xff0c;出现了前后端交互的页面&#xff0c;不需要使用多个页面去展示一个大同小异的页面。…

Android TvSettings Bug: 密码框无法点击唤起输入法

概述 Android 10 的Box方案&#xff0c; 默认使用的是TvSettings作为系统设置&#xff0c;输入操作的习惯上是使用鼠标&#xff0c;键盘&#xff0c;遥控&#xff0c;日常的场景是没有问题&#xff0c;也不会出现本文中提及的问题。当外接的USB触摸屏后&#xff0c;出现无法点击…

华润燃气牵手腾讯云 数字技术助力燃气行业高质量发展

7月13日&#xff0c;华润燃气与腾讯云正式签署战略合作协议。双方将充分发挥各自优势&#xff0c;探索AI大模型在燃气行业的深度应用&#xff0c;并深耕分布式计算、连接和客户运营等领域&#xff0c;不断提升燃气民生服务的效率、质量&#xff0c;共同推动行业数字化转型和高质…

echarts3D地图+3D柱状图+3D飞线图

echarts版本&#xff1a;5.4.0 echarts-gl版本&#xff1a;2.0.8 示例代码&#xff1a; <template><div><div ref"chinaMap" id"chinaMap" style"width: 90vw;height: 90vh;"></div></div> </template>&l…

【ArcGIS Pro二次开发】(49):村规数据入库【福建省】

之前用Arcpy脚本工具做了一个村规数据入库和主要图纸生成工具。 在使用过程中&#xff0c;感觉对电脑环境比较高&#xff0c;换电脑用经常会一些莫名其妙的错误&#xff0c;bug修得很累。近来随着ArcGIS Pro SDK的熟悉&#xff0c;就有了移植的想法。 这里先把村规数据入库工…

【量化课程】02_2.货币金融学基础概念

2.2_货币金融学基础概念 文章目录 2.2_货币金融学基础概念概述金融体系货币利率利率的风险结构与期限结构货币供给过程中国货币政策工具货币政策效果货币数量论、通货膨胀与货币需求总需求与总供给分析货币政策理论货币政策传导机制 概述 金融市场&#xff1a;资金从剩余方转向…

解决git每次提交都需要输入用户密码

一、背景 在github上贴上了服务器ssh的公钥后&#xff0c;在服务器上推送代码仍旧提示需要输入git的账号和密码。 二、原因 这是因为此时的仓库是http协议下载的&#xff0c;此时的链接并不是通过ssh的&#xff0c;因此在推送代码时&#xff0c;会提示输入git的账号和密码。…

基于Python编写一个B站全自动抽奖的小程序

本文将利用Python编写一个B站全自动抽奖的小程序&#xff0c;可以实时监控自己关注的UP主&#xff0c;如果关注的UP主中有人发布了抽奖的动态&#xff0c;就自动参与这个抽奖。这样就能不错过任何一个可以暴富的机会了。需要的可以参考一下 导语 应好友邀请&#xff0c;帮他写…

i.MX6ULL(十五) 根文件系统

Linux“三巨头”已经完成了 2 个了&#xff0c;就剩最后一个 rootfs( 根文件系统 ) 了&#xff0c;本章我们就来学 习一下根文件系统的组成以及如何构建根文件系统。这是 Linux 移植的最后一步&#xff0c;根文件系统 构建好以后就意味着我们已经拥有了一个完整的、可以运…

Python isdigit()函数使用详解

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;小白零基础《Python入门到精通》 isdigit函数使用详解 1、包含负数的情况2、包含小数的情况3、带圈的数字4、数字上…

重封装Ehcache与Redis模板以便于一二级缓存同步数据(二)

参考: 一级缓存二级缓存的获取与更新顺序&#xff08;一) 简单封装Ehcache与RedisTemplate模版 通常使用一二级缓存时,必须保持一二级缓存数据数据与数据库中数据保持一致 &#xff1b;此时可以简单封装下,一二级缓存的相关接口,便于我…