性能调优基础篇之 String
来源:互联网 发布:网络推广证书 编辑:程序博客网 时间:2024/06/10 07:14
String 为 不可变对象 , StringBuffer为可变对象
String str = new String("x"); str.replace("x","y"); System.out.println(str);的输出永远是x 只有 str = str.replace("x","y");才会输出y
首先贴段无聊的代码:这种类型笔试题应该在C/C++中考查指针方面大量出现
String str = new String("aaa"); String str2 = new String("aaa"); System.out.println(str == str2); String str3 = "bbb"; String str4 = "bbb"; System.out.println(str3 == str4); String str5 = new String("ccc"); String str6 = "ccc"; System.out.println(str5 == str6); String s = "hello"; String s1 = "hel"; String s2 = "lo"; System.out.println(s == s1 + s2); System.out.println(s == "hel"+ "lo");
结果:
false
true
false
false
true
前面4个答案没有什么好说的,我主要说说最后一个输出, 因为最后一个牵扯到一个很容易弄混关于字符串相加的编程原则。
两个字符串相加会产生第三个字符串对象{String是不可变对象}。
str1+str2+...strn 会产生n-1个临时对象,那么避免大量无效对象的创建,所以提倡用stringbuffer.append()避免产生无效临时变量。
但是,第五个答案输出让人有点出任意料,string的 "=="操作符比较的为字符串地址,
s == "hel"+ "lo" 为 true 说明 两个常量字符串相加并未有产生一个新的String对象, 而是返回的是“hello”在常量池中的引用。{只有字符串对象相加是才会产生一个新的对象, 所以对于常量字符串相加时用Stringbuffer并无多大意义}那么这样就容易理解啦。显而易见 <pre name="code" class="java">System.out.println(s == s1 + "lo"); 就会输出false啦。 stringbuffer为什么可变?<pre name="code" class="java"> public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence { } abstract class AbstractStringBuilder implements Appendable, CharSequence { /** * The value is used for character storage. */ char[] value; }
答案很明显,stringbuffer的成员并非string, 而是char[]这样就容易理解啦
0 0
- 性能调优基础篇之 String
- 性能调优基础篇之HashMap
- 性能调优基础篇之内存中大量重复String对象
- String性能调优
- 性能调优基础篇之大量字符串性相加
- Java基础篇之----String
- Java 性能优化之 String 篇
- Java 性能优化之 String 篇
- Java 性能优化之 String 篇
- Java 性能优化之 String 篇
- Java 性能优化之 String 篇
- Java 性能优化之 String 篇
- Java 性能优化之 String 篇
- Java 性能优化之 String 篇
- Java 性能优化之 String 篇
- Java 性能优化之 String 篇
- Java 性能优化之 String 篇
- Java 性能优化之 String 篇
- Android AsyncHttpclient 使用详解
- 提高页面加载速度简单易行的四个办法。
- Cocos2d-X学习——Android移植,使用第三方库.so被删掉问题
- 全局变量,静态全局变量, 局部变量,静态局部变量的区别
- 数据库视频总结
- 性能调优基础篇之 String
- 防火墙和我国大家哈感觉说的
- android service 之一 (start service)
- ARC在IBOutlet属性中的使用
- 的话去接我的机会就爱上的国际化
- 自动添加环境变量代码
- COCOS2D-X 像素级碰撞检测
- getRealPath()和getContextPath()的区别
- 回去后我的干活就噶是假的