Java字符串章节学习总结

文章详细介绍了Java中字符串的基础知识,包括如何创建和链接字符串,以及通过`length()`、`indexOf()`和`equals()`等方法获取和比较字符串信息。还讨论了字符串常量池的概念,解释了为何直接赋值创建字符串无需`new`操作符。此外,文章提到了`StringBuilder`类在处理字符串时的高效性,以及正则表达式在字符串判断中的应用。

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

字符串


在Java中,单个字符可以使用char类型保存,而多个字符组成的文本就需要保存在String对象中。String类通常也称字符串类,该类包含多种对字符串操作的方法,以对象的方式操作字符串,能使得对字符串的操作更为简单与灵活。

但是Stirng类的数据存储部分也是通过字符数组实现的,一个被private修饰的常量字符数组。
基本数据类型变量被final修饰后,值不允许被改变,也就成了常量。
引用数据类型变量被final修饰后,指向的地址空间不能被改变,也就是说该变量只能指向当前地址空间,不能指向另一块地址空间,非常的专一。

String类部分源码:
在这里插入图片描述


格式

在Java语言中规定,字符串必须包含在一对英文的双引号(" ")当中。

例如:

"123""hallo,world""喂世界";	// 这些都是符合规定的字符串



创建字符串


String类型变量: 由于在Java中,字符串是使用String类的对象来实现的,类的创建是需要使用到new操作符的,所以字符串的创建也是需要使用到new操作符的。

	String str;	// 这里定义了一个String类的对象
	String str2=new String("123456");	// 这里是创建了一个String类的变量并赋值

但是有的时候,对于String类的对象直接赋值为字符串:

String str="abcd";

但也是没有问题的,但这并没有使用到new操作符。这是因为存储的内存区不同。


Java内存分区:


在这里插入图片描述

有关上述几个区的内容太多了,如果要详讲的话,那么需要讲的东西就太多了而且也比较复杂,那么就不在这里介绍了。




那么这几个内存分区跟String类有什么关系呢,有的,为什么String可以直接赋值不需要经过new操作符呢,因为在方法区内部还有一个特殊的区域,字符串池

在创建字符串时,JVM会先去字符串池先查找是否存在这个字符串,如果需要创建的字符串已存在,那么会直接复用该字符串,将字符串池内的字符串地址返回给引用变量


如果需要创建的字符串不存在,那么会创建该字符串,并放置到字符串池中,然后使用String类的构造器创建一块内存空间,将字符串池内的那个字符串复制到该内存空间,并且将地址返回。

证明:

public class demo {
public static void main(String[] args) {
        String a="123";	// 在字符串池创建了字符串123。并将地址给了a
        String b="123";	// 再字串池发现有字符串a后,直接复用,将地址给b
        
        String c=new String("abc");		//创建了一块内存空间,并将字符串池中的数据复制到该空间
        String d=new String("abc");
        
        System.out.println(a == b);	// 两地址相同
        System.out.println(c == d);	// 两地址不同
	}
}

双等于号 == 比较两端数据是否相等,但是再学习了面向对象章节后,== 在比较基本数据类型时,是比较值是否相等,但是在比较引用数据类型时,是比较地址是否相等。


运行结果

在这里插入图片描述

所以使用直接赋值的方式,也是可以创建String类的目的的。




链接字符串

使用”+“运算符可实现连接对各字符串的功能。使用多个+号,可以连接多个字符串。
只要 ”+“ 运算符的一个操作数是字符串,那么编译器就会自动将另一个操作数也转换成字符串形式。


示例:

String a="9";
String b=a+1;
System.out.println(b);	// 输出结果为:91

上述示例会先将数值1 转换为字符串"1",然后再将字符串“9”和字符串“1” ,按照顺序拼接起来,形成一个新的字符串,底层是通过调用StringBuilder类的append方法实现的。


在这里插入图片描述




获取字符串信息


字符串作为对象,可通过相应方法获取字符串的有效信息。

由于String的数据存储是通过char数组实现的,所有char类型数组有的信息在String类中也是有的,比如长度、通过下标获取某个字符等等,但是该数组是被私有化了,不对外提供使用,所以我们无法直接通过该数组获取信息,只能使用String对外提供的方法来获取。


获取长度

String类是使用char类型数组来存储数据的,所以我们也可以获取字符串的长度,也就是数组的长度。

在Java中是使用String类对象.length(); 方法获取该字符串的长度的,该方法返回值为正整数
个数从一开始计数

String类 length()方法 源码:也是直接返回数组value的长度。
在这里插入图片描述




获取指定字符


String类对外提供charAt方法来获取字符串指定下标的字符。
由于字符串也是由数组实现的,所以字符串的下标也是从0开始到 length-1之间。

格式:String类对象.charAt(需要获取的下标字符);

String类charAt方法源码:
在这里插入图片描述



字符串查找

String类提供几种查找字符串的方法,这里就介绍几种较为常用的吧。

1、indexOf(String s) 方法

该方法会返回形参s串在调用者串处第一次出现的下标位置,如果s串在调用者串中没有出现过,那么返回-1。

格式:str.indexOf(s);	
String str="123456789";
int goalIndex=str.indexOf("56");	
System.out.println(goalIndex);	//	输出 4 

2、lastIndexOf(String str) 方法

该方法返回str在调用者串最后一次出现的下标位置,如果str串只在调用者串中只出现了一次,那么相当于调用indexOf方法。但是如果str串是一个空串,那么调用该方法相等于调用了length方法。

格式:String类对象.lastIndexOf(需要查找的串);
String str="abcdabcdabcd";
String goal="abc";
System.out.println(str.lastIndexOf(goal));	// 输出 8

3、contains(String s)方法

