由于涉java尚淺,今天在寫個小程序的時候遇到了個問題,無解,反復查看和調試后,了然,寫下以免忘卻。
問題展示:
代碼1:(Eshop類中定義下面一個方法,估計高手一看就知道我錯哪了)
public static ArrayList getItems(String id)
{
ArrayList tempList = new ArrayList();
if(id=="1"){
tempList.add(new Product("11","Windows","$100"));
tempList.add(new Product("12","Linux","$80"));
tempList.add(new Product("13","XP2","$59"));
}
else if(id=="2"){
tempList.add(new Product("21","Tomcat","$200"));
tempList.add(new Product("22","Eclipse","$95"));
tempList.add(new Product("23","Mysql","$48"));
}
else if(id=="3"){
tempList.add(new Product("31","Jsp","$35"));
tempList.add(new Product("32","J2EE","$15"));
tempList.add(new Product("33","HTML","$45"));
}
return tempList;
}
代碼2:(某JSP頁面中表格)
<table>
<%
String id = request.getParameter("catid");
if(id==null)
id="1";
ArrayList pro = Eshop.getItems(id);
Product p = null;
for(int j=0;j<pro.size();j++)
{
p = (Product) pro.get(j);
%>
<tr>
<td><%=p.getName() %></td><td><%=p.getPrice() %></td>
</tr>
<%
}
%>
</table>
問題:當地址欄地址為http://localhost:8080/Eshop2/index.jsp?catid=2時沒有達到我預期下段代碼的輸出:
else if(id=="2"){
tempList.add(new Product("21","Tomcat","$200"));
tempList.add(new Product("22","Eclipse","$95"));
tempList.add(new Product("23","Mysql","$48"));
}
錯誤原因:混淆equals和==的區別。
解決辦法:
id=="1" id.equals("1")
id=="2" id.equals("1")
id=="3" id.equals("1")
下面說說:equals 和 == 的區別
JDK1.6定義 String.equals 如下:
public boolean equals(Object anObject)
將此字符串與指定的對象比較。當且僅當該參數不為 null,并且是與此對象表示相同字符序列的 String 對象時,結果才為 true。
定義說明只有兩個對象的“值”相等的時候返回true,即equals是對象值的比較,然而“==”是引用的比較,也就是說只要不是引用的同一個對象那么就為false.
一個典型的例子:
<%!
String str1 = new String("abc");
String str2 = new String("abc");
String str3 = str1;
String str4 = "abc";
String str5 = "abc";
%>

下面是網上找到的相關介紹:
==:
1、 比較的是操作符兩端的操作數是否是同一個對象
2、 兩邊的操作數必須是同一類型的(可以是父子類之間)才能編譯通過。
3、 比較的是地址,如果是具體的阿拉伯數字的比較,值相等則為true
equals:
比較的是兩個對象是否為同一個對象。
String s="abce"是一種非常特殊的形式,和new有本質的區別,它是java中唯一不需要new 就可以產生對象的途徑. 以 String s="abce"形式賦值在java中叫直接量,它是在常量池中而不是象new 一樣放在壓縮堆中. 這種形式的字符串,在JVM內部發生字符串拘留,即當聲明這樣的一個字符串后,JVM會在常量池中先查找有有沒有一個值為"abcd"的對象,如果有,就會把它賦給當前引用.即原來那個引用和現在這個引用指向了同一對象,如果沒有,則在常量池中新創建一個"abcd",下一次如果有String s1 = "abcd";又會將s1指向"abcd"這個對象,即以這形式聲明的字符串,只要值相等,任何多個引用都指向同一對象. 而String s = new String("abcd");和其它任何對象一樣.每調用一次就產生一個新對象.
總結:
定義java變量的時候,實際上只是產生了一個指向該類型的引用(它也占用內存空間),對這個“引用”進行賦值,就是將其指向某個內存空間;多次對“引用”進行賦值,jvm會產生多個內存空間,同時回收以前不用的內存空間。