String的使用及注意的地方

本文深入探讨 Java 中 String 类的特性,包括不可变性、String 池、字符串操作方法,以及如何在实际开发中高效利用 String 类的特性。

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



String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例来实现。

字符串是常量;它们的值在创建之后不能改变。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享它们

字符串对象是一种特殊的对象.String类是一个不可变的类..也就说,String对象一旦创建就不允许修改

String类有一个对应的String池,也就是 String pool.每一个内容相同的字符串对象都对应于一个pool里的对象.

String类型的值保存在堆内,其值是不能改变的如图:


不得不提的就是一个经典面试题:



(1)String s = new String("abc"); 这句,创建了两个对象..其内容都是"abc".注意,s不是对象,只是引用.只有new生成的才是对象.

创建的流程是,首先括号里的"abc"先到String pool里看有没"abc"这个对象,没有则在pool里创建这个对象..所以这里就在pool创建了一个"abc"对象.然后 通过new语句又创建了一个"abc"对象..而这个对象是放在内存的堆里. .这里的s指向堆里的对象.

 

(2) String s1 = "abc"; 这条语句,s1当然还是引用.没啥可说的.后面的"abc".其实就是上面括号里的"abc".执行的是相同的操作.即 在pool里查找有没"abc"这个对象.没有则创建一个...很显然,第一条语句在pool里已经创建了一个"abc".所以这条语句没有创建对象,s1指向的是pool中的"abc"

 

(3)String s2 = new String("abc"); 这条语句,其实和第一条是一样的,但是,因为第一条已经在pool中创建了"abc"这个对象,所以,这条语句创建了一个对象.s2指向的是堆里的"abc".注意,虽然内容都是"abc",s与s2表示的是不同的对象

 

(4)接下来就很好说了.下面的三个==判断.(注意,==永远是判断内存地址是否相等) s与s1,一个指向堆里的对象,一个指向pool里的.很明显是不同的对象.s与s2.上面说了,虽然都是指向堆里的对象,内容也是"abc",但是也不是相同的对象.s1与s2.一个指向pool,一个指向堆.也不是相同的对象.所以三个都返回false.


解答:创建两个对象   

1、字符数组与字符串

一个字符串可以变为一个字符数组,同样,也可以把一个字符数组,变为一个字符串。

String类中提供了以下的操作方法:

·将字符串变为字符数组:public char[] toCharArray()

·字符数组变为字符串:public Stringchar[] value)

  public Stringchar[] value,int offset,int count)


 

2、从字符串中取出指定位置的字符

如果要想使用此操作,则肯定此方法的返回值是一个char类型。


 

3、字符串与byte数组的转换

byte数组(字节数组),在一般的IO操作中会经常使用到。

String类中提供了以下的方法可以进行字符串与字节数组的转换:

·字符串变为字节数组:public byte[] getBytes()

·将一个字节数组变为字符串:

|- 将全部字节数组变为Stringpublic Stringbyte[] bytes)

|- 将部分字节数组变为Stringpublic Stringbyte[]bytes,int offset,int lenth)


 

4、取得一个字符串的长度

要想取得字符串中的长度:public int length()


5、查找指定的字符串是否存在

在实际操作中,经常会使用到判断一个字符串中是否存在某些内容,此时就可以使用以下的方法:

·从头开始查找:public int indexOf(String str)

·从指定位置开始查找:public int indexOf(String str,int fromIndex)

查找的时候,方法的返回值是一个int类型的数据,此数据表示的是一个字符串的具体位置,如果没有查找到此字符串,则返回“-1”。


 

6、去掉空格

如果一些信息是由用户输入的话,则就可能出现多余的空格,在这种操作中就可以使用trim()去掉字符串的左右空格,但是字符串中间的空格是不可能去掉的。


 

7、字符截取

从一个指定的字符串中取出里面的部分内容,使用的方法:

·从指定位置开始一直截取到结束位置:public String substring(int beginIndex)

·截取指定范围的字符串:public String substring(int beginIndex,int endIndex)


 

8、拆分字符串

如果现在需要按指定的字符串去拆分一个字符串的话,则使用:public String[] split(String regex)


 

9、大小写转换

此功能在一般的开发语言都会存在,讲一个大写的字符串全部字母变为小写,或者将一个小写的字符串中的全部字母变为大写。

·小写变大写:public String toUpperCase()

·大写变小写:public String toLowerCase()


 

 

10、判断是否以指定的字符串开头或结尾

String中可以使用以下的两个方法完成:

·判断是否以指定的字符串开头:public Boolean startsWith(String prefix)

·判断是否以指定的字符串结尾:public Boolean endsWith(String suffix)


 

11、不区分大小写的比较

String类中equals()方法是可以用来进行字符串比较的,但是此种比较方法的只能针对大小写完全一样的字符串进行比较,如果现在要是想进行不区分大小写的比较,则可以使用以下的方法:

·public Boolean equalsIgonoreCaseString anotherString


 

12、字符串替换功能

String类中提供了以下方法用于字符串的替换操作:

·public String replaceAll(String regex,String replacement)


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值