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 何永進 閱讀(317) 評論(0)  編輯  收藏 所屬分類: JSP
           
          主站蜘蛛池模板: 吴旗县| 呼伦贝尔市| 竹北市| 宿州市| 辽中县| 洪雅县| 伽师县| 威信县| 长海县| 沁水县| 新蔡县| 通山县| 淮滨县| 金阳县| 乌兰浩特市| 新乡县| 玉山县| 峡江县| 高邮市| 贺兰县| 中卫市| 大余县| 盐山县| 盐边县| 青冈县| 三河市| 莱阳市| 福贡县| 江阴市| 北流市| 木里| 正安县| 岢岚县| 连州市| 扶风县| 焉耆| 九龙城区| 黑河市| 东丰县| 图们市| 扬中市|