先叙述char[ ],string,new string这部分内容
Java里面的char[ ],string,new string
Java里面char[ ]数组和string不一样,
只不过string的底层原理用的char[]数组.
String:在栈空间创建一个引用,然后去字符串常量池,去查有没有这个字符串,如果有,直接指向;
如果没有,就在字符串常量池创建这个字符串,然后指向.
New string:他会在堆空间创建新的对象,并检测字符串有没有这个字符串,如果有,就直接指向这个value(值),如果没有,他会创建这个value,再去指向.
eg:
代码及图解如下:
String s1 = "nb";
String s2 = "nb";
//System.out.println(s1==s2);//true
String s3 = new String("nb");
String s4 = new String(s1);
String s5 = new String(s3);
//System.out.println(s1==s3);//false
//System.out.println(s1==s4);//false
//System.out.println(s1==s5);//false
char [] cs = {'n','b'};//char类型不创建对象
String s6 = new String(cs);
//System.out.println(s1==s6);//false
String s7 = new String(s6);
//System.out.println(s6==s7);//false
(除s1和s2共用同一个对象,其他均重新创建了一个新的实例化对象)
(在字符内容一样的情况下,string第一次会new一个实例化对象,第2次,第3次…之后都会共用同一个实例化对象;
但是,new string的话,每次都会创建一个新的实例化对象)
记住两点:
①所有字符串字面量(比如"abc")都是String类型的实例
②从Java7开始,字符串长常量池开始属于推空间的一部分(以前放在方法区).
再叙述String,StringBulid,StringBuffer这部分内容
运行速度:
StringBuilder>StringBuffer>String
String:适用少量的字符串操作
StringBuilder:适用于单线程下载字符缓冲区进行大量操作的情况
StringBuffer:适用于多线程下在字符缓冲区进行大量操作的情况下(StringBuffer的方法大多有锁)
StringBulider有点像动态数组
待补充…