1.string对象的两种创建方式之间的区别:
string str1="hello"; string str2="hello"; //str1与str2指向常量池中的同一个对象;(复用) string str1=new string("hello"); string str2=new string("hello"); //str1与str2指向堆中的不同对象;
2.加法运算
//在常量池中
string ok="apple1"; //要么在堆中,要么在栈中,不会进入常量池; int temp=1; String ok1="apple"+temp; //运行结果为false System.out.println(ok==ok1); /*temp的值在编译时无法确定,导致ok1的值在编译时也无运行法确定;那么ok1就无法引用常量池中的内容了,在运行时就需要重新分配空间*/
5.StringBuilder,StringBuffer,String对象的区别
String s1=new String("hello"); s1+="mary"; /* String底层是StringBuffer;每次利用stirng的+操作都要new一个新的Stringbuffer对象来进行append操作,用完之后释放; 但是如果直接利用StringBuffer来操作就可以避免反复创建、撤销StringBuffer,而是自始至终利用同一个StringBuffer; 所有遇到多次要进行加法操作的场景,要用stringbuffer或stringbuilder,而避免用string */
测试两者运行效率的差异,测试代码如下:
public static void main(String[] args) {
long start = System.currentTimeMillis();
StringBuilder s = new StringBuilder("a");
for(int i = 0;i < 100000;i++){
s.append("a");
}
long end = System.currentTimeMillis();
System.out.println(end-start);//string : 7295 stringbuilder : 13
}
原文:https://www.cnblogs.com/chxyshaodiao/p/12294382.html