概述
String 在java.lang包下,用时不用导包。
String是字符串。
- 特点:
1:String的值在创建之后不可改变。
2:String虽然在创建之后不可改变但是可以被共享。
3:底层的实现原理是字节数组(byte[])。
String的常用构造方法:
String s = "a";
String s2 = s + "";
System.out.println(s == s2);
String s3 = "a" + "";
System.out.println(s2 == s3)
分析:
对String对象进行 + 操作,实际上,会创建一个临时的StringBuilder对象进行实现拼接操作,用StringBuilder的append()方法拼接完毕,再调用toString()方法返回。
而 对于编译时常量,在编译后直接能计算出拼接后的字符串值,此时不需要再运行时创建临时StringBuilder对象。
于是,第三行String s2 = “a” + “” 就相当于 String s2 = “a”
- String字符串拼接符 “+”底层原理
1:字符串常量的拼接
String str3="hello"+" word!";
String str4="hello word!";
System.out.println(str3==str4);
//运行结果:true
原因:JVM编译器对字符串做了优化,在编译时str3就已经被优化成“hello Word!”,str3和str4指向字符串常量池同一个字符串常量,所以==比较为true。
2:字符串+字符串变量、字符串变量之间的拼接。
String str1="hello";
String str2=" word!";
String str3="hello word!";
String str4=str1+"word!";
System.out.println(str3==str4);
//运行结果为false
原因:字符串拼接时如果有字符串变量参与拼接,底层调用了StringBuffer可变字符串处理。代码如下
StringBuffer sb=new StringBuffer("");
sb.append(str1);
sb.append("word!");
str4= sb.toString();
//StringBuffer的toString()方法底层new了一个String对象,所以str4在堆内存中重新开辟了空间,
//str3指向常量池,所以为false
StringBuider
注意因为append 返回的是对象,所以可以使用链式编程。