第13章 字符串类

作者: yangsg | 来源:发表于2019-04-09 16:15 被阅读421次

    1. String

    String被称为字符串常量,一旦赋值后值不可概念,可以通过修改内存指向重新赋值
    == 在字符串中比较的是内存地址
    如果想比较两个字符串的内容是否一致需要使用"equals"方法

    内存理解

    上述图片中的代码,在使用equals比较后,结果都是true
    s1.equals(s2); 结果为true
    s3.equals(s4); 结果为true
    ...
    面试题/笔试题: String中==比较的是什么?equals比较的是什么?
    答案:==比较的是内存地址是否一致,equals比较的是字符串中内容是否一致

    2. String的API

    2.1 构造方法
    • String(); 创建一个表示空字符串("") 的String对象。更多的时候使用的方式
    String str = "";
    

    空字符串不代表null,null是指栈中数据是null,空字符串指的是堆中的字符串没有赋值

    • String(byte[] bytes); 构造一个新的 String通过解码的字节数组指定使用平台的默认字符集。(可以理解为利用ASC码的数组构建一个字符串)

    • String(char[] value) 分配一个新的 String所以它代表当前字符序列中包含的字符数组参数。(可以理解为将字符数组中所有字符拼成一个字符串)

    • String(String org) 初始化一个新创建的 String对象,所以它代表了相同的字符序列作为参数;换句话说,新创建的字符串参数字符串的副本。

    String str = new String("哈哈");
    String str = "哈哈";
    
    • String(StringBuffer sb)和String(StringBuilder sb) 分配一个新的字符串,它包含当前字符序列中包含字符串缓冲区的字符数据(可以理解为将StringBuffer或StringBuilder转换成String)
      更多的是使用StringBuffer和StringBuilder的toString()方法来完成转换

    • String(byte[] b, String charset) 通过charset字符集解码byte数组完成字符串的构建(一般用于字符串在不同字符集之间的转换)

    • String(char[] value, int offset, int count) 在value数组中的offset位置起,使用count个元素构建字符串

    char[] c2 = {'你','好','啊','我','还','行','哈','哈'};
    String s6 = new String(c2, 3, 3);
    System.out.println(s6);
    

    运行结果:“我还行”
    更多的构造方法,请参照API文档

    2.2 API方法
    2.2.1 charAt(int idx) 返回值: char

    返回字符串中idx位置上的字符。比如,得到字符串的首字符

    String str = "abc";
    char c = str.charAt(0);
    

    c得到的字符是'a',字符串的本质上是一个字符数组,注意不要下标越界。

    2.2.2 equals(String str) 返回值:boolean

    判断字符串与目标字符串str中的内容是否一致

    String s1 = new String("haha");
    String s2 = new String("haha");
    String s3 = new String("Haha");
    boolean b1 = s1.equals(s2);
    boolean b2 = s1.equals(s3);
    

    b1的结果是true,b2的结果是false

    2.2.3 equalsIgnoreCase(String str) 返回值:boolean

    判断字符串与目标字符串str中的内容是否一致,忽略大小写

    String s1 = new String("haha");
    String s2 = new String("haha");
    String s3 = new String("Haha");
    boolean b1 = s1.equalsIgnoreCase(s2);
    boolean b2 = s1.equalsIgnoreCase(s3);
    

    b1的结果是true,b2的结果是true

    2.2.4 getBytes() 返回值:byte[]和toCharArray() 返回值:char[]

    getBytes() 返回一个由各个字符拆分成ASC码的byte数组
    toCharArray() 返回一个由各个字符拆分成的char数组

    2.2.5 indexOf(String s) 返回值:int和lastIndexOf(String s)返回值:int

    indexOf(String s) 返回参数s在字符串中第一次出现的位置,如果没有出现过返回-1
    lastIndexOf(String s) 返回参数s在字符串中最后一次出现的位置,如果没有出现过返回-1

    String str2 = "I LIKE GIRL";
    int i1 = str2.indexOf("I");
    int i2 = str2.lastIndexOf("I");
    int i3 = str2.indexOf("i");
    int i4 = str2.indexOf("LIKE");
    

    结果:i1的结果0,i2的结果是8,i3的结果是-1,i4的结果是2

    2.2.6 isEmpty() 返回值:boolean

    判断当前字符串是否为空字符串,相当于代码equals("")
    一般用于检测字符串变量是否有值

    String str3 = null;
    if(str3 == null || str3.isEmpty()) {
        System.out.println("请输入内容");
    }
    

    此处利用了||的短路特征,先判断是否为null,如果str3是null,此处短路越过判断isEmpty,程序正常执行。如果反过来写,先判断isEmpty,当str3为null时会发生空指针异常

    2.2.7 length()返回值:int

    返回字符串中字符的个数,无论什么字符(英文,数字,汉字,标点,空格)都算1个。

    String str2 = "I LIKE GIRL";
    String str4 = "哈哈 哈,呵呵";
    int l1 = str2.length();
    int l2 = str4.length();
    

    l1的值是11,l2的值是7

    2.2.8 replaceAll(String s, String t) 返回值:String

    在源字符串中,使用字符串t替代所有的子字符串s,并返回替代后的字符串
    示例:将源字符串str5中的所有字符A替换为*

    String str5 = "ABDFAKADOABASDALOI";
    String str6 = str5.replaceAll("A", "*");
    System.out.println(str6);
    

    str6结果:*BDF*K*DO*B*SD*LOI

    2.2.9 split(String s)返回值:String[]

    将源字符串,利用s(正则表达式)作为分隔符,将字符串拆分为字符串数组

    String str7 = "A,B,C,11,2,SS,HAH啊,哈哈哈";
    String[] sts = str7.split(",");
    System.out.println(sts.length);
    for(int i = 0; i < sts.length; i++) {
        System.out.print(sts[i]);
        System.out.print("\t");
    }
    System.out.println();
    

    结果:长度是8,数组中是拆分后的结果


    运行结果
    2.2.10 substring(int start)和substring(int start, int end) 返回值:String

    substring(int start):从下标start位置起(含start),截取字符串至结尾
    substring(int start, int end) :从下标start位置起(含start),截取至下标end位置(不含end) [start,end)

    String str8 = "I LIKE GIRL";
    String str9 = str8.substring(2);//[2,]
    String str10 = str8.substring(2,6);//[2,6)
    System.out.println(str9);
    System.out.println(str10);
    

    str9的结果是:LIKE GIRL
    str10的结果是:LIKE

    2.2.11 toLowerCase()和toUpperCase() 返回值:String

    toLowerCase(): 将字符串的所有字符变更为小写
    toUpperCase(): 将字符串的所有字符变更为大写

    String str11 = "I Like Girl";
    String str12 = str11.toLowerCase();
    String str13 = str11.toUpperCase();
    System.out.println(str12);
    System.out.println(str13);
    

    str12的结果是i like girl
    str13的结果是I LIKE GIRL

    2.2.12 trim() 返回值:String

    去掉字符串两端多余的空格,并返回去掉空格的结果

    String str14 = "   adm in        ";
    System.out.println(str14.length());
    String str15 = str14.trim();
    System.out.println(str15.length());
    System.out.println(str15);
    

    str15的结果是:adm in

    更多的API方法,请参照API文档

    3. StringBuffer和StringBuilder

    StringBuffer被称为字符串变量,线程安全的。主要用途是在字符串拼接时,提升程序的运行效率
    StringBuilder被称为字符串变量,线程不安全的。主要用途是在字符串拼接时,进一步提升程序的运行效率

    public class Test {
    
        public static void main(String[] args) {
            String str = ""; //不是null 
            long l1 = System.currentTimeMillis();
            for(int i = 1; i < 40000; i++) {
                str += i;
            }
            long l2 = System.currentTimeMillis();
            System.out.println("耗时:"+(l2-l1)+"ms");
                    
            StringBuffer sb1 = new StringBuffer();
            long l3 = System.currentTimeMillis();
            for(int i = 1; i < 10000000; i++) {
                sb1.append(i);
            }
            long l4 = System.currentTimeMillis();
            System.out.println("耗时:"+(l4-l3)+"ms");
            
            StringBuilder sb2 = new StringBuilder();
            long l5 = System.currentTimeMillis();
            for(int i = 1; i < 10000000; i++) {
                sb2.append(i);
            }
            long l6 = System.currentTimeMillis();
            System.out.println("耗时:"+(l6-l5)+"ms");
        }
    }
    

    运行结果


    运行结果 内存表示

    面试题和笔试题
    (1) ==和equals的区别?
    ==是比较内存地址,equals比较的是字符串内容
    (2) 程序的运行结果

    String str1 = "abc";
    String str2 = "abc";
    String str3 = new String("abc");
    str1 == str2?
    str1 == str3?
    

    (3) String,StringBuffer和StringBuilder的区别
    String是字符串常量,值不能修改,新赋值重新修改内存指向
    StringBuffer和StringBuilder是字符串变量,拼接效率比String高。其中StringBuffer是线程安全的,效率低于StringBuilder(线程不安全的)

    相关文章

      网友评论

        本文标题:第13章 字符串类

        本文链接:https://www.haomeiwen.com/subject/bdwbiqtx.html