目录
String类
1. 因为在String源码中String类是定义为:public final class String,所以字符串“111234”,“abcd”,“hello”都是不可变的,在出生到死亡都是不变的。在JDk当中双括号括起来的字符串,例如:“abc”,“def”都是直接存储在方法区的字符串常量池中的。只要有双引号就会出现在字符串常量池。
public class Test01 {
public static void main(String[] args) {
String s1 = "abcdef";
String s2 = "abcdef" + "xy";
//分析这个代码中的xy是在哪里拿的?
//凡是双引号括起来的,都在字符串常量池中有一份,这个xy就是常量池中xy
//new对象时在堆内存中开辟空间
String s3 = new String("xy");//这个xy和上面的xy是同一个xy
}
}
public class Test08{
public static void main(String[] args) {
String s1 = "hello";
String s2 = "hello";
System.out.println(s1 == s2);//true
String s3 = new String("xyz");
String s4 = new String("xyz");
//分析结果是true还是false?
System.out.println(s3 == s4);//false
System.out.println(s3.equals(s4));//true
}
}
垃圾回收器不会回收字符串常量池。字符串常量池中的数据也算是对象。
String类的构造方法
1.String s = new String(" ");
2.String s = " ";
3.String s = new String(char数组);
4.String s = new String(char数组,起始下标,长度 );
5.String s = new String(byte数组);
6.String s = new String(byte数组,起始下标,长度 );
String类中常用方法
public class ThreadTest {
public static void main(String[] args){
char[] bytes = {'L','a','W'};
String s = new String(bytes,0,3);
//charAT(int index)返回指定索引处的值
char c = s.charAt(0);
System.out.println(c);
}
}
StringBuffer和Stringbuild进行字符串拼接
如果在实际的开发中,如果需要进行字符串的拼接,用+号会有什么问题。
因为Java中字符串是不可变的,每一次拼接都会产生新的字符串。这样会占用很多空间。
如果要这样进行拼接的话,可以使用StringBuffer。StringBuffer底层实际上是一个数组.
public class ThreadTest {
public static void main(String[] args){
StringBuffer stringBuffer = new StringBuffer();//在使用StringBuffer时候尽量预估底层一个初始化容量,最好减少底层数组的扩容次数,预估计一下大一点的容量
stringBuffer.append("a");
stringBuffer.append("b");
stringBuffer.append("c");
stringBuffer.append(3.14);
System.out.println(stringBuffer);
}
}
public class ThreadTest {
public static void main(String[] args){
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(100);
stringBuilder.append("sss");
System.out.println(stringBuilder);
}
}
StringBuffer和Stringbuild的区别:
1.StringBuffer中的方法是有synchronized关键字修饰是线程安全,而Stringbuild没有synchronized是线程非安全的。