Java String类基本使用
String类是Java中最常用的类之一,它表示字符串。字符串是由字符数组组成的,但String类对字符数组进行了封装,提供了许多实用方法来操作字符串。
String类的简单描述
String是final类,表示不可变的字符序列。String对象一旦创建后,其值就不能被更改。要得到字符串的不同版本,只能创建新的字符串对象。 String类有很多构造方法,最常用的有:
- String(char[]):将字符数组转换为字符串
- String(byte[]):将字节数组转换为字符串
- String():创建一个空白字符串
- String(String):将字符串常量或字符串对象转换为字符串
String类常用方法
- int length():返回字符串的长度
- char charAt(int index):返回指定位置的字符
- boolean isEmpty():判断字符串是否为空
- String toUpperCase():将字符串转换为大写
- String toLowerCase():将字符串转换为小写
- String trim():去除字符串两边的空格
- boolean contains(String s):判断字符串中是否包含指定的子字符串
- boolean startsWith(String s):判断字符串是否以指定的子字符串开头
- boolean endsWith(String s):判断字符串是否以指定的子字符串结尾
- int indexOf(String s):返回子字符串第一次出现的索引
- String substring(int beginIndex, int endIndex):截取字符串的一部分
- boolean equals(Object obj):比较两个字符串的内容是否相同 下面是一个简单的示例代码:
public class StringDemo {
public static void main(String[] args) {
String s = "Hello World!";
System.out.println(s.length()); // 11
System.out.println(s.charAt(0)); // H
System.out.println(s.isEmpty()); // false
System.out.println(s.toUpperCase()); // HELLO WORLD!
System.out.println(s.toLowerCase()); // hello world!
System.out.println(s.trim()); // Hello World!
System.out.println(s.contains("or")); // true
System.out.println(s.startsWith("He")); // true
System.out.println(s.endsWith("!")); // true
System.out.println(s.indexOf("l")); // 2
System.out.println(s.substring(6, 11)); //World
System.out.println(s.equals("Hello World!")); // true
}
}
除了上面介绍的方法外,String类还有许多其他的方法:
- String replace(char old, char new):将字符串中所有旧的字符替换为新的字符
- String[] split(String regex):将字符串按照给定的正则表达式 regex拆分为多个字符串
- String concat(String str):将指定的字符串连接到此字符串的结尾。等价于用“+”操作符。
- boolean matches(String regex):告知此字符串是否匹配给定的正则表达式。
- String[] chars(): 将字符串转换为字符数组。
- byte[] getBytes(): 将字符串转换为字节数组。
- boolean equalsIgnoreCase(String anotherString):与equals方法类似,忽略大小写。 示例代码:
public class StringDemo2 {
public static void main(String[] args) {
String s = "Hello World!";
String replace = s.replace('l', 'x');
System.out.println(replace); // Hexxo Worxd!
String[] split = s.split(" ");
System.out.println(Arrays.toString(split)); // [Hello, World!]
String concat = s.concat(" Append!");
System.out.println(concat); // Hello World! Append!
boolean matches = s.matches("H[a-z]* W[a-z]*!");
System.out.println(matches); // true
char[] chars = s.chars();
System.out.println(Arrays.toString(chars));
// [H, e, l, l, o, , W, o, r, l, d, !]
byte[] bytes = s.getBytes();
System.out.println(Arrays.toString(bytes));
// [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33]
boolean equals = s.equalsIgnoreCase("hello world!");
System.out.println(equals); // true
}
}
String对象的比较
String s = "abc";
String s1 = "abc";
那么s和s1是否相同?为什么?
s 和 s1 虽然的值相同,但它们是两个不同的字符串对象。 在Java中,字符串对象一旦创建,其值就不可变。每当向字符串对象赋值时,实际上是创建了一个新的字符串对象。 所以 s 和 s1 是两个不同的字符串对象,虽然它们的值相同。可以使用 == 操作符来比较两个字符串对象的地址是否相同,使用 .equals() 方法来比较两个字符串的值是否相同。 示例代码:
String s = "abc";
String s1 = "abc";
System.out.println(s == s1); // false
System.out.println(s.equals(s1)); // true
之所以使用 == 比较地址,是因为 String 对象是不可变的,如果内容相同,为了节省空间,String会维护一个字符串常量池。字符串常量池中不会有两个内容相同的字符串。 所以如果使用 "abc" 这样的字符串常量来创建 String 对象,s 和 s1 的地址实际上是相同的。如:
String s = "abc";
String s1 = "abc";
System.out.println(s == s1); // true
总结
- String对象是不可变的,所以它们可以被共享。例如:
String s = "abc";
String s2 = "abc";
这里的s和s2实际上是同一个对象。 2. 因为String对象是不可变的,所以当一个String对象被改变时,实际上是创建了一个新的String对象。例如:
String s = "abc";
s = s + "d";
这里的s最终指向一个新的String对象"abcd"。 3. 由于String对象的不可变性,可以安全的在多个线程中共享同一个String对象。 4. 频繁的改变字符串内容会导致大量临时String对象存活,降低GC效率。这种情况下,最好使用StringBuilder。 5. String类继承自Object类,实现了Serializable接口,所以String对象可以被序列化。 6. String类有一个常量池,它里面存放着所有字符串字面量和String#intern()方法加入的字符串。 7. String的==比较的是对象的引用(地址),而.equals()是比较字符串的内容。 8. 可以使用String#intern()方法将字符串对象添加到常量池中。如果常量池中已经存在一个等于此 String 的字符串,则返回常量池中字符串的引用;否则,将此 String 添加到常量池中,并返回此 String 引用。 9. String是final类,意味着它的任何方法都无法被重写。 String类是Java开发中使用频率最高的类之一,理解它的内部原理和使用方法对开发非常重要。