【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

目录
相关文章
|
18天前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
41 17
|
9天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
14天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
54 4
|
14天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
32 2
|
19天前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
|
23天前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
|
23天前
|
Java API Maven
如何使用 Java 字节码工具检查类文件的完整性
本文介绍如何利用Java字节码工具来检测类文件的完整性和有效性,确保类文件未被篡改或损坏,适用于开发和维护阶段的代码质量控制。
|
22天前
|
存储 Java 编译器
java wrapper是什么类
【10月更文挑战第16天】
23 3
|
25天前
|
Java 程序员 测试技术
Java|让 JUnit4 测试类自动注入 logger 和被测 Service
本文介绍如何通过自定义 IDEA 的 JUnit4 Test Class 模板,实现生成测试类时自动注入 logger 和被测 Service。
22 5
|
26天前
|
Java
在Java多线程编程中,实现Runnable接口通常优于继承Thread类
【10月更文挑战第20天】在Java多线程编程中,实现Runnable接口通常优于继承Thread类。原因包括:1) Java只支持单继承,实现接口不受此限制;2) Runnable接口便于代码复用和线程池管理;3) 分离任务与线程,提高灵活性。因此,实现Runnable接口是更佳选择。
33 2