【JAVA SE】——对String类的深入理解(下)

简介: 【JAVA SE】——对String类的深入理解(下)

五、字符串查找

  1. 判断一个子串是否存在于主串中:调用String类的contains方法,返回值为boolean。
String str = "abbabcacc";
boolean flg = str.contains("abc");
System.out.println(flg);
//打印结果为true
  1. 从头开始查找一个子串,并返回第一个子串开始的索引位置,如果没有,则返回-1。也可以传入一个索引,代表是从哪个索引位置开始寻找,调用String类中的indexOf方法。
String str = "abbabcacc";
int index = str.indexOf("abc");
System.out.println(index);
//打印结果为3
  1. 从尾处开始寻找,查看主串中有无传入的子串,若有则返回索引值,没有则返回-1。调用String类的lastIndexOf,并且也可以传入索引代表从哪个索引值从尾处寻找到头处。调用String类的lastIndexOf
    代码1:
String str = "abbabcacc";
int index = str.lastIndexOf("ac");
System.out.println(index);
//打印结果为6

当我们要找的子串刚好被“切断”时,它仍然会取到后面的字符返回子串开始的索引值,但是后面的字符的索引值不能取到。

String str = "abbabcacc";
int index = str.lastIndexOf("ac",6);
System.out.println(index);
//打印结果为6
  1. 判断一个字符串是否以指定子串开头,调用String类中的startsWith方法。也可以传入索引值说明从指定位置开始判断是否以指定子串开头。
String str = "abbabcacc";
boolean flg = str.startsWith("abb");
System.out.println(flg);
//打印结果为true
String str = "abbabcacc";
boolean flg = str.startsWith("abb",3);
System.out.println(flg);
//打印结果为false
  1. 判断一个字符串是否以指定子串结尾。调用String类当中的endsWith方法。
String str = "abbabcacc";
boolean flg = str.endsWith("acc");
System.out.println(flg);
//打印结果为true

六、字符串替换

替换字符串中的所有的指定内容。调用String类当中的repalceAll方法。

String str = "helloworld" ; 
System.out.println(str.replaceAll("l", "_"));
//打印结果为he__owor_d

也可以选择替换字符串中的首个内容。调用String类中的repalceFirst方法。

System.out.println(str.replaceFirst("l", "_"));
//打印结果为he_loworld

七、字符串拆分

指定字符串在主串的基础上能分为几个组就等于分为几个String类数组。因此可以通过foreach循环来遍历拆分后的数组的内容。调用String类的split方法。

String str = "hello world hello bit" ; 
String[] result = str.split(" ") ; // 按照空格拆分
for(String s: result) { 
 System.out.println(s); 
}
//打印结果为
hello
world
hello
bit

split方法还能够传入一个limit参数,代表拆分后最多分为几个数组。如果拆分后数组的个数小于这个limit值则按原来拆分的数组的个数拆分,否则数组的个数不能够超过limit值

String str = "hello world hello bit" ; 
String[] result = str.split(" ",2) ; 
for(String s: result) { 
 System.out.println(s); 
}
//打印结果为
hello
world hello bit

当然,对于字符串的拆分可以嵌套拆分,即先拆分为两部分,再根据另一个字符串再拆分。

String str = "name=zhangsan&age=18";
String[] strings = str.split("&");
for (String s:strings) {
 String[] ss = s.split("=");
 for (String s1:ss) {
   System.out.println(s1);
 }
}
//打印结果为
name
zhangsan
age
18

对于字符串的拆分还有几种特殊情况,当遇到需要拆分的为转义字符时,传入指定的字符串则需要传多两个斜杠。例如:

String str = "192.168.1.1";
String[] strings = str.split("\\.");
for (String s:strings) {
     System.out.println(s);
}
//打印结果为
192
168
1
1
    

因此需要注意的是:字符"|“,”*“,”+“都得加上转义字符,前面加上”\"。

对于字符串的拆分还可以根据多个指定的字符串进行拆分,指定的字符串之间用‘|’分隔。

String str = "Java30 12&21#hello";
String[] strings = str.split(" |&|#");
for (String s:strings) {
     System.out.println(s);
}
打印结果为
Java30
12
21
hello

八、字符串截取

