ArrayList array = new ArrayList();
Button b = new Button("a");
array.add(b);
b = new Button("b");
array.add(b);
b = new Button("c");
array.add(b);b = new Button("b");
System.out.println(array.contains(b));
为什么array中不包含b???

解决方案 »

  1.   

    新建了一个对象,没加新建的对象加到List中,当然是false了
    那什么a,b,c都是Button的属性
      

  2.   

    查看一下ArrayList的contains函数的源代码,看看它里面比较的是对象啊,还是对象的值,
    就知道了。
      

  3.   

    怎样才能找到array中的b呢???
      

  4.   

    public boolean contains(Object elem) {
    return indexOf(elem) >= 0;
        }   public int indexOf(Object elem) {
    if (elem == null) {
        for (int i = 0; i < size; i++)
    if (elementData[i]==null)
        return i;
    } else {
        for (int i = 0; i < size; i++)
    if (elem.equals(elementData[i]))
        return i;
    }
    return -1;
        }
    上面是ArrayList.java里的。
    ==========================================================
    Test.java
    import java.util.*;
    import java.awt.*;
    class Test
    {
    public static void main(String[] args) 
    {
    ArrayList array = new ArrayList();
    Button b = new Button("a");
    array.add(b);
    b = new Button("b");
    array.add(b);
    b = new Button("c");
    array.add(b);b = new Button("b");System.out.println(array.contains(b));
    System.out.println(array);
    System.out.println(b);
    }
    }打印出来的结果
    false
    [java.awt.Button[button0,0,0,0x0,invalid,label=a], java.awt.Button[button1,0,0,0
    x0,invalid,label=b], java.awt.Button[button2,0,0,0x0,invalid,label=c]]
    java.awt.Button[button3,0,0,0x0,invalid,label=b]我还是不明白为什么equals的结果不同。
    equals用来比较这两个对象是否相同。
    但是用在字符串的时候似乎还是有点不一样的地方。
      

  5.   

    因为后面的b是你重新创造一个对象,它和以前的那个b不是指向同一个对象,所以ArrayList里面没有它了
      

  6.   

    毫无关系的啊,如果这样
                     ArrayList array = new ArrayList();
    Button b = new Button("a");
    array.add(b);
    b = new Button("b");
    array.add(b);
    b = new Button("c");
    array.add(b);
    System.out.println(array.contains(b));
       返回true
      

  7.   

    那是因为你没有重写equals的方法,在object中equals性质跟==是一样的。
      

  8.   

    如果Button没重写equals()方法
    就调用了Object.equals()方法,而此方法是比较地址的.
      

  9.   

    那怎么判断array 中有Button("b")呢?
      

  10.   


    private boolean containBtn(Button btn,List array) {
      for (int i = 0,j=array .size();i<j;i++) {
        Button button = (Button)array.get(i);
        if (btn.getLabel() == null) {
          return false;
        } else if (button.getLabel().equals(btn.getLabel())) {
          return true;
        } else{
           false;
        }
      }
    }
      

  11.   

    Button b = new Button("a");这个语句中,new Button("a");新建了一个对象,就是新开辟的一快内存区来存储 ,而Button b 只是表示用b来指向这块内存地址。你的程序中用b先后指向了
    new Button("a");new Button("b");new Button("c");new Button("b");四个对象,而你只是将前三个对象加进了arraylist中,而b最后指向的哪个对象new Button("b");没有加进去,所以
    System.out.println(array.contains(b)); 为false
      

  12.   

    重载 Button 的 equals()
      

  13.   

    new 一个东西就像用一个遥控器指向了一个东西,new 了四个按钮,(就当是电视机吧),用同一个遥控器指,指了四次,最后指向的是同样名字叫“b"的那台电视,虽然与另一个电视同名,但当然不是同一台电视机,前三台电视都加到了array里面,而最后一台没有,当然返回FASLE了
    呵,不知道我的解释能不能让你明白
      

  14.   

    import java.awt.Button;
    public class Test {
            public static void main(String[] args){
                    System.out.println(new Button("a").equals(new Button("a")));
            }
    }
    输出false所以说明Button类没有重写equals()方法
    看了半天只有wallex(兰舟催发)说的对,还没给分~
      

  15.   

    写了怎么也是返回false
    VO类
    package com.sscm.test;/**
     * @author sunny
     *
     * To change this generated comment edit the template variable "typecomment":
     * Window>Preferences>Java>Templates.
     * To enable and disable the creation of type comments go to
     * Window>Preferences>Java>Code Generation.
     */
    public class VO {
    int id;
    String name; VO() { }
    VO(int id) {
            this.id=id;
    } VO(String name) {
           this.name=name;
    }
    /**
     * Returns the id.
     * @return int
     */
    public int getId() {
    return id;
    } /**
     * Returns the name.
     * @return String
     */
    public String getName() {
    return name;
    } /**
     * Sets the id.
     * @param id The id to set
     */
    public void setId(int id) {
    this.id = id;
    } /**
     * Sets the name.
     * @param name The name to set
     */
    public void setName(String name) {
    this.name = name;
    } public boolean equals(Object obj) {
    if (obj instanceof VO) {
    VO vo = (VO) obj;
    if (vo.name.equals(this.name)){
        System.err.println("equals");
    return true;
    }
    }
    return false;
    }


    }测试类
    package com.sscm.test;import java.util.ArrayList;/**
     * @author sunny
     *
     * To change this generated comment edit the template variable "typecomment":
     * Window>Preferences>Java>Templates.
     * To enable and disable the creation of type comments go to
     * Window>Preferences>Java>Code Generation.
     */
    public class Arr {
    public static void main(String[] args) {
    ArrayList array = new ArrayList();
    VO b = new VO("a");
    array.add(b);
    b= new VO("b");
    array.add(b);
    b = new VO("c");
    array.add(b);
    // System.out.println(array.contains(b));

    VO bb = new VO("b");
    System.out.println("equal   "+b.equals(bb)); }}