该方法可以用于判断s串是否在调用者串中出现过,出现过就会返回true,没有出现过就返回false。但是该方法的底层也是通过调用indexOf方法实现判断。

格式:boolean flag=str.contains("abc");

String类源码:
在这里插入图片描述






字符串判断

由于字符串是作为一个类来使用的,所以一般无法使用比较运算符 == 进行比较,所以Java提供了两个方法来判断字符串是否相等。

1、equals(String s)方法

格式:str.equals(s); 返回值为布尔类型。

该方法会逐个遍历两字符串的字符,逐个判断是否相等,如果全都相等,那么返回true,否则返回false。


2、equalsIgnoreCase(String s)方法

格式:str.equalsIgnoreCase(s); 返回值为布尔类型。

该方法与equals方法相同,但是在判断时会忽略字符的大小写。





格式化字串

String类的静态format()方法用于创建格式化字符串。

该方法有两种重载形式。
在这里插入图片描述

指定语言环境的方法,字符串被格式化后会使用其指定的语言环境。

日期和时间字符串格式化的话,由于涉及的方法在后期的学习才会涉及到,所以这里就不多叙述了,没学过的话也讲不好毕竟。




正则表达式

正则表达式通过被用于判断语句中,判断字符串是否符合某一格式。正则表达式是含有一些具有特殊意义字符的字符串,这些特殊字符称为正则表达式的元字符。

正则表达式也是通过字符串存储的,字符串使用matches方法使用正则判断字符串。返回值为布尔类型值。

格式:str.matches(regex);	// regex就是需要定义的正则表达式

在这里插入图片描述


元字符表
在这里插入图片描述

需要注意的是,在正则表达式中,‘.’表示任何一个字符,因此在正则表达式中如果想要使用普通意义的点字符,必须使用转义字符'\'进行转义。

限定修饰符表
在这里插入图片描述




正则表达式在字符串判断非常的实用,能减少不必要的代码逻辑,减少代码量。

例如

如果某一个软件需要绑定用户的QQ账号,需要用户输入自己的QQ账号来进行绑定,那么我们就需要对用户输入的QQ账号进行判断。(假设QQ账号的长度在6-20位之间)


如果没有正则表达是的话,我们需要编写一个方法来对用户输入的QQ账号进行判断是否合规。合规返回true,不合规返回false。

普通方法

public static boolean Normal_method(String str){
        // 开头数字判断
        if(str.charAt(0) == '0'){
            System.out.println("格式错误");
            return false;
        }
        // 长度判断
        int n=str.length();
        if(n < 6 || n > 20){
            System.out.println("格式错误");
            return false;
        }
        // 整体判断
        for(int i=1; i<n; ++i){
            char ch=str.charAt(i);
            if(ch < '0' || ch > '9'){
                System.out.println("错误字符");
                return false;
            }
        }
        return true;
    }

但是如果使用正则表达式的话,我们完全不用以上一大堆的代码。一行代码搞定。

String regex="[1-9]\\d{5,19}";

正则表达式功能强大,简化了代码逻辑,但是如果对需要编写的规则理解不够透彻,那么编写的正则式出现错误的机率也比较大,所以一般需要进行大量的练习。




StringBuilder类

创建成功的字符串对象,长度是固定的,内容不能被改变与编译。虽然使用 + 运算符能够达到附加新字符或新字符串的目的,但是 + 运算符是产生一个新的String实例,创建一个新的字符串对象,如果大量的对字符串进行修改,会极大的增加系统开销。

例如:
在这里插入图片描述

StringBuilder类不是字符串,所以要创建StringBuilder类的对象,需要调用其构造方法。
可以传递以下参数进行构造。
在这里插入图片描述

格式:StringBuilder sb=new StringBuilder(参数);	
StringBuilder sb=new StringBuilder("123");

如果需要将StringBuilder类值,转换为Stirng类值呢?StringBuilder提供了toString方法,会将StringBuilder对象内的值转换为字符串进行返回。


所以我们可以将需要对字符串进行大量修改的操作转移到StringBuilder内进操作,操作完毕后再将其转换为字符串。这样就节省了大量的内存空间,提高了运行效率。



StringBuilder类常用方法


1、append()方法

数据添加方法,该方法用于向调用者内追加数据。具有多个重载的形式,可接收任何类型的数据。

StringBuilder sb=new StringBuilder("wuhu");
sb.append(456789);
sb.append("absad");

String str=sb.toString();
System.out.println(str);
输出结果:wuhu456789absad



2、insert(int index,int data) 方法

数据插入方法,该方法是用于往调用者内的指定位置插入数据,index的值必须在调用者的长度范围内。

例如:

StringBuilder sb=new StringBuilder("hallo");
sb.insert(5,"world");
	
System.out.println(sb);	
运行结果:halloworld

需要知道的是,StringBuilder类对象如果直接进行打印的话,是可以直接打印出数据值得,与String类对象一样,其它引用类型对象直接进行打印的话,只会打印出该对象的地址值。



3、delete(int start,int end) 方法

删除数据方法。该方法会首先判断start与end的返回是否合法,如果合法则会删除 [start,edn) 这个区间内的所有数据。否则抛出异常。

StringBuilder类的下标也是从0开始计算,与数组的下标计算一致。

StringBuilder sb=new StringBuilder("123456789");
sb.delete(0,8);

System.out.println(sb);
运行结果:9





end


以上就是字符串章节的学习总结,可以看出,在将字符串作为对象来使用后,Java给我们提供了很多的功能各异的方法,这些方法的功能的确强大,合理的使用能让代码的编写变得非常的顺畅,所以我们需要熟练的使用各种方法,来帮助我们更好的编写代码,但是其中的原理也需要理解透彻,这样才不会知其然而不知其所以然。

以上代码若有错误的地方,请各位指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值