1.编译期和运行期的区别
?
class="java" name="code">/** * 编译时,和运行时的不同 * 直接量是在编译就分配内存,而引用变量和方法调用创建的运行时才分配内存 * @author Administrator * */ public class StringJoinTest { public static void main(String[] args) { String str1 = "hello的长度为:5"; String str2 = "hello的长度为:" + "hello".length(); int len = 5; String str3 = "hello的长度为:" + len; System.out.println("str1 == str2 : " + (str1 == str2)); System.out.println("str1 == str3 : " + (str1 == str3)); System.out.println("str3 == str3 : " + (str3 == str2)); } }
?输出结果:str1 == str2 : false
????????????????? str1 == str3 : false
????????????????? str3 == str3 : false
?
解释:== 判断的是对象在内存中位置是否相同,而equals判断的是存储内容是否相同。
2.String和StringBuilder的区别
??? 1)String代码
?
public class ImmutableString { public static void main(String[] args) { String str = "hello"; System.out.println(System.identityHashCode(str)); str = str + "java"; System.out.println(System.identityHashCode(str)); str = str + ", 111"; System.out.println(System.identityHashCode(str)); } }
??? 结果:18306082
?????????????? 9740137
?????????????? 23965177
?? 解释:结果可看出str引用变量指向的内存是不同的,所以说String是不可变类,当使用String来拼接字符串时会造成内存溢出等问题。
??? 2)StringBuilder
?
?
public class MutableString { public static void main(String[] args) { StringBuilder str = new StringBuilder("hello "); System.out.println(str + " : " + System.identityHashCode(str)); str.append("java "); System.out.println(str + " : " + System.identityHashCode(str)); str.append(",111"); System.out.println(str + " : " + System.identityHashCode(str)); } }
??? 结果:hello? : 18306082
????????????? hello java? : 18306082
????????????? hello java ,111 : 18306082
??? 解释:StringBuilder操作字符串时引用变量指向的内存是相同的。此外StringBuilder是非线程安全的,而StringBuffer是线程安全的,所以StringBuilder的效率会比StringBuffer的高
?