由于涉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会产生多个内存空间,同时回收以前不用的内存空间。