String类、StringBuilder类、StringBuffer类---常用类

java.lang.String类代表字符串

程序中所有的双引号字符串,都是string类的对象(就算没有new,也照样是)

字符串的特点:

1.字符串的内容永不改变【重点】

2.正式字符串内容永不改变,所以字符串是可以共享使用的

3.字符串效果上相当于char[]字符串数组,但是底层原理是byte[]字节数组

创建字符串的常用3+1种方法

三种构造方法:

public String():创建一个空白字符串,不含有任何信息

public String(char[] array):通过一个字符数组,来创建字符串

public String(byte[] array):通过一个字节数组来创建字符串(本质)

一种直接创建:

String s = "hello";

注意:直接写上双引号,就是字符串对象。jvm会自动帮你创建

package commonclass;

public class TestString01 {
    public static void main(String[] args) {
        //空参构造创建字符串
        String s1 = new String();
        System.out.println(s1);

        //运用字符数组,创建字符串
        char[] chars = {'a','b','c','d'};
        String s2 = new String(chars);
        System.out.println(s2);

        //根据字节数组,创建字符串
        byte[] bytes = {97,98,99};
        String s3 = new String(bytes);
        System.out.println(s3);
        
        //直接""创建字符串
        String s4="abcd";
        System.out.println(s4);
    }
}

字符串常量池:程序当中直接写上的双引号字符串,就在字符串常量池中。

对于基本类型来说,==是进行数值的比较

对于引用类型来说,==是进行【地址值】的比较

package commonclass;

public class TestString02 {
    public static void main(String[] args) {
        String str1 = "abc";
        String str2 = "abc";

        byte[] bytes = {97,98,99};
        String str3 = new String(bytes);

        char[] chars = {'a','b','c'};
        String str4 = new String(chars);

        //对于基本类型来说,==是进行数值的比较

        //对于引用类型来说,==是进行【地址值】的比较

        System.out.println(str1 == str2);//true
        System.out.println(str2 == str3);//false
        System.out.println(str3 == str4);//false
        System.out.println(str2 == str4);//false

    }
}

string类常用方法

1.对字符串内容的比较:

1.1

public boolean equals(Object anObject)//对字符串内容的比较,而==是对地址值的比较

注意:

1.equals方法具有对称性,a.equals(b)和b.equals(a)效果是一样的

2.如果比较双方一个常量,一个变量,推荐将常量写在前面,变量写在后面

推荐: "abc".equlas(str) 不推荐:str.equlas("abc")

原因:

String str5 = null;
System.out.println("abc".equals(str5));//false
System.out.println(str5.equals("abc"));//会出现NullPointerException

1.2

public boolean equalsIgnoreCase(String anotherString)//忽略大小写,对内容字符串进行比较

2.字符串获取的相关方法

public int length()//返回字符串中字符的长度(个数)
public String concat(String str)//将字符串拼接到原字符串后面,并返回
public char charAt(int index)//返回字符串中指定索引值的字符
public int indexOf(String str)//返回参数中的字符串在原字符串中第一次出现的索引值,-1没找到
public int indexOf(String str, int fromIndex)//第fromIndex次出现的索引值,-1没找到
package commonclass;

public class TestString03 {
    public static void main(String[] args) {
        String str1 = "sdosnksmklmsklmcsdlkmcdskld";
        System.out.println("字符串的长度:"+str1.length());

        System.out.println("abc".concat("de"));

        String str2 = "abcdefghijl";
        System.out.println(str2.charAt(2));


        String str3 = "dhdh000dhdh";
        String str4 ="dh";
        System.out.println(str3.indexOf(str4));
        System.out.println(str3.indexOf(str4,3));//第三次出现的索引值


    }
}

3.字符串的截取方法

public String substring(int beginIndex)//截取返回从beginIndex到末尾索引的字符串
public String substring(int beginIndex, int endIndex)//截取从索引beginIndex,到endIndex索引的字符串,注意:[beginIndex,endIndex),左边索引字符包含,右边字符不包含

4.字符串的转化相关方法

public char[] toCharArray()//将字符串变为字符数组,并返回
public byte[] getBytes()//将字符串变为字节数组,并返回
public String replace(CharSequence target, CharSequence replacement)//将原字符串中的一部分字符串替换成新的字符串,并返回。CharSequence,可以接受字符串类型

5.字符串的分割(将一个字符串分割成两个字符串)

public String[] split(String regex) //按照切割规则,将一个字符串分割成字符串数组
 public String[] split(String regex, int limit) //分割成limit部分(返回的字符串数组的长度)("aa,bb,cc,dd"如果limit是2,结果为"aa"和"bb,cc,dd")
    /*
    *注意:regex是一个正则表达式,如果按"."进行切分,需要转义"\\."
    */
