字符串章节学习总结

文章目录

 

字符串

 

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

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

String类部分源码:
60ecc4868ed84ace997587cc1d2649bd.png

 

格式

 

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

  • 1

例如:

 

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

  • 1

 


 

创建字符串

 

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

 

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

  • 1
  • 2

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

 

String str="abcd";

  • 1

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

 

Java内存分区:


9053c6a55e164dfb98bd062b0bed198a.png

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



 

那么这几个内存分区跟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); // 两地址不同 } }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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

 

运行结果

20b2573c7b6048a3995b887ff7090919.png

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



 

链接字符串

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

 

示例:

 

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

  • 1
  • 2
  • 3

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

 

0125a4f6346a441db19c04cf9c17aac2.png
 



 

获取字符串信息

 

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

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

 

获取长度

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

 

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

  • 1
  • 2

String类 length()方法 源码:也是直接返回数组value的长度。
64b4749c351141f48de5c80f5d383615.png



 

获取指定字符

 

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

 

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

  • 1

String类charAt方法源码:
3f0a116b0cca479e81ab013c0bfa6091.png


 

字符串查找

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

1、indexOf(String s) 方法

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

 

格式:str.indexOf(s);

  • 1
 

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

  • 1
  • 2
  • 3

 

2、lastIndexOf(String str) 方法

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

 

格式:String类对象.lastIndexOf(需要查找的串);

  • 1
 

String str="abcdabcdabcd"; String goal="abc"; System.out.println(str.lastIndexOf(goal)); // 输出 8

  • 1
  • 2
  • 3

 

3、contains(String s)方法

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

 

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

  • 1

String类源码:
ec72007ea3764ec29edd9098337722f8.png


 



 

字符串判断

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

1、equals(String s)方法

 

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

  • 1

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

 

2、equalsIgnoreCase(String s)方法

 

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

  • 1

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

 



 

格式化字串

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

该方法有两种重载形式。
0b866298f81c4f88a5d8871aeb6e51f4.png

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

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



 

正则表达式

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

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

 

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

  • 1

26a8e556bc0f47c496e700533e798044.png

 

元字符表
feb8fdd51c104d14ba3524555e0bd197.png

 

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

  • 1

限定修饰符表
e1483b19dbe84d0290ee48b432f87548.png



 

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

例如

如果某一个软件需要绑定用户的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; }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

 

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

 

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

  • 1

 

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



 

StringBuilder类

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

例如:
e5eb0f6693184fdd9b8e699a2538049f.png

StringBuilder类不是字符串,所以要创建StringBuilder类的对象,需要调用其构造方法。
可以传递以下参数进行构造。
52f4ad33ed504a169a7b2d83b5a86492.png

 

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

  • 1
 

StringBuilder sb=new StringBuilder("123");

  • 1

如果需要将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);

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
 

输出结果:wuhu456789absad

  • 1


 

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

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

例如:

 

StringBuilder sb=new StringBuilder("hallo"); sb.insert(5,"world"); System.out.println(sb);

  • 1
  • 2
  • 3
  • 4
 

运行结果:halloworld

  • 1

 

需要知道的是,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);

  • 1
  • 2
  • 3
  • 4
 

运行结果:9

  • 1

 




 

end

 

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值