概述
String类表示字符串。 Java程序中的所有字符串文字(例如"abc" )都实现为此类的实例。
字符串是不变的; 它们的值在创建后无法更改。 字符串缓冲区支持可变字符串。 因为String对象是不可变的,所以可以共享它们。
由于String对象不变,当内容一样时,允许共享地址存储。当需要堆字符串做很多修改,那么应该使用StringBuffer & StringBuilder类
package Demo1;
public class Demo5 {
public static void main(String[] args) {
String test1 = "123123";
String test2 = "123123";
System.out.println(test1 == test2);
}
}
运行结果:
创建字符串
String str = "hello";
在代码中遇到字符串常量时,这里的值是 “hello”",编译器会使用该值创建一个 String 对象
此外,也可以用关键字和构造方法来创建String对象
String str = new String("hello");
String创建的字符串存储在公共池中,而new创建的字符串对象在堆上
String 方法
方法 | 方法描述 |
---|---|
char charAt(int index) | 返回指定索引处的 char 值 |
int compareTo(Object o) | 把这个字符串和另一个对象比较 |
int compareTo(String anotherString) | 按字典顺序比较两个字符串 |
int compareToIgnoreCase(String str) | 按字典顺序比较两个字符串,不考虑大小写 |
String concat(String str) | 将指定字符串连接到此字符串的结尾 |
boolean contentEquals(StringBuffer sb) | 当且仅当字符串与指定的StringBuffer有相同顺序的字符时候返回真 |
static String copyValueOf(char[] data) | 返回指定数组中表示该字符序列的 String |
boolean equals(Object anObject) | 将此字符串与指定的对象比较 |
int hashCode() | 返回此字符串的哈希码 |
int indexOf(int ch) | 返回指定字符在此字符串中第一次出现处的索引 |
int length() | 返回此字符串的长度 |
String replace(char oldChar, char newChar) | 返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。 |
String substring(int beginIndex) | 返回一个新的字符串,它是此字符串的一个子字符串 |
String 和StringBuilder、StringBuffer 的区别?
- 可变性
a. String类中使用final关键字修饰字符数组来保存字符串,因此String对象是不可变的
b. 而StringBuilder与StringBuffer继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,但是没有用final关键字修饰,因此这两种对象都是可变的 - 线程安全性
a. String中的对象是不可变的,也就可以理解为常量,线程安全。
b. StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以也是线程安全的,
c. StringBuilder并没有对方法加同步锁,因此非线程安全。 - 性能
a. 每次对String类型进行改变的时候,都会生成一个String对象,然后将指针指向新的String对象,
b. StringBuffer灭磁都会对StringBuffer对象本身进行操作,而不是生成新的对象并改变对象引用。
c. 在相同情况夏使用StringBuilder相比使用StringBuffer仅仅能获得10%~15%左右性能提示,但是却要冒多线程不安全的风险
总结:
- 操作少量数据,适用String
- 单线程操作字符串缓冲区下操作大量数据,适用StringBuilder
- 多线程操作字符串缓冲区下操作大量数据,适用 StringBuffer