上篇java三大特殊类之String 类(上)讲到String类对象两种实例化方式及其区别,字符串的比较,以及String类的特点,这篇主要讲String类的常用用法。
一、字符与字符串
字符串就是一个字符数组,在String类里面也有其体现:
范例1:
观察charAt()方法
public class TestDemo1 {
public static void main(String[]args){
String str = "Hello";
System.out.println(str.charAt(0));
//如果超过了字符串长度,则会产生StringIndexOutBoundsException异常
System.out.println(str.charAt(10));
}
}
结果:
H
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 10
at java.lang.String.charAt(String.java:658)
at TestDemo1.main(TestDemo1.java:10)
范例2:
字符串和字符数组的转换
public class TestDemo1 {
public static void main(String[]args) {
String str = "helloworld";
char[] data = str.toCharArray(); //字符串转换为字符数组
for (int i = 0; i < data.length; i++) {
System.out.print(data[i]+"、");
data[i] -= 32; //变大写
}
System.out.println();
System.out.println("全部字符数组转换为字符串:"+new String(data));
System.out.println("部分字符数组转换为字符串:"+new String(data,0,5));
}
}
结果:
h、e、l、l、o、w、o、r、l、d、
全部字符数组转换为字符串:HELLOWORLD
部分字符数组转换为字符串:HELLO
范例3:
现在有一个字符串判断是否由数字组成
public class TestDemo1 {
public static boolean isNumber(String str) {
char[] data = str.toCharArray();
for (int i = 0; i < data.length; i++) { //不是数字停止遍历
if (data[i]<'0'||data[i]>'9') {
return false;
}
}
return true;
}
public static void main(String[]args) {
String str = "123love789";
System.out.println(isNumber(str)?"字符串由数组所组成!":"字符串有非数字成员!");
}
}
结果:
字符串有非数字成员!
二、字节与字符串
字节使用byte描述,字节一般在数据的传输和编码转换的时候使用。String中也提供相应的方法,来进行数据的传输和编码的转换。
范例1:
小写字母变大写字母的操作:
public class TestDemo1 {
public static void main(String[]args){
String str = "helloworld";
byte[] data = str.getBytes(); //字符串变为字节数组
for (int i = 0; i < data.length; i++) {
System.out.print(data[i]+"、");
data[i] -= 32;
}
System.out.println();
System.out.println("全部字节数组变为字符串:"+new String(data));
System.out.println("部分字节数组变为字符串:"+new String(data,0,5));
}
}
结果:
104、101、108、108、111、119、111、114、108、100、
全部字节数组变为字符串:HELLOWORLD
部分字节数组变为字符串:HELLO
三、字符串比较
上面使用String类提供的equals()方法,该方法本身是可以进行区分大小写的相等判断,除了这个方法外,String类还提供了了如下比较操作:
范例:
public class TestDemo1 {
public static void main(String[]args){
String str1 = "helloworld";
String str2 = "HELLOWORLD";
System.out.println(str1.equals(str2));
System.out.println(str1.equalsIgnoreCase(str2));
}
}
结果:
false
true
在String类中compareTo()方法是一个非常重要的方法,该方法返回一个整形,该数据会根据大小关系返回三类内容:
1、相等:返回0.
2、小于:返回内容小于0.
3、大于:返回内容大于0.
范例:
public class TestDemo1 {
public static void main(String[]args){
System.out.println("A".compareTo("a"));
System.out.println("a".compareTo("A"));
System.out.println("A".compareTo("A"));
System.out.println("AB".compareTo("AC"));
System.out.println("刘".compareTo("赵"));
}
}
结果:
-32
32
0
-1
-15197
四、字符串查找
从一个完整的字符串之中可以判断指定内容是否存在,对于查找方法有如下定义:
范例1:
字符串查找,最好用最方便的就是contains()
public class TestDemo1 {
public static void main(String[]args){
String str = "helloworld";
System.out.println(str.contains("world"));
}
}
结果:
true
范例2:
判断开头和结尾操作:
public class TestDemo1 {
public static void main(String[]args){
String str = "love***hello";
System.out.println(str.startsWith("love"));
System.out.println(str.startsWith("***",4 ));
System.out.println(str.endsWith("hello"));
}
}
结果:
true
true
true
范例3:
使用indexOf()方法进行位置查找:
public class TestDemo1 {
public static void main(String[]args){
String str = "helloworld";
System.out.println(str.indexOf("world"));//5,w开始的索引
System.out.println(str.indexOf("me")); //-1,没有查到
if (str.indexOf("hello") != -1) {
System.out.println("可以查到指定的字符串!");
}
}
}
结果:
5
-1
可以查到指定的字符串!
在使用indexOf()方法时,需要注意的是,如果内容重复,它只返回查找的第一个位置
public class TestDemo1 {
public static void main(String[]args){
String str = "helloworld";
System.out.println(str.indexOf("l"));//2
System.out.println(str.indexOf("l", 5));//8
System.out.println(str.lastIndexOf("l"));
}
}
结果:
2
8
8
五、字符串替换
范例:
public class TestDemo1 {
public static void main(String[]args){
String str = "helloworld";
System.out.println(str.replaceAll("l", "#"));
System.out.println(str.replaceFirst("l", "#"));
}
}
结果:
he##owor#d
he#loworld
六、字符串拆分
范例1:
实现字符串的拆分:
public class TestDemo1 {
public static void main(String[]args){
String str = "Hello World Hello wfg";
String[] result = str.split(" "); //按照空格拆分
for (String s:result) {
System.out.println(s);
}
}
}
结果:
Hello
World
Hello
wfg
范例2:
字符串的部分拆分:
public class TestDemo1 {
public static void main(String[]args){
String str = "Hello World Hello wfg";
String[] result = str.split(" ", 2); //按照空格拆分
for (String s:result) {
System.out.println(s);
}
}
}
结果:
Hello
World Hello wfg
范例3:
拆分IP地址:
public class TestDemo1 {
public static void main(String[]args){
String str = "127.234.1.2";
String[] result = str.split("\\.");//遇到无法拆分的内容需要"\"转义
for (String s:result) {
System.out.println(s);
}
}
}
结果:
127
234
1
2
范例3:
多次拆分:
public class TestDemo1 {
public static void main(String[]args){
String str = "wfgsama:163|wfg:89";
String[] result = str.split("\\|");
for (int i = 0; i < result.length; i++) {
String[] tmp = result[i].split(":");
System.out.println(tmp[0]+" = "+tmp[1]);
}
}
}
结果:
wfgsama = 163
wfg = 89
七、字符串截取
范例:
public class TestDemo1 {
public static void main(String[]args) {
String str = "helloworld";
System.out.println(str.substring(7));
System.out.println(str.substring(0, 4));
}
}
结果:
rld
hell
八、其他操作方法
范例1:
trim()方法的使用:
public class TestDemo1 {
public static void main(String[]args) {
String str = " Hello World ";
System.out.println("["+str+"]");
System.out.println("["+str.trim()+"]");
}
}
结果:
[ Hello World ]
[Hello World]
范例2:
大小写转换:
public class TestDemo1 {
public static void main(String[]args) {
String str = " Hello World $#@ 哈哈哈王富贵";
System.out.println(str.toUpperCase());
System.out.println(str.toLowerCase());
}
}
结果:
HELLO WORLD $#@ 哈哈哈王富贵
hello world $#@ 哈哈哈王富贵
范例3:
取得字符串长度和是否为空
public class TestDemo1 {
public static void main(String[]args) {
String str = " Hello World $#@ 哈哈哈王富贵";
System.out.println(str.isEmpty());
System.out.println("".isEmpty());
System.out.println(str.length());
System.out.println(" Hello ".length());//空格也算
}
}
结果:
false
true
23
10
范例4:
字符串的连接:
public class TestDemo1 {
public static void main(String[]args) {
System.out.println("Hello"+"World");
System.out.println("Hello".concat("World"));
}
}
结果:
HelloWorld
HelloWorld
范例5:
首字母大写(String类没有提供首字母大写的操作,需自己实现)
public class TestDemo1 {
public static String fistUpper (String str) {
if ("".equals(str) || str == null) {
return str;
}
if (str.length()>1) {
return str.substring(0, 1).toUpperCase()+str.substring(1);
}
return str.toUpperCase();
}
public static void main(String[]args) {
System.out.println(fistUpper("hellowfg"));
System.out.println(fistUpper(""));
System.out.println(fistUpper("a"));
}
}
结果:
Hellowfg
A
九、StringBuffer类
1、回顾String类特点:
任何字符串常量都是String对象,而且String的常量一旦声明不可变更,如果改变对象内容,改变的是其引用指向而已。
通常来讲String的操作比较简单,但是由于String的不可变更的特性,为了方便字符串的修改,提供了StringBuffer类。
2、+、concat()和append()方法的区别:
① +,append()方法都可以对任意数据类型进行拼接,而concat()方法则需要将其他数据类型转换为字符串后才能拼接。
(1)concat():String类的concat()方法,只能拼接字符串,不能拼接其他类型数据。将指定的字符串拼接到该字符串的串尾,并且字符串 本身和拼接的字符串都不能为null,否则运行后会报空指针异常。
(2)"+":可以对字符、数字、字符串等数据类型进行拼接。
(3)append():可以对字符、数字、字符串、等数据类型进行拼接,结果返回一个StringBuffer类型的对象。
3、在String中使用"+"来进行字符串拼接,在StringBuffer类中需要更改为append()方法:
public synchronized StringBuffer append(各种数据类型 b)
范例:
public class TestDemo1 {
public static void fun(StringBuffer temp) {
temp.append("\n").append("www.wfg.com");
}
public static void main(String[]args) {
StringBuffer sb = new StringBuffer();
sb.append("Hello").append("World");
fun(sb);
System.out.println(sb);
}
}
结果:
HelloWorld
www.wfg.com
String和StringBuffer最大的区别在于:String的内容无法更改,而StringBuffer的内容可以修改。频繁修改字符串的情况考虑使用StringBuffer。
两个类的继承结构:
我们发现两个类都是"CharSequence"接口的子类。这个接口描述的就是一系列的字符集。所以字符串是字符集的子类,如果以后看见CharSequence,最简单的联想就是字符串。
注意:
String和StringBuffer类不能直接转换,如果想要互相转换,可以采用以下原则:
(1)String 变为StringBuffer:利用StringBuffer的构造方法或append()方法
(2)StringBuffer变为String:调用toString方法
除了append()方法外,StringBuffer还有一些String类没有的方法
范例1:
字符串反转
public class TestDemo1 {
public static void main(String[]args){
StringBuffer sb = new StringBuffer("helloworld");
System.out.println(sb.reverse());
}
}
结果:
dlrowolleh
范例2:
删除操作:
public class TestDemo1 {
public static void main(String[]args){
StringBuffer sb = new StringBuffer("helloworld");
System.out.println(sb.delete(5, 10));
}
}
结果:
hello
范例3:
插入操作:
public class TestDemo1 {
public static void main(String[]args){
StringBuffer sb = new StringBuffer("helloworld");
System.out.println(sb.delete(5, 10).insert(0, "王富贵"));
}
}
结果:
王富贵hello
小结:String和StringBuffer、StringBuilder的区别:
(1)String的内容不可修改,StringBuffer和StringBuilder的内容可以修改
(2)StringBuffer采用同步处理,属于线程安全操作,而StringBuilder采用异步处理,属于线程不安全操作。