java三大特殊类之String类(下)

上篇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采用异步处理,属于线程不安全操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值