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 文档。

posted @ 2020-12-10 01:19  上杉家主-上杉绘梨衣  阅读(160)  评论(0编辑  收藏  举报