Java String 详解
目录
String详解
1. String实现的接口
public final class String
extends Object
implements Serializable, Comparable<String>, CharSequence
-
final修饰的好处:
- 1.不可变对象是线程安全的,可以用于多线程;
- 2.不可变对象拷贝只需要拷贝地址,效率高;
- 3.不可变类的每个实例中的内容必须在该实例创建的时候就提供出来,并且在该对象的整个生命周期内保持不变。
2.创建String对象的方法比较:
String(byte[ ] bytes):通过byte数组构造字符串对象。
String(char[ ] value):通过char数组构造字符串对象。
String(Sting original):构造一个original的副本。即:拷贝一个original。
String(StringBuffer buffer):通过StringBuffer数组构造字符串对象。
两种比较常见的创建string对象的方式比较:
String str1 = "test";
String str2 = new String("test");
第一种创建方法,也就是通过“”创建的都是常量,首先检查String pool中是否存在字符串”test”,如果存在则直接将”test” 的地址赋值给变量str1,如果不存在则在String pool中新建一个字符串”test”,然后再将其地址赋给变量str1;
第二种创建方法,实际上创建的是两个String对象,一个是“test”,通过“”创建,并且在编译期就已经添加到String pool中了;另一个是在运行期,new String() 方法将在heap中创建一个String对象,并将heap中的对象的引用返回给str2变量。
两种方法的区别:new String()方法无论String pool中是否存在需要创建的对象,都会在heap中创建一个新的对象。
示例
/**
* @ClassName JavaString
* @Description TODO(这里用一句话描述这个类的作用)
* @author eric
* @Date 2016年10月26日 上午11:13:13
* @version 1.0.0
*/
public class JavaString {
public static void main(String[] args) {
String str1 = "test";
System.out.println(str1 == "test"); //true
String str2 = new String("test");
System.out.println(str2 == "test");//false
String str3 = new String("test");
System.out.println(str3 == str2);//false
String str4 = "te" + "st";
//该行语句关联的String类的实体还是一个,在编译的时候,先执行了 + 操作,"test"还是一个对象
System.out.println(str4 == str3);//false
System.out.println(str4 == str1);//true
String a = "te";
final String b = "te";
String str5 = a + "st"; //左边的是一个变量,在运行期才会执行+操作,并在heap中新建一个对象
String str6 = b + "st"; //两个常量的+号在编译时就已经执行了
System.out.println(str5 == "test");//false
System.out.println(str6 == "test");//true
}
}
String() 常见方法
intern()
当String类对象调用intern()方法时,如果String pool中存在等于该String对象的字符串的时候,则返回该字符串的地址;否则向常量池中添加一个相等的字符串并返回该地址。
String concat(String str)
将str连接到该字符串的后面,返回连接之后的字符串,但是不会影响原来的字符串。示例:
public static void main(String[] args) {
String test = "hello";
String test2 = "world";
String test3 = test.concat(test2);
System.out.println(test);
System.out.println(test2);
System.out.println(test3);
}
/*结果输出:
hello
world
helloworld
*/
public String trim()
返回该字符串去掉开头和结尾空格后的字符串。
public String[] split(String regex)
将一个字符串按照指定的分隔符进行分割,返回分割之后的字符串数组。
StringBuilder 和 StringBuffer 比较
由于String是不可变的,每次对String进行修改的时候,都在创建一个新的字符串对象,如果对字符串进行大量的修改,那么Java虚拟机就会浪费大量的资源来创建新的字符串对象。而StringBuilder和StringBuffer则是可变的字符串类,能够提高对字符串进行修改的效率。
StringBuilder是线程不安全的;
StringBuffer是线程安全的。