• java.lang 包(二)java.lang 类 String


    java.lang 类 String

    我们经常使用 String 类来定义一个字符串。字符串是常量,它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。

    String 对象的初始化格式有如下两种:

    String s0 = "abc";
    
    String s1 = new String("abd");
    

    String 类具有丰富的方法,比如计算字符串的长度、连接字符串、比较字符串、提取字符串等等。

    计算字符串长度

    length() 方法

    //方法原型
    public int length(){
    }
    

    调用方法:strName.length();,返回一个 int 类型的整数(字符串中字符数,中文字符也是一个字符)。例如:

    String s1 = "abc";
    String s2 = "Java 语言";
    int len1 = s1.length();
    int len2 = s2.length();
    

    则变量 len1 的值是 3,变量 len2 的值是 6。

    字符串比较

    equals() 方法,该方法的作用是判断两个字符串对象的内容是否相同。如果相同则返回 true,否则返回 false。

    equals() 方法比较是从第一个字符开始,一个字符一个字符依次比较。

    那如果我想忽略掉大小写关系,比如:java 和 Java 是一样的,我们怎么办呢?我们可以调用equalsIgnoreCase()方法,其用法与 equals 一致,不过它会忽视大小写。
    比如:

    public class StringTest {
        public static void main(String[] args){
            String s = new String("Java");
            String m = "java";
            System.out.println("用 equals() 比较,java 和 Java 结果为"+s.equals(m));
            System.out.println("用 equalsIgnoreCase() 比较,java 和 Java 结果为"+s.equalsIgnoreCase(m));
        }
    }
    

    输出结果:

    使用"=="比较的是两个对象在内存中存储的地址是否一样。例如: String s1 = "abc"; String s2 = new String("abc"); boolean b = (s1 == s2); 则变量 b 的值是 false,因为 s1 对象对应的地址是"abc"的地址,而 s2 使用 new 关键字申请新的内存,所以内存地址和 s1 的"abc"的地址不一样,所以获得的值是 false。

    字符串连接

    字符串连接有两种方法:

    • 使用+,比如 String s = "Hello " + "World!"。
    • 使用 String 类的 concat() 方法。

    代码示例:

    String s0 = new String("Hello ");
    String s1 = "World" + "!";   //+号连接
    String s2 = s0.concat(s1); //concat() 方法连接
    System.out.println(s2);
    

    而且使用+进行连接,不仅可以连接字符串,也可以连接其他类型。但是要求进行连接时至少有一个参与连接的内容是字符串类型。

    charAt() 方法

    charAt() 方法的作用是按照索引值(规定字符串中第一个字符的索引值是 0,第二个字符的索引值是 1,依次类推),获得字符串中的指定字符。例如:

             String s = "abc";
             char c = s.charAt(1);
    

    则变量 c 的值是'b'。

    字符串常用提取方法

    说明:在字符串中,第一个字符的索引为 0,子字符串包含 beginindex 的字符,但不包含 endindex 的字符。

    我们来写一些代码,验证一下上面的方法吧

    public class StringTest {
        public static void main(String[] args) {
             String s = "abcdefabc";
             System.out.println("字符 a 第一次出现的位置为"+s.indexOf('a'));
             System.out.println("字符串 bc 第一次出现的位置为"+s.indexOf("bc"));
             System.out.println("字符 a 最后一次出现的位置为"+s.lastIndexOf('a'));
             System.out.println("从位置 3 开始到结束的字符串"+s.substring(3));
             System.out.println("从位置 3 开始到 6 之间的字符串"+s.substring(3,6));
        }
    }
    

    输出结果:

    StringBuffer

    同学们,String 类的字符串创建后是不能够改变的。有些同学都不太明白,我们通过代码看一看吧。

    
    String s = "Hello ";
    s.concat("World!");   //字符串连接
    System.out.println(s); //输出 s,还是"Hello "
    s = s.concat("World!");  //把字符串对象连接的结果赋给了 s 引用
    System.out.println(s);  //输出 s,变成了"Hello World!"
    
    /*
    上述三条语句其实产生了 3 个 String 对象,"Hello ","World!","Hello World!"。第 2 条语句确实产生了"Hello World"字符串,但是没有指定把该字符串的引用赋给谁,因此没有改变 s 引用。第 3 条语句根据不变性,并没有改变"Hello ",JVM 创建了一个新的对象,把"Hello ","World!"的连接赋给了 s 引用,因此引用变了,但是原对象没变。
    */
    

    String 的不变性的机制显然会在 String 常量内有大量的冗余。比如我创建一个循环,使字符'1'依次连接到'n',那么系统就得创建 n+(n-1) 个 String 对象。

    那有没有可变的 String 类呢?

    StringBuffer 类是可变的。它是 String 的对等类,它可以增加和编写字符的可变序列,并且能够将字符插入到字符串中间或附加到字符串末尾,当然是不用创建其他对象的,这里建议大家去看一看 String 类与 StringBuffer 类的区别,理解一下他们在内存中的存储情况。

    先上 StringBuffer 的构造方法:

    StringBuffer 类的常用方法:

    public class StringTest {
    
        public static void main(String[] args){
            //定义和初始化一个 StringBuffer 类的字串 s
            StringBuffer s = new StringBuffer("I");
            //在 s 后面添加字串" java"
            s.append(" java");
            //在 s[1] 的位置插入字串
            s.insert(1, " love");
            String t = s.toString(); //转为字符串
            System.out.println(t);
        }
    }
    

    输出结果为: I love java

    其他的方法,请同学们一定要自己亲自一一验证一下!

    在这里只介绍了 String 类常用的方法,其他方法可参照 JDK 文档。

  • 相关阅读:
    C语言I作业12—学期总结
    # 第一周作业
    C语言Ⅰ博客作业11
    C语言Ⅰ博客作业10
    C语言Ⅰ博客作业09
    C语言Ⅰ博客作业08
    C语言||作业01
    C语言寒假大作战04
    C语言寒假大作战03
    C语言寒假大作战02
  • 原文地址:https://www.cnblogs.com/sakura579/p/14106599.html
Copyright © 2020-2023  润新知