对于一个字符串的截取,传入一个索引值代表是从哪个索引开始截取。传入两个索引值则代表截取的范围。调用String类中的substring方法。例如:

String str = "helloworld" ;
System.out.println(str.substring(5));
System.out.println(str.substring(0, 5));
//打印结果为
world
hello

注意:

索引从0开始
注意前闭后开区间的写法, substring(0, 5) 表示包含 0 号下标的字符, 不包含 5 号下标

对于以上字符串操作的方法,我们可以查看其原码能够更好地了解该方法是如何进行操作的。


九、String类中其它的常用方法

  1. String类的trim方法。这个方法是用来去掉字符串中左右两边空格,而字符串中间的空格是不会去掉的。
    代码:
String str = "  abc  def  ";
String s = str.trim();
System.out.println(s);
//打印结果为
abc  def
  1. String类中的toUpperCase和toLowerCase方法。toUpperCase是用来将字符串中的小写字母转变为大写字母,而不是字母的不进行处理。toLowerCase方法是用来将字符串中的大写字母转变为写写字母,而不是字母的也不进行处理。
String str = " hello%$$%@#$%world 哈哈哈 " ; 
System.out.println(str.toUpperCase()); 
System.out.println(str.toLowerCase());
打印结果为:
HELLO%$$%@#$%WORLD 哈哈哈 
hello%$$%@#$%world 哈哈哈 
  1. String类中的concat方法。这个方法是用来连接字符串的,相当于字符串中的拼接,但是连接后的字符串不会入到字符串常量池当中。这里不再演示。

  2. String类中的length方法。它是用来求字符串长度的,跟数组不一样,数组中的length是数组的属性,而String中的length是一个方法。
    代码:

String str = "abcd";
System.out.println(str.length());
//打印结果为4
  1. String类中的isEmpty方法。是用来判断字符串是否为空的。
    代码:
System.out.println("hello".isEmpty());//false
System.out.println("".isEmpty());//true
System.out.println(new String().isEmpty());//true、

十、StringBuffer 和 StringBuilder

对上面String字符串常量池有了了解后,我们知道了String是常量,是不可变的。当拼接时,Java会在编译期间将String类的对象拼接优化为StringBuffer的拼接(不会产生新对象),因此Java中有StringBuffer和StringBuilder中处理字符串,并且它们拼接时不会产生新的对象,而是在原来的字符串基础上拼接。后面我们再将StringBuilder和StringBuffer的区别。

StringBuilder中有一个append方法可以将字符串在原来的基础上拼接。例如当我们有这样的代码时:

String str = "abc";
for (int i = 0; i < 10; i++) {
     str+=i;
}
System.out.println(str);
//打印结果:
abc0123456789

会在常量池中产生很多的临时变量,例abc0会在字符串常量池中产生,abc01又会在字符串常量池中产生等等。如果我们用到StringBuilder的append方法时,可以写为(两种写法最后的结果是相同的,只是StringBuilder处理时不会在字符串常量池中产生临时变量):

StringBuilder stringBuilder = new StringBuilder("abc");
for (int i = 0; i < 10; i++) {
     stringBuilder.append(i);
}
System.out.println(stringBuilder);
//打印结果:
abc0123456789

打印时为什么能够打印StringBuilde类型是因为StringBuilder中重写了父类的toString方法,它能够把StringBuilder类型转变为String类型进行打印。

append方法也可以连着使用。代码如下:

public static void main(String[] args) { 
    StringBuffer sb = new StringBuffer(); 
    sb.append("Hello").append("World"); 
    fun(sb); 
    System.out.println(sb); 
}
//打印结果为
HelloWorld

因此:

  1. String变为StringBuffer:利用StringBuffer的构造方法或append()方法。
  2. StringBuffer变为String:调用toString()方法。

(1)StringBuilder与StringBuffer的区别

StringBuilder与StringBuffer中的方法都是大致相同的。

它们的主要区别就是StringBuilder主要是用于单线程的,而StringBuffer主要是用于多线程的

我们点入StringBuffer类当中按住ctrl+7选择append方法看到如图所示的synchronized英文,则代表是多线程使用的,而StringBuilder类中没有。

【JAVA SE】——对String类的深入理解_StringBulider_17

【JAVA SE】——对String类的深入理解_池_18

