Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从具有对象属性的arrayList获取对象_Java_Arraylist - Fatal编程技术网

Java 从具有对象属性的arrayList获取对象

Java 从具有对象属性的arrayList获取对象,java,arraylist,Java,Arraylist,我有两门课 public class klass1 { String bir; String myID; klass1(String bir, String myID) { this.bir=bir; this.myID=myID; } } import java.util.*; 公共类dd{ 公共静态void main(字符串[]args){ ArrayList ar=新的ArrayList(); ar.add(新klass1(“wer”,“32”)); ar.add

我有两门课

public class klass1 {

String bir;
String myID;

klass1(String bir, String myID)
{
    this.bir=bir;
    this.myID=myID;
}

}

import java.util.*;
公共类dd{
公共静态void main(字符串[]args){
ArrayList ar=新的ArrayList();
ar.add(新klass1(“wer”,“32”));
ar.add(新klass1(“das”,“23”));
ar.add(新klass1(“vz”,“45”));
ar.add(新klass1(“yte”,“12”));
ar.add(新klass1(“rwwer”,“43”));
ar.remove(新klass1(“vz”,“45”);//它不工作!!!
System.out.println(ar.size());
}
}

我想要的是从数组列表中删除或获取具有对象的第二个属性的对象。我该怎么做?有简单的方法吗?

只需在类Klass1中实现
equals
方法

public class Klass1 {

    String bir;
    String myID;

    Klass1(String bir, String myID)
    {
        this.bir=bir;
        this.myID=myID;
    }

    public boolean equals(Object o){
        if(o instanceof Klass1)
            return ((Klass1)o).myID.equals(myID);
        else
            return false;
    }

}这是因为您试图删除一个不在arraylist中的新对象。当您使用
new klass1(“vz”,“45”)
时,您正在创建一个不在arraylist中的此类的新实例。

系统内部所做的是使用equals比较这些类。以下代码解释了这不起作用的原因:

Object o1 = new Object();
Object o2 = new Object();
System.out.println(o1 == o2); // false, obviously
System.out.println(o1.equals(o2)); // false
System.out.println(o1); // java.lang.Object@17046822
System.out.println(o2); // java.lang.Object@22509bfc
通过@后面的数字可以看出这些对象具有不同的散列值,这就是Object的equals函数所检查的

这与klass相关,因为除非覆盖equals,否则将使用Object的equals。如果您实现了equals,那么您也应该始终实现hashcode。因为两者都告诉您两个对象是否“相同”,如果其中一个对象说的不是另一个,那么代码的某些部分可能会混淆

如何为您的类正确实现equals:

@Override
public int hashCode() {
  int hash = 7;
  hash = 17 * hash + Objects.hashCode(this.bir);
  hash = 17 * hash + Objects.hashCode(this.myID);
  return hash;
}

@Override
public boolean equals(Object obj) {
  if (obj == null) {
    return false;
  }
  if (getClass() != obj.getClass()) {
    return false;
  }
  final klass1 other = (klass1) obj;
  if (!Objects.equals(this.bir, other.bir)) {
    return false;
  }
  if (!Objects.equals(this.myID, other.myID)) {
    return false;
  }
  return true;
}
这可以通过一个快捷方式在大多数IDE中实现(即在Netbeans中插入alt)。注意,我在Java7中使用对象实现了这一点。如果您使用的是Java 6,则需要手动键入
(a==b)| |(a!=null&&a.equals(b))与要比较的适当对象

创建一个合适的hashcode并不总是一件小事,对于更复杂的对象,您可能需要先了解一些hashcode。对于简单对象:将素数与某物相乘


equals方法通常很简单,首先检查null和类的相等性非常重要。程序员经常会忘记这一点,这也是NullPointerException和ClassCastException的常见来源。

使您的
klass1
同时实现
equals
hashCode
方法。对于这种情况,
equals
方法应该类似于如何检测两个不同的对象实例是否相等,也就是说,当比较在一起时,哪些字段意味着两个实例具有相同的值。它基于索引的删除是否足以满足您的情况?请在类名上使用大写字母!所以
Klass1
Dd
更为传统。@MGPJ不幸的是,没有。我的类中有一个字符串ID,我必须使用它。是的,我知道它为什么不起作用,但我必须用一种方法。你可以跳过hashcode,但不应该。但是,如果您在hashmap之类的对象中使用此对象,则这将导致问题,因为hashcode在其他相等的对象上不相等。
@Override
public int hashCode() {
  int hash = 7;
  hash = 17 * hash + Objects.hashCode(this.bir);
  hash = 17 * hash + Objects.hashCode(this.myID);
  return hash;
}

@Override
public boolean equals(Object obj) {
  if (obj == null) {
    return false;
  }
  if (getClass() != obj.getClass()) {
    return false;
  }
  final klass1 other = (klass1) obj;
  if (!Objects.equals(this.bir, other.bir)) {
    return false;
  }
  if (!Objects.equals(this.myID, other.myID)) {
    return false;
  }
  return true;
}