Java:String类的相关知识总结

本文深入解析Java中String类的内存存储原理,包括常量池、引用地址和不同定义方式的比较。讲解equals与compareTo方法,以及valueOf、toCharArray等实用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在学完Java中String类的知识后,这篇博客是对String类以及相关知识的总结。

String类的存储

String有几种定义方式,分别是:

 

第一种方式是直接定义一个String类型的字符串变量str1,然后用双引号来赋值一个hello字符串;第二种方式是通过new一个String类型的对象来赋值hello字符串给str2;第三种是直接通过char类型数组来将一个字符串拆分成一个个字符放入数组;第四种是将第三种的字符数组直接放进一个新new 的一个String的对象。

在阐述区别之前,其实String是一个引用,而存储字符串是要看String里面的两个成员变量。String类里面的字符串存储时会通过类里面的成员value和hash来进行存储字符串,value本质上是String类里面的字符数组,hash暂时不讨论。

 

下面通过一张图来先具体阐述第一种和第二种的区别:

 

从图中可以看到,方式一是通过在常量池里面查找“hello”字符串然后从常量池里面找到“hello”字符串的地址然后再通过该地址找到专属于“hello”的value变量和hash变量,再将value变量(也就是一个数组)的地址存储到str1的String引用里面。

而第二种是通过new一个String类的对象,这个对象里面包含了value和hash变量,然后再从常量池里面找“hello”的地址,找到后再通过该地址找到专属于“hello”的value和hash值,并将value变量的地址赋值给str2里面value变量的地址(注意不是给str2这个引用传地址),然后此时str2的地址是刚刚新new的一个对象在堆中的地址。

因此str1和str2这两个String类的引用所存储的地址不同,str1是直接找到常量池在常量池里面找到value的地址然后给str1;而str2是新new一个对象,里面包含了value和hash,再从常量池里面找到字符串,再找到字符串的value变量的地址,赋值给str2新new的对象的value的地址里面。

注意:此时str1和str2引用里面的成员value变量存储的地址是一样的,因为指向同一个地址,但是str1和str2引用所引用的地址是不同的。(str1和str2的value里面存储地址一样的前提是同样的字符串,例如上面是同样的字符串hello,若str1存储的字符串是hello,str2存储的字符串是world的话,此时两个引用里面的value变量也不一样了)

 

然后通过“==”来判断str1和str2的地址是否相同:

 

可以看到符合上面所指出的存储方式。

第三种存储hello字符串的方式是通过字符数组将一个个字符拼接成字符串,具体存储方式是在堆区开辟一段连续的空间(其实就是数组的存储方式),然后将字符一个个放进空间,将首元素地址返回给str3,因此str3存储的是字符数组首元素地址。

 

最后一种方式是通过将str3的字符数组放入新new的一个String对象中:

 

第四种方式比较特殊,当String类对象中检测到传入的是一个字符数组时,会自动拷贝一份新的字符数组,地址也是新的,然后再让String新new的对象里面的value指向该新的数组地址,然后str4拿到的是新new的对象的地址(与上面一样),这样str4存储的是新new对象的地址,而新new对象里面的value的地址指向数组的地址。

String类的常用方法:

1:String.equals/String.equalsIgnoreCase方法:用于比较两个String引用的字符串内容是否相同,不在乎是通过什么方式存储;后者是忽略字符串出现的字母大小写进行比较。

2:String.conpareTo方法:

(1:如果比较的两个字符串长度相同,比较字符串大小,相同输出0,不同输出字符串差值大小

(2:如果比较两个字符串长度不同,如果前n个字符相同,根据较短的字符串长度去比较较长的字符串,如果较短的字符串长度为n,较长的字符串长度为n+1,则比较前n个字符,输出长度差1,若两个长度不同的字符串前n个有不同,直接输出差值大小。

3:String.valueOf方法:将数字或者布尔值变成字符串。

4:String.toCharArray方法:将数字字符串变成字符型数组。

5:String.toUpperCase/String.LowerCase方法:将字符串中的小(大)写字母转换成大(小)写字母。

6:String.replace方法:将字符串中某个字符串片段进行替换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值