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的原因。
2.当执行String str3 = new String("hello");语句时,使用了new关键字创建字符串对象,由于对象的实例化操作是在内存的堆空间进行的,此时会在栈空间创建一个str3,在堆空间实例化一个内容为hello的字符串对象,并将str3地址指向堆空间中的hello,这就是==运算符比较str1和str3的结果为false的原因。
8. 小结
我们介绍了 Java String类的常用方法:
使用length()方法可以获取字符串长度;
使用charAt()、indexOf()以及lastIndexOf()方法可以对字符串进行查找;
substring()方法可以对字符串的进行截取,split()、getBytes()方法可以将字符串切割为数组;
toLowerCase()和toUpperCase()方法分别用于大小写转换,使用equals()方法对字符串进行比较,这里要注意,对字符串内容进行比较时,永远都不要使用==运算符。
这些方法大多有重载方法,实际工作中,要根据合适的场景选用对应的重载方法。!!!