String类的特点与字符串拼接内存图解

本文详细介绍了Java中String类和StringBuilder类的特性,包括字符串常量池的作用、对象创建区别以及字符串拼接的优化机制。重点讲解了如何通过equals()和equalsIgnoreCase()方法比较字符串,以及StringBuilder的常用方法如append(),replace(),和字符串连接优化原理。
摘要由CSDN通过智能技术生成

一.String类

1.String类的特点

        Java程序中所有的双引号字符串都是String类型的对象。字符串的内容是不可以改变的,它们的值在创建之后不能被改变。虽然String是不可变的,但是多个对象可以共享同一个字符串对象的地址值,而不是需要重新在字符串常量池中创建新的对象。

注意:所有字符串常量都会放在字符串常量池中(Java 7版本本身与之前字符串常量池在方法区中,Java 8之后则在堆空间中)。

2.字符串常量池的说明

        使用字符串字面量直接赋值创建对象时,系统会检测该字符串在字符串常量池中是否存在,若存在,则直接复用常量池中的地址,若不存在,则会在常量池中重新创建一个地址并赋值。

3.字符串创建对象的区别

1.通过构造方法创建:通过new创建的字符串对象,每一次new都会在堆空间申请一个内存空间,虽然内容相同,但是地址不同。

2.直接赋值方式创建:以""方式给出的字符串,只要字符串序列相同(顺序和大小写),无论在程序代码中出现几次,JVM都只会建立一个String对象,并在字符串常量池中维护。

4.String类的常用方法   

1.字符串对象.equals();  传入一个字符串对象,判断调用者字符串对象与参数字符串对象的内容是否相同,区分大小写,返回boolean类型。
2.字符串对象.equalsIgnoreCase();  传入一个字符串对象,判断调用者字符串对象与参数字符串对象的内容是否相同,不区分大小写,返回boolean类型。
3.字符串对象.toString();  打印字符串对象时,自动调用toString方法,返回对象本身,所以打印出来的不是对象的地址,而是对象的值。
4.字符串对象.charAt(索引);  获取字符串对应索引位置的值。
5.字符串对象.length();  获取字符串的长度。
6.字符串对象.toCharArray();  将字符串转换为字符数组。
7.字符串对象.replace();  传入两个字符序列,分别表示要被替换的序列,与要用于替换的序列。返回一个新的字符串。
8.字符串对象.split();  切割字符串,传入一个字符串作为规则(如","或者空格等等)对目标字符串进行切割,最终返回一个字符串数组。
9.字符串对象.subString();  传入一个开始索引和一个结束索引,得到新的字符串。[first,end)。若只传入一个开始的索引,则表示从开始索引位置到最后一个值全部获取为一个新的字符串。
toUpperCase   toLowerCase   将字符串转换为大写或者小写
扩展方法:Integer.parseInt();  传入一个字符串对象,转换为int类型数据。

二.StringBuilder类

1.StringBuilder中的常用方法


1.append()  可以将各种类型数据拼接到StringBuilder容器中。
2.charAt()  可以返回指定索引位置的字符。
3.deletecharAt()  可以删除指定索引位置的字符。
4.length()  获取字符串长度。
5.replace()  用指定String中的字符串去替换此序列子字符串中的String。参数列表(int start,int end,String str)
6.reverse()  用于字符串的反转。
7.subString()  获取指定first到end索引位置的字符串内容。
参数列表(int first,int end)    左闭右开区间
8.toString()  用于返回字符串。
 

2.字符串进行拼接时的注意点

        字符串str1通过""直接赋值的方式创建字符串对象,则系统会在字符串常量池中创建一个对象并将地址值返回给srt1,str2创建时,系统会根据""中的字符串值与常量池中的对象比对,若存在相同的值则直接复用该对象的地址值,若没有则重新创建一个字符串对象在字符串常量池中。

        str3通过构造方法(new)创建字符串时,系统会在堆空间中创建一个对象,将字符串值赋值在这个对象中并将地址值返回给str3。

        str4实现的是字符串变量与字符串常量的拼接,JVM会自动在堆空间中创建一个StringBuilder对象和一个字符串对象,通过append()方法对字符串进行拼接,再通过toString()方法将拼接后的StringBuider对象转换为字符串对象传入新的字符串对象中,最后将字符串对象的地址值返回给str4。

        str5实现的是字符串常量的拼接,这时候就不会像str4一样在堆空间中创建StringBuilder对象来进行拼接了,它会在编译时期间就完成字符串的拼接(常量优化机制),然后系统会检测字符串常量池中是否有相同的对象。

3.字符串的常量优化机制

Java中的字符串常量优化机制是指在编译阶段对字符串常量进行优化,以提高性能和减少内存消耗。这种优化机制主要包括以下两个方面:

1. 字符串常量池:Java中的字符串常量池是一个存储字符串常量的特殊区域,它位于堆内存中。当编译器在编译Java程序时遇到字符串字面值(如"Hello"),它会先检查字符串常量池中是否已经存在相同内容的字符串。如果存在,则直接引用已有的字符串对象,而不会创建新的对象;如果不存在,则在字符串常量池中创建一个新的字符串对象。这样可以避免在运行时重复创建相同内容的字符串对象,节省内存空间。

2. 字符串连接优化:在Java中,使用加号(+)连接字符串时,编译器会对相邻的字符串常量进行优化,将它们合并为一个字符串常量。例如,编译器会将"Hello" + "World"优化为"HelloWorld"。这种优化可以减少在运行时进行字符串连接操作的次数,提高程序的执行效率。

通过字符串常量池和字符串连接优化机制,Java可以在编译阶段对字符串常量进行优化,减少内存消耗和提高程序性能。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值