CoffeeTree
IT 男人's Blog helloheyongjin@sina.com
你大娘已经不是你从前的大娘,你大爷依旧是你大爷
由于涉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会产生多个内存空间,同时回收以前不用的内存空间。

posted on 2008-12-23 02:32 何永进 阅读(312) 评论(0)  编辑  收藏 所属分类: JSP

只有注册用户登录后才能发表评论。


网站导航: