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