图片摘自:http://www.cnblogs.com/lzq198754/p/5787241.html
大神原文:http://blog.csdn.NET/qq_35101189/article/details/54692617?ref=myread
String被final修饰,不可被继承,不可被修改。
String str1="123";
直接用如上的方式创建String 变量,会去常量池中查看是否是该字符串,如果存在,则返回常量池中的地址,如果不存在,则在常量池中创建,同样返回常量池中的地址,这样可以重复复用字符串,如下:
图片摘自架构师社区
String str1="123";
String str3="123";
//true
System.out.println(str1==str3);
String str2=new String("123");
采用构造方法创建对象,如果常量池中不存在,先会去常量池中创建,然后在堆中创建对象。如下中,因为指向的是不同的内存空间,str1指向的是常量池中123字符串的地址,而str2指向的是堆内存中的123.所以下面将会返回false。
String str1="123";
String str2=new String("123");
System.out.println(str1==str2);
https://mp.weixin.qq.com/s/fOvraM-2tTaNSIgNhtEoRw
String提供的工具方法
String setSql = String.format("%s = %s + %d", " field1"," field1",1 );
System.out.println(setSql);
输出:
field1 = field1 + 1
4 StringBuilder
从 JDK 5.0 开始,为StringBuffer类增添了一个单个线程使用的等价类,即 StringBuilder
StringBuilder被final修饰,不能被继承,继承自AbstractStringBuilder类,实现Serializable和CharSequence接口。
public StringBuilder delete(int i, int j);
删除指定区间的字符,i为起始位置,j为终止位置。执行父类AbstractStringBuilder中的相关方法,核心代码为调用System的arrayCopy静态方法 。将j后面的字符放在从i开始的位置
int len = end - start;
if (len > 0) {
System.arraycopy(value, start+len, value, start, count-end);
count -= len;
}
StringBuilder中的其他方法均是调用System的arrayCopy静态方法
5 StringBuffer
StringBuffer同StringBuilder一样也继承自AbstractStringBuilder,
实现Serializable, CharSequence接口。不可被继承,被final修饰。
该类中各个方法同StringBuilder中的方法一样,均是调用父类的方法。
StringBuffer中的方法均被synchronized修饰,为线程安全。
6String StringBuffer StringBuilder区别:
参考博客:
http://www.cnblogs.com/xudong-bupt/p/3961159.html
6.1可变与不可变
String类中使用字符数组保存字符串,因为有“final”修饰符,所以可以知道string对象是不可变。
StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,如下就是,可知这两种对象都是可变的。
6.2 是否线程安全
String中的对象是不可变的,也就可以理解为常量,显然线程安全。
StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。看如下源码:
复制代码
StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。
6.3 StringBuilder与StringBuffer共同点
StringBuilder与StringBuffer有公共父类AbstractStringBuilder(抽象类)。StringBuilder、StringBuffer的方法都会调用AbstractStringBuilder中的公共方法,如super.append(…)。只是StringBuffer会在方法上加synchronized关键字,进行同步。
如果可能,建议优先采用StringBuilder,因为在大多数实现中,它不执行同步,它比 StringBuffer 要快。两者的方法基本相同。
速度从慢到快:String < StringBuffer < StringBuilder 。