强哥说Java--Java String和StringBuilder(二)

简介: 强哥说Java--Java String和StringBuilder(二)

5. 字符串切割


5.1 切割为字串数组


String[] split(String regex)方法可将字符串切割为子串,其参数regex是一个正则表达式分隔符,返回字符串数组。


例如,我们使用空格作为分隔符来切割I just poor boy,I need no sympathy字符串,结果将返回含有7个元素的字符串数组:


package com.caq.oop.demo08;
 public class Test {
     public static void main(String[] args) {
         String str1 = "I just poor boy,I need no sympathy";
         String[] a = str1.split(" ");
         for (String index : a) {
             System.out.print(index+'\t');
         }
     }
 }
 I   just    poor    boy,I   need    no  sympathy


注意,有几种特殊的分隔符:* ^ : | . \,要使用转义字符转义。例如:


String[] a = str2.split("\\*");
 String[] b = str3.split("\\\\");
 String[] c = str4.split("\\|");
String[] split(String regex, int limit)


其第二个参数limit用以控制正则匹配被应用的次数


5.2 切割为 byte 数组


在实际工作中,网络上的数据传输就是使用二进制字节数据。因此字符串和字节数组之间的相互转换也很常用。


我们可以使用getBytes()方法将字符串转换为byte数组。例如:


实例演示


package com.caq.oop.demo08;
 public class Test {
     public static void main(String[] args) {
         String str1 = "ABCD";
         byte[] a = str1.getBytes();
         for (byte index : a) {
             System.out.print(index + "\t");
         }
     }
 }


运行结果:

65  66  67  68  


将字节数组转换为字符串的方法很简单,直接实例化一个字符串对象,将字节数组作为构造方法的参数即可:


// 此处的ascii为上面通过字符串转换的字节数组
 String s = new String(ascii);


6. 字符串大小写转换



字符串的大小写转换有两个方法:


toLowerCase() 将字符串转换为小写


toUpperCase() 将字符串转换为大写


我们来看一个实例:


实例演示


package com.caq.oop.demo08;
 public class Test {
     public static void main(String[] args) {
         String str1 = "ABCD";
         String a = str1.toLowerCase();
         System.out.println("小写:"+a);
         String b = str1.toUpperCase();
         System.out.println("大写:"+b);
     }
 }

运行结果:

小写:abcd

大写:ABCD


试想,如果想把字符串HELLO world中的大小写字母互换,该如何实现呢?


这里可以结合字符串切割方法以及字符串连接来实现:


实例演示


package com.caq.oop.demo08;
 public class Test {
     public static void main(String[] args) {
         String str1 = "AB CD";
         //先切割位数组
         String[] a = str1.split(" ");
         //通过索引,分别变为大写和小写
         String result = a[0].toLowerCase() + " " + a[1].toUpperCase();
         System.out.println(result);
     }
 }


运行结果:

ab CD

当然,实现方式不止一种


7. 字符串比较



String类提供了boolean equals(Object object)方法来比较字符串内容是否相同,返回一个布尔类型的结果。


需要特别注意的是,在比较字符串内容是否相同时,必须使用equals()方法而不能使用==运算符。我们来看一个示例:


实例演示


package com.caq.oop.demo08;
 public class Test {
     public static void main(String[] args) {
         String str1 = "AB CD";
         String str2 = new String("AB CD");
         String str3 = "AB CD";
         System.out.println(str1==str2);
         System.out.println(str1.equals(str2));
         System.out.println(str1==str3);
     }
 }



运行结果:

false

true

true


代码中三个字符串str1,str2和str3的内容都是AB CD,因此使用equals()方法对它们进行比较,其结果总是为true。


注意观察执行结果,其中使用==运算符比较str1和str2的结果为true,但使用==运算符比较的str1和str3的结果为false。


这是因为==运算符比较的是两个变量的地址而不是内容。


我用图来解释一下!!!


1.当执行String str1 = "AB CD;"语句时,会在内存的栈空间中创建一个str1,在常量池中创建一个"AB CD",并将str1指向hello。


当执行String str2 = "hello";语句时,栈空间中会创建一个str2,由于其内容与str1相同,会指向常量池中的同一个对象。所以str1与str2指向的地址是相同的