结论:

  1. String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
    StringBuffer与StringBuilder大部分功能是相似的
  2. StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作

(2)StringBuilder与StringBuffer常用的方法

StringBuilder与StringBuffer常用的方法一般String类当中都是没有的,例如:append方法、delete方法、reserve方法、insert方法等。

reverse方法:

StringBuffer sb = new StringBuffer("helloworld"); 
System.out.println(sb.reverse());
//打印结果为
dlrowolleh

delete方法:

StringBuffer sb = new StringBuffer("helloworld"); 
System.out.println(sb.delete(5, 10));
//打印结果为
hello

insert方法:

StringBuffer sb = new StringBuffer("helloworld"); 
System.out.println(sb.delete(5, 10).insert(0, "你好"));
//打印结果为:
你好hello

目录
相关文章
|
9天前
|
Java Linux
java基础(3)安装好JDK后使用javac.exe编译java文件、java.exe运行编译好的类
本文介绍了如何在安装JDK后使用`javac.exe`编译Java文件,以及使用`java.exe`运行编译好的类文件。涵盖了JDK的安装、环境变量配置、编写Java程序、使用命令行编译和运行程序的步骤,并提供了解决中文乱码的方法。
24 1
|
9天前
|
Java 索引
java基础(13)String类
本文介绍了Java中String类的多种操作方法,包括字符串拼接、获取长度、去除空格、替换、截取、分割、比较和查找字符等。
22 0
java基础(13)String类
|
6天前
|
安全 Java
String类-知识回顾①
这篇文章回顾了Java中String类的相关知识点,包括`==`操作符和`equals()`方法的区别、String类对象的不可变性及其好处、String常量池的概念,以及String对象的加法操作。文章通过代码示例详细解释了这些概念,并探讨了使用String常量池时的一些行为。
String类-知识回顾①
|
2天前
|
Java API
Java的日期类都是怎么用的
【10月更文挑战第1天】本文介绍了 Java 中处理日期和时间的三个主要类:`java.util.Date`、`java.util.Calendar` 和 `java.time` 包下的新 API。`Date` 类用于表示精确到毫秒的瞬间,可通过时间戳创建或获取当前日期;`Calendar` 抽象类提供丰富的日期操作方法,如获取年月日及时区转换;`java.time` 包中的 `LocalDate`、`LocalTime`、`LocalDateTime` 和 `ZonedDateTime` 等类则提供了更为现代和灵活的日期时间处理方式,支持时区和复杂的时间计算。
26 14
|
6天前
|
安全 Java 编译器
java访问类字段
java访问类字段
|
9天前
|
Java
java的class类
java的class类
18 5
|
9天前
|
Java 数据处理
Java Scanner 类详解
`Scanner` 类是 Java 中 `java.util` 包提供的强大工具,用于从多种输入源(如键盘、文件、字符串)读取数据。本文详细介绍如何创建 `Scanner` 对象并使用其常用方法(如 `next()`, `nextInt()`, `nextLine()` 等)。通过示例代码展示如何从标准输入、字符串及文件中读取数据,并进行输入验证。使用时需注意关闭 `Scanner` 以释放资源,并确保输入类型匹配,避免异常。掌握 `Scanner` 可显著提升程序的数据处理能力。
|
9天前
|
Java 索引
java基础扫盲-String类常用的方法
java基础扫盲-String类常用的方法
|
2月前
|
Java 开发者
奇迹时刻!探索 Java 多线程的奇幻之旅:Thread 类和 Runnable 接口的惊人对决
【8月更文挑战第13天】Java的多线程特性能显著提升程序性能与响应性。本文通过示例代码详细解析了两种核心实现方式:Thread类与Runnable接口。Thread类适用于简单场景,直接定义线程行为;Runnable接口则更适合复杂的项目结构,尤其在需要继承其他类时,能保持代码的清晰与模块化。理解两者差异有助于开发者在实际应用中做出合理选择,构建高效稳定的多线程程序。
47 7
|
2月前
|
Oracle 安全 Java
JDK8到JDK28版本升级的新特性问题之在Java 15及以后的版本中,密封类和密封接口是怎么工作的
JDK8到JDK28版本升级的新特性问题之在Java 15及以后的版本中,密封类和密封接口是怎么工作的