67,512
社区成员
发帖
与我相关
我的任务
分享
protected void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String action = request.getParameter("action");
if (action.equals( "aa"))
System.out.println("aaaaaaaa"); }
这是描述Java编译器对字符串常量的优化方法。
众所周知,数据内容是要定义在数据段的,假设下面的代码:
String s1 = "abc" ;
String s2 = "abc" ;
假如不进行优化的话,结果就是内存中有两个重复的"abc"内容,也就是说有两个“对象”。
Java编译器会针对这种情况进行优化,对于常量字符串"abc",java编译器会只产生一个"abc"对象。这样,s1和s2是指向同一个内存区域的。
但假如字符串的值无法在编译时确定,如:String g = a.concat("3");
那么Java编译器将会为g变量分配一个空间。注意也不是立即分配,因为Java编译器是在全局对动态分配内存。
补充: 编译器不会检查 "test" + "3" 的结果是否就是"test3",因此创建新对象。
// 至于S5么..LZ你猜? > <
真逗
package heap;
public class Test {
public static void main(String[] args) {
String s1 = "你好LZ";
String s2 = "你好LZ";
String s3 = "你好";
String s4 = "LZ";
String s5 = s3 + s4;
// 两个String使用常量池相同的地址 因为'你好LZ'这几个字已经存在了
// JAVA为了节约内存,相同内容的String(名字不同)其实可能会指向同一块内存(同一个引用)
// 所以s2实际上是使用s1已经创建过的字符串
// 但是s3 和 s4分别是两个不同的字符串 创建他们的同时也就是创建了两个内存 所以==会失败
// 至于S5么..LZ你猜? > <
System.out.println(s1 == s2);
System.out.println(s1 == (s3 + s4));
System.out.println(s1 == s5);
System.out.println("-------------------------------------------------");
// 至于值比较嘛。。。当然都一样了。。
System.out.println(s1.trim().equals(s2));
System.out.println(s2.trim().equals(s3 + s4));
System.out.println(s2.trim().equals(s5));
}
}
public class EqualsTest {
private static final String str1 = "AA";
public static void main(String[] args) {
System.out.println(str1.equals(getAA()));
System.out.println(str1 == getAA());
}
public static String getAA() {
return "AA";
}
}