import java.io.Serializable;//文件级别
public class FileLevel implements Serializable { /**
 * 
 */
private static final long serialVersionUID = 1L;

        //文件名称
private String filename;
        //文件级别
private String level;

public FileLevel(){};

public FileLevel(String filename,String level){
this.filename=filename;
this.level=level;
}
public String toString(){
return "文件:"+filename+"<-级别->"+level;
} public String getFilename() {
return filename;
} public void setFilename(String filename) {
this.filename = filename;
} public String getLevel() {
return level;
} public void setLevel(String level) {
this.level = level;
}
@Override
public boolean equals(Object obj) {
if(obj==null)return false;
if(obj instanceof FileLevel){
FileLevel fl = (FileLevel)obj; 
if(fl.filename == this.filename&&fl.level == this.level){
return true;
}
}
return false;
}

}
测试代码如下:import java.util.ArrayList;
import java.util.List;public class testFileLevel {
public static void main(String[] args) {

List l = new ArrayList();

for (int i = 0; i <9; i++) {
FileLevel f = new FileLevel("C:\\TEST\\WM.TXT","t"+i);
l.add(f);
}
FileLevel f2 = new FileLevel("C:\\TEST\\WM.TXT","t5");
int k = l.indexOf(f2);
System.out.println(k);//返回-1
System.out.println(l.contains(f2));//放回FALSE
}
}
结果:
System.out.println(k);//返回-1
System.out.println(l.contains(f2));//放回FALSE
为什么会是-1?
如果我想得到结果为1,TRUE,改怎么修改代码?

解决方案 »

  1.   

    不是这个问题吧,ArrayList不使用hashCode
      

  2.   

    谢谢
    ArrayList中可以怎么解决这个问题?
      

  3.   


     public boolean equals(Object obj) {
            if (obj == null) {
                return false;
            }
            if (obj instanceof FileLevel) {
                FileLevel fl = (FileLevel) obj;
                if (fl.filename.equals(this.filename) && fl.level.equals(this.level)) {
                    return true;
                }
            }
            return false;
        }
      

  4.   

    字符串内容比较用equals,不是==
      

  5.   

    引用 1 楼 hadelu 的回复:
    你要实现hashcode的。不是这个问题吧,ArrayList不使用hashCode 
    楼上正解,我没看仔细。:-)
      

  6.   

    修改了一下测试类:import java.util.ArrayList;
    import java.util.List;public class testFileLevel {
    public static void main(String[] args) {

    List l = new ArrayList();

    for (int i = 0; i <9; i++) {
    FileLevel f = new FileLevel("C:\\TEST\\WM.TXT","t"+i);
    System.out.println(i+"--->"+f.hashCode());
    l.add(f);
    }
    System.out.println("-----------------------------------");
    FileLevel f2 = new FileLevel("C:\\TEST\\WM.TXT","t5");
    System.out.println("5"+"--->"+f2.hashCode());
    int k = l.indexOf(f2);
    System.out.println(k);
    System.out.println(l.contains(f2));
    }
    }
    测试结果:
    0--->3657
    1--->3658
    2--->3659
    3--->3660
    4--->3661
    5--->3662
    6--->3663
    7--->3664
    8--->3665
    -----------------------------------
    5--->3662
    -1
    false
    hashcode的值一样
      

  7.   

    ZangXT 已经回答了你的问题,是equals的问题arraylist不需要hashcode(他是挨个调用equal)
    不过一般情况下hashcode和equals都是要成对实现的(好习惯)。