String str4 = "aaa.bbb.ccc.ddd";
String[] split1 = str4.split("\\.");//如果是String[] split1 = str4.split("."),split1的长度为0
for (String s : split1) {
    System.out.println(s);
}

练习:

package commonclass;

import java.lang.reflect.Array;

//将一个数组{1,2,3}拼接成字符串[word1#word2#word3]
/*思路
* 方案一:(不可行,string本身值不变)
* 1.先创建一个字符串”[“
* 2.依次读取数组中的数据,拼接成Word1#,与原字符串拼接str=str+string(最后一个数据须特别对待)
* 3.再拼接字符串”]"
* 方案二:
* 先将数组变为字符串,再拼接*/
public class PracticeString01 {

    public static void myConcat1(int[] arr){
       String str1 = "[";

        for (int i = 0; i < arr.length; i++) {
            if (i == arr.length-1){
                str1 = str1 + "word" + arr[i] + "]";
            }else {
                str1 = str1 + "word" + arr[i] +"#";
            }
        }
        System.out.println(str1);
    }

    public static void main(String[] args) {
        int[] arr = {1,2,3};
        myConcat1(arr);
    }
}
package commonclass;

import java.util.Scanner;

//题目:键盘输入一个字符串,统计字符的类型个数
//字符类型可分为大写字母,小写字母,数字,其他
/*思路:
* 1.读取控制台输入的字符串
* 2.将字符串变为字符数组,依次遍历字符,判断字符类型
* 3,。输出不同类型的个数*/
public class PracticeString02 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入字符串:");
        String str = scanner.next();
        char[] chars = str.toCharArray();
        int M = 0;
        int m = 0;
        int n =0;
        int other = 0;

        for (char c : chars) {
            if('A' <=c && c <= 'Z') {
                M++;
            }else if ('a' <= c && c<= 'z'){
                m++;
            }else if ('0' <= c && c <= '9' ){
                n++;
            }else {
                other++;
            }

        }
        System.out.println("大写字母有"+M+"个。");
        System.out.println("小写字母有"+m+"个。");
        System.out.println("数字有"+n+"个。");
        System.out.println("其他字符有"+other+"个。");

    }
}

Stringbuilder类(字符串缓存区,字符串可变化)----常用类

java.lang.StringBuilder类:字符串缓冲区,可以提高字符串的效率,可以改变字符串的内容

构造方法:

public StringBuilder()//构造一个16个字符的初始容量的空字符串
public StringBuilder(String str)//创建一个给定str内容的字符串

常用的成员方法:

public StringBuilder append(....)//往字符缓冲区添加数据

package commonclass;

public class TestStringBuilder01 {
    public static void main(String[] args) {
        StringBuilder stringBuilder = new StringBuilder();
        //append方法返回的是this,调用方法的对象为stringBuilder,this == stringBuilder
        StringBuilder stringBuilder2 = stringBuilder.append("abc");//将stringBuilder的地址赋值给stringBuilder2
        System.out.println(stringBuilder);//abc
        System.out.println(stringBuilder2);//abc
        System.out.println(stringBuilder == stringBuilder2);//true,比较的是地址

        //使用append方法无需接受返回值

        stringBuilder.append(1);
        stringBuilder.append(1.1);
        stringBuilder.append('好');
        stringBuilder.append(true);
        stringBuilder.append("是多少");
        System.out.println(stringBuilder);//abc11.1好true是多少

        //链式编程:方法返回一个对象,可以继续调用这个对象

        stringBuilder.append(3).append(3.3).append('坏').append(true).append("安师大");
        System.out.println(stringBuilder);//abc11.1好true是多少33.3坏true安师大
    }
}

stringBuilder和String可以相互转化

String--->stringBuilder:可以使用stringBuilder的构造方法

​ public StringBuilder(String str),构造一个指定字符串的字符串缓冲区

StringBuilder--->String :使用stringBuilder的toString()方法

​ public String toString()---将StringBuilder转化为string

package commonclass;

public class TestStringBuilder02 {
    public static void main(String[] args) {
        String str = "abc";
        System.out.println(str);
        //String-->StringBuilder
        StringBuilder stringBuilder = new StringBuilder(str);
        //往StringBuilder中添加数据
        stringBuilder.append("cde");
        System.out.println(stringBuilder);
        //StringBuilder-->String
        String string = stringBuilder.toString();
        System.out.println(string);
    }
}

StringBuffer跟StringBuilder的构造方法与成员方法一样

两者区别:

posted @ 2020-08-07 12:51  DannyBoy~  阅读(175)  评论(0编辑  收藏  举报