基本概念
- String
String是字符串是java.lang包下的类,因为有final修饰所以不能被继承
String不是基本数据类型,底层封装的是字符串数组,以及操作数据的api方法
字符串对象一旦被创建,对象将无法被更改,单字符串的引用可以重新赋值
String常量池:
java为了提高性能,静态的字符串(常量),在常量池中创建,并尽量使用同一个对象,重用静态字符串
对重复出现的字符串JVM会首先在常量池中查找.如果有就返回该对象比如: String str1="abc";//abc字符串放置到常量池中,在栈中引用是str1 在另一个作用域中 String str2="abc";abc在常量池中寻找是否有相同字符串,如果有就指向他,没有在常量池中添加
- StringBuffer和StringBuilder比较
StringBuffer和StringBuilder对象可以改变 ,StringBuffer是同步,线程安全,StringBuilder是异步,线程不安全
StringBuffer是单线程的,因为里面的方法都是被synchronized修饰了.所以它线程安全,但是效率自然就降低.
StringBuilder不是是单线程的,因为里面的方法没有被synchronized修饰了.所以它线程不安全,所以效率要更高.
- 三者比较
运行速度快慢:StringBuilder>StringBuffer>String
String运行最慢的原因String是字符串常量,对象创建后不可以更改,
StringBuilder和StringBuffer是字符串变量,对象创建后可以更改
例如:
String s = "a";
System.out.println(s);//输出a
s = s + "b";
System.out.println(s);//输出ab
/* 执行过程:JVM首先创建一个String对象s.再把a赋值个对象s,所以第一次输出a,第二次时,JVM会重新创
建一个s对象,再把a和b加起来赋值给s,,随后之前的s对象以及b会被垃圾收集管理器(GC)收集,所以String的运行速度慢 */