手记

3-Java常用工具类-字符串

字符串处理类。

常用的:  String类和StringBuilder类

Java中字符串是被作为一个String类型的对象来处理的。这节课我们就来了解这个类的其他方法和特性。

主要内容

如何创建String对象; String对象的常用方法; ==和equals方法的区别;String对象的特性不可变性

String常用方法简介

为什么要学习字符串

比如我们要上传一个图片,要求必须是图片格式(jpg gif等),对于上传的文件名称进行判断,看是否是图片格式。

注册用户要求提供邮箱,正确的邮箱,邮箱格式校验。

创建String对象的方法:

创建String对象的方式不止三种,这里先介绍 常用的

String s1= "mtianyan";

创建一个字符串对象mtianyan ,名为s1

String s2=new String();

创建一个空字符串对象,名为s2

String s3=new String("mtianyan");

创建一个字符串对象mtianyan,名为s3

String中的常用方法:

方法说明
int length()返回当前字符串的长度
int indexOf(int ch)查找ch字符在该字符串中第一次出现的位置
int indexOf(String str)查找str子字符串在该字符串中第一次出现的位置
int lastIndexOf(int ch)查找ch字符在该字符串中最后一次出现的位置
int lastIndexOf(String str)查找str子字符串在该字符串中最后一次出现的位置
String substring(int beginIndex)获取从beginIndex位置开始到结束的子字符串
String substring(int beginIndex, int endIndex)获取从beginIndex位置开始到endIndex位置的子字符串
String trim()返回去除了前后空格的字符串
boolean equals(Object obj)将该字符串与指定对象比较,返回true或false
String toLowerCase()将字符串转换为小写
String toUpperCase()将字符串转换为大写
char charAt(int index)获取字符串中指定位置的字符
String[] split(String regex, int limit)将字符串分割为子字符串,返回字符串数组
byte[] getBytes()将该字符串转换为byte数组

String常用方法(上)

package cn.mtianyan.string;public class StringDemo1 {    public static void main(String[] args) {        // 定义一个字符串"JAVA 编程 基础"
        String str="JAVA 编程 基础";        // 打印输出字符串的长度
        System.out.println("字符串的长度是:"+str.length());        // 取出字符'程'并输出
        System.out.println(str.charAt(6));        
        // 取出子串"编程 基础"并输出
        System.out.println(str.substring(5));        
        // 取出子串"编程"并输出
        System.out.println(str.substring(5, 7));
    }

}

字符串长度是包括空格的。

关于字符串索引

运行结果:

substring两个参数时,第二个参数是下一个字符的index值。

String常用方法(下)

indexOf() 和 lastIndexOf方法

package cn.mtianyan.string;public class StringDemo2 {    public static void main(String[] args) {        // 定义一个字符串"JAVA编程基础,我喜欢java编程"
        String str=new String("JAVA编程基础,我喜欢java编程");        
        // 查找字符'A'在字符串中第一次出现的位置
        System.out.println("字符'A'在字符串中第一次出现的位置"+str.indexOf('A'));        // 查找子串"编程"在字符串中第一次出现的位置
        System.out.println("子串\"编程\"在字符串中第一次出现的位置"+str.indexOf("编程"));        
        // 查找字符'A'在字符串中最后一次出现的位置
        System.out.println("字符'A'在字符串中最后一次出现的位置"+str.lastIndexOf('A'));        
        // 查找子串"编程"在字符串中最后一次出现的位置
        System.out.println("子串\"编程\"在字符串中最后一次出现的位置"+str.lastIndexOf("编程"));        
        // 在字符串index值为8的位置开始,查找子串"编程"第一次出现的位置
        System.out.println("在字符串index值为8的位置开始,查找子串\"编程\"第一次出现的位置"+str.indexOf("编程", 8));
    }

}

字符串中出现双引号要转义。

运行结果:

编程练习

使用String类常用方法完成字符串处理。任务

1. 定义一个字符串”abcdefg"
2. 取出子串cde并转换为大写
3. 将DE替换为MM
4. 最后得到结果CMM
package cn.mtianyan.string;public class Exercise {    public static void main(String[] args) {
        String one = new String("abcdefg");
        String two = one.substring(2,5).toUpperCase();
        System.out.println(two);
        two =two.substring(0,1)+"MM";
        System.out.println(two);
    }
}

运行结果:

字符串与bytes数组间的相互转换

String类中getBytes方法使用。

实际开发中,数据传输到网络上,网络上传输的数据是二进制字节型的,我们需要把字符串转换成二进制进行传输。同样,接收到数据之后,我们需要把字节数据转换为字符串。

package cn.mtianyan.string;import java.io.UnsupportedEncodingException;public class StringDemo3 {    public static void main(String[] args) throws UnsupportedEncodingException {        // 字符串和byte数组之间的相互转换
        // 定义一个字符串
        String str=new String("JAVA 编程 基础");        // 将字符串转换为byte数组,并打印输出
        byte[] arrs=str.getBytes();        for(int i=0;i<arrs.length;i++){
            System.out.print(arrs[i]+" ");
        }
    }

}

打印输出的都是一些二进制的字节的数据。1(byte)=8位(bit) 这些数据是与编码有关的。

运行结果:

        System.out.println();        // 将byte数组转换为字符串
        String str1=new String(arrs);
        System.out.println(str1);

此时运行结果:

此时我们的编码和解码使用的编码格式是一致的,都是默认不填的值。

package cn.mtianyan.string;import java.io.UnsupportedEncodingException;public class StringDemo3 {    public static void main(String[] args) throws UnsupportedEncodingException {        // 字符串和byte数组之间的相互转换
        // 定义一个字符串
        String str=new String("JAVA 编程 基础");        // 将字符串转换为byte数组,并打印输出
        byte[] arrs=str.getBytes();        for(int i=0;i<arrs.length;i++){
            System.out.print(arrs[i]+" ");
        }

        System.out.println();        // 将byte数组转换为字符串
        String str1=new String(arrs,"GBK");
        System.out.println(str1);
    }
}

UnsupportedEncodingException为不支持编码异常,在字符编码有问题时触发。

运行结果:

可以看到此时中文出现了乱码情况,解决方案: 将两者编码保持一致

    public static void main(String[] args) throws UnsupportedEncodingException {        // 字符串和byte数组之间的相互转换
        // 定义一个字符串
        String str=new String("JAVA 编程 基础");        // 将字符串转换为byte数组,并打印输出
        byte[] arrs=str.getBytes("GBK");        for(int i=0;i<arrs.length;i++){
            System.out.print(arrs[i]+" ");
        }

        System.out.println();        // 将byte数组转换为字符串
        String str1=new String(arrs,"GBK");
        System.out.println(str1);
        
    }

运行结果:

小结:

字符串和byte数组间的相互转换;编码问题: GBK编码和UTF-8编码

等于运算符与equals方法的区别

package cn.mtianyan.string;public class StringDemo5 {    public static void main(String[] args) {        // ==和equals方法的区别
        // 定义三个字符串,内容都是mtianyan
        String str1="mtianyan";
        String str2="mtianyan";
        String str3=new String("mtianyan");
        System.out.println("str1和str2的内容相同?"+(str1.equals(str2)));
        System.out.println("str1和str3的内容相同?"+(str1.equals(str3)));
        
        System.out.println("str1和str2的地址相同?"+(str1==str2));
        System.out.println("str1和str3的地址相同?"+(str1==str3));
    }
}

equals是字符串内容相同就可以。new 开辟新的内存空间。 ==指地址是否相同。

内存空间,有栈存放类的引用,常量池存放字符串常量,堆里存放new创建的字符串对象

当我们执行语句

        String str1="mtianyan";
        String str2="mtianyan";

栈中就有了一个str1的引用,常量池中生成一个mtianyan,并且str1的引用指向常量池中"mtianyan";
当str2语句执行,同样是栈中生成str2引用,常量池生成"mtianyan" 这时候发现常量池已经有了,不会在常量池中新增。将str2也指向mtianyan

str3即使有一条相同的语句str4(new)。都会在栈中有str3和4的引用,堆中生成两个String对象,地址不同。

字符串的不可变性

package cn.mtianyan.string;public class StringDemo6 {    public static void main(String[] args) {        // String的不可变性
        // String对象一旦被创建,则不能修改,是不可变的
        // 所谓的修改其实是创建了新的对象,所指向的内存空间不变
        String s1="mtianyan";
        String s2="hello,"+s1;        // s1不再指向mtianyan所在的内存空间,而是指向了"hello,mtianyan"
        System.out.println("s1="+s1);
        System.out.println("s2="+s2);

        String s3=new String("hello,mtianyan!");
        System.out.println("子串:"+s3.substring(0,5));
        System.out.println("s3="+s3);
    }

}

new String会在堆中生成实例化String对象,而substring的结果会在常量池中生成。因为String是不可变的,所以我们必须要有临时变量来重新指向它改变后的值。

StringBuilder

String和StringBuilder的区别: String具有不可变性,而StringBuilder不具备。

建议: 当频繁操作字符串时,使用StringBuilder。

因为String是不可变的,中间变量多余。

StringBuilder和StringBuffer二者基本相似:

StringBuffer是线程安全的, StringBuilder则没有,所以性能略高,后面我们会学到线程。字符串处理一般都是单线程,我们使用StringBulider就行了。

java.lang包中包含

即使我们使用默认的无参构造方法,仍然会开辟一个16字节的内存空间。与String类一样可以传入字符数组。

append方法,在末尾增加内容。delete删除内容。insert插入内容。length返回字符串长度,replace方法替换。

StringBuilder常用方法

public class StringBuilderDemo1 {    public static void main(String[] args) {        // 定义一个字符串"你好"
        StringBuilder str=new StringBuilder("你好");        // 在"你好"后面添加内容,将字符串变成"你好,mtianyan!"
           str.append(',');
         str.append("mtianyan!");
         System.out.println("str="+str);
         System.out.println("str="+str.append(',').append("mtianyan!"));
    }
}

运行结果:

        // 将字符串变成"你好,MTIANYAN !"
        // 两种方式:
        // 1. 使用delete方法删除mtianyan,然后再插入MTIANYAN
        System.out.println("替换后:"+str.delete(3,str.length()).insert(3, "MTIANYAN!"));        // 2. 使用replace方法直接替换
        System.out.println("替换后:"+str.replace(3,str.length(),"MTIANYAN!"));        
        // 在字符串"你好,MTIANYAN!"中取出"你好"并输出
        System.out.println(str.substring(0,2));
        System.out.println(str);

运行结果:

小结:

StringBuilder append(String str)StringBuilder delete(int start, int end)StringBuilder insert(int offset, String str)StringBuilder replace(int start, int end, String str)



作者:天涯明月笙
链接:https://www.jianshu.com/p/2b8a97f13785


0人推荐
随时随地看视频
慕课网APP