这就是==运算符比较str1和str2的结果为true的原因。


image.png


2.当执行String str3 = new String("hello");语句时,使用了new关键字创建字符串对象,由于对象的实例化操作是在内存的堆空间进行的,此时会在栈空间创建一个str3,在堆空间实例化一个内容为hello的字符串对象,并将str3地址指向堆空间中的hello,这就是==运算符比较str1和str3的结果为false的原因。


image.png


8. 小结



我们介绍了 Java String类的常用方法:


使用length()方法可以获取字符串长度;


使用charAt()、indexOf()以及lastIndexOf()方法可以对字符串进行查找;


substring()方法可以对字符串的进行截取,split()、getBytes()方法可以将字符串切割为数组;


toLowerCase()和toUpperCase()方法分别用于大小写转换,使用equals()方法对字符串进行比较,这里要注意,对字符串内容进行比较时,永远都不要使用==运算符。


这些方法大多有重载方法,实际工作中,要根据合适的场景选用对应的重载方法。!!!


相关文章
|
4月前
|
Java 索引
java基础(13)String类
本文介绍了Java中String类的多种操作方法,包括字符串拼接、获取长度、去除空格、替换、截取、分割、比较和查找字符等。
49 0
java基础(13)String类
|
21天前
|
存储 JavaScript Java
Java 中的 String Pool 简介
本文介绍了 Java 中 String 对象及其存储机制 String Pool 的基本概念,包括字符串引用、构造方法中的内存分配、字符串文字与对象的区别、手工引用、垃圾清理、性能优化,以及 Java 9 中的压缩字符串特性。文章详细解析了 String 对象的初始化、内存使用及优化方法,帮助开发者更好地理解和使用 Java 中的字符串。
Java 中的 String Pool 简介
|
27天前
|
缓存 安全 Java
java 为什么 String 在 java 中是不可变的?
本文探讨了Java中String为何设计为不可变类型,从字符串池的高效利用、哈希码缓存、支持其他对象的安全使用、增强安全性以及线程安全等方面阐述了不可变性的优势。文中还通过具体代码示例解释了这些优点的实际应用。
java 为什么 String 在 java 中是不可变的?
|
3月前
|
Java 测试技术 开发者
Java零基础-indexOf(String str)详解!
【10月更文挑战第14天】Java零基础教学篇,手把手实践教学!
124 65
|
2月前
|
JSON Java 关系型数据库
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
在Java中,使用mybatis-plus更新实体类对象到mysql,其中一个字段对应数据库中json数据类型,更新时报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
98 4
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
|
21天前
|
存储 Java
Java 11 的String是如何优化存储的?
本文介绍了Java中字符串存储优化的原理和实现。通过判断字符串是否全为拉丁字符,使用`byte`代替`char`存储,以节省空间。具体实现涉及`compress`和`toBytes`方法,前者用于尝试压缩字符串,后者则按常规方式存储。代码示例展示了如何根据配置决定使用哪种存储方式。
|
2月前
|
Java
在Java中如何将基本数据类型转换为String
在Java中,可使用多种方法将基本数据类型(如int、char等)转换为String:1. 使用String.valueOf()方法;2. 利用+运算符与空字符串连接;3. 对于数字类型,也可使用Integer.toString()等特定类型的方法。这些方法简单高效,适用于不同场景。
62 7
|
2月前
|
安全
String、StringBuffer、StringBuilder的区别
String 由 char[] 数组构成,使用了 final 修饰,对 String 进行改变时每次都会新生成一个 String 对象,然后把指针指向新的引用对象。 StringBuffer可变并且线程安全;有一定缓冲区容量,字符串大小没超过容量,不会重新分配新的容量,适合多线程操作字符串; StringBuiler可变并且线程不安全。速度比StringBuffer更快,适合单线程操作字符串。 操作少量字符数据用 String;单线程操作大量数据用 StringBuilder;多线程操作大量数据用 StringBuffer
|
3月前
|
存储 SQL 安全
Java零基础-StringBuilder类详解
【10月更文挑战第12天】Java零基础教学篇,手把手实践教学!
39 5
|
3月前
|
Java 测试技术 开发者
Java零基础-indexOf(String str)详解!
【10月更文挑战第13天】Java零基础教学篇,手把手实践教学!
62 1