站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题关于ArrayList的问题,在线等

关于ArrayList的问题,在线等

摘要: 关于ArrayList的问题,在线等


ArrayList array = new ArrayList();
Button b = new Button(-#34;a-#34;);
array.add(b);
b = new Button(-#34;b-#34;);
array.add(b);
b = new Button(-#34;c-#34;);
array.add(b);

b = new Button(-#34;b-#34;);
System.out.println(array.contains(b));
为什么array中不包含b???


为什么包含b?


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


因为equals返回false


此“b”非彼“b”


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


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


public boolean contains(Object elem) {
return indexOf(elem) -#62;= 0;
}

public int indexOf(Object elem) {
if (elem == null) {
for (int i = 0; i -#60; size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i -#60; 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(-#34;a-#34;);
array.add(b);
b = new Button(-#34;b-#34;);
array.add(b);
b = new Button(-#34;c-#34;);
array.add(b);

b = new Button(-#34;b-#34;);

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用来比较这两个对象是否相同。
但是用在字符串的时候似乎还是有点不一样的地方。


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


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


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


晕啦……


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


那怎么判断array 中有Button(-#34;b-#34;)呢?



private boolean containBtn(Button btn,List array) {
for (int i = 0,j=array .size();i-#60;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;
}
}
}


Mark~


用hashcode倒可能会返回true


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


重载 Button 的 equals()


强,顶了!


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


import java.awt.Button;
public class Test {
public static void main(String[] args){
System.out.println(new Button(-#34;a-#34;).equals(new Button(-#34;a-#34;)));
}
}
输出false

所以说明Button类没有重写equals()方法
看了半天只有wallex(兰舟催发)说的对,还没给分~



写了怎么也是返回false
VO类
package com.sscm.test;

/**
* @author sunny
*
* To change this generated comment edit the template variable -#34;typecomment-#34;:
* Window-#62;Preferences-#62;Java-#62;Templates.
* To enable and disable the creation of type comments go to
* Window-#62;Preferences-#62;Java-#62;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(-#34;equals-#34;);
return true;
}
}
return false;
}


}

测试类
package com.sscm.test;

import java.util.ArrayList;

/**
* @author sunny
*
* To change this generated comment edit the template variable -#34;typecomment-#34;:
* Window-#62;Preferences-#62;Java-#62;Templates.
* To enable and disable the creation of type comments go to
* Window-#62;Preferences-#62;Java-#62;Code Generation.
*/
public class Arr {
public static void main(String[] args) {
ArrayList array = new ArrayList();
VO b = new VO(-#34;a-#34;);
array.add(b);
b= new VO(-#34;b-#34;);
array.add(b);
b = new VO(-#34;c-#34;);
array.add(b);
//System.out.println(array.contains(b));

VO bb = new VO(-#34;b-#34;);
System.out.println(-#34;equal -#34;+b.equals(bb));

}

}





哦,我知道原因了


↑返回目录
前一篇: JFrame确认关闭窗口的问题
后一篇: java 中 pack() 这个方法是什么意思的问题