List<MyModel>.contains(MyModel) java 不工作
List<MyModel>.contains(MyModel) java is not working
我有我的 Class MyModel,其中包含:
private int value;
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
现在我已经填充了 MyModel class:
private final List<MyModel> listModel = new ArrayList<>();
private Mymodel myModel;
myModel= new MyModel ();
myModel.setValue(1);
myModel.setValue(2);
myModel.setValue(3);
listModel.add(myModel);
我想知道 listModel 是否包含 myModel
listModel.contains(myModel)
我进行了一些搜索,我知道 contains 使用了等号,但我找到了找到解决方案的正确方法。
提前致谢
如果您查看 ArrayList
class 中 contains
的实现,您会发现它在内部使用 equals
方法来查找对象:
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
public int indexOf(Object o) {
return indexOfRange(o, 0, size);
}
int indexOfRange(Object o, int start, int end) {
Object[] es = elementData;
if (o == null) {
...
} else {
for (int i = start; i < end; i++) {
if (o.equals(es[i])) { //calling overridden equals of the object instance, else it will revert to the Object's equals which simply compares the reference
return i;
}
}
}
return -1;
}
因此您需要为 MyModel
class 创建 equals
和 hashCode
。您可以借助正在使用的 IDE 为您生成它:
举个例子:
class MyModel{
private int value;
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof MyModel)) return false;
MyModel myModel = (MyModel) o;
return value == myModel.value;
}
@Override
public int hashCode() {
return Objects.hash(value);
}
}
检查包含的唯一方法是覆盖 equals()
方法。如果你查看 ArrayList
中的 contains 方法是如何实现的,你可以很容易地找到它。
contains()
方法将调用 indexOf()
方法,该方法将 return 列表中元素的索引。如果索引大于 0,那么它 contains()
方法将 return 为真。
让我们看看indexOf()
方法是如何实现的。
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
这意味着 indexOf()
方法只是遍历列表中的元素并调用 MyModel
class 中的 equals()
方法。
所以没有其他方法可以在不覆盖 Object class
的 equals()
方法的情况下检查包含
尝试运行下面的代码,我修改了它并添加了日志,现在你可以检查控制台上打印的输出:
我建议您使用 equals().
检查对象
class MyModel {
private int value;
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
@Override
public String toString() {
return "MyModel{" +
"value=" + value +
'}';
}
}
final List<MyModel> listModel = new ArrayList<>();
MyModel myModel;
myModel= new MyModel();
myModel.setValue(1);
myModel.setValue(2);
myModel.setValue(3);
listModel.add(myModel);
//here your myModel object has '3' value and list has [3], So this will return `true`
System.out.println("myModel=>"+myModel.toString()+"-->List = "+listModel.toString()+",, CONTAINS. =>"+listModel.contains(myModel));
myModel= new MyModel();
myModel.setValue(8);
listModel.add(myModel);
//here your myModel object has '8' value and list has [3,8], So this will return `true`
System.out.println("myModel=>"+myModel.toString()+"-->List = "+listModel.toString()+",, CONTAINS. =>"+listModel.contains(myModel));
myModel= new MyModel();
myModel.setValue(100);
//here your myModel object has '100' value and list has [3,8], So this will return `false`
System.out.println("myModel=>"+myModel.toString()+"-->List = "+listModel.toString()+",, CONTAINS. =>"+listModel.contains(myModel));
我有我的 Class MyModel,其中包含:
private int value;
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
现在我已经填充了 MyModel class:
private final List<MyModel> listModel = new ArrayList<>();
private Mymodel myModel;
myModel= new MyModel ();
myModel.setValue(1);
myModel.setValue(2);
myModel.setValue(3);
listModel.add(myModel);
我想知道 listModel 是否包含 myModel
listModel.contains(myModel)
我进行了一些搜索,我知道 contains 使用了等号,但我找到了找到解决方案的正确方法。 提前致谢
如果您查看 ArrayList
class 中 contains
的实现,您会发现它在内部使用 equals
方法来查找对象:
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
public int indexOf(Object o) {
return indexOfRange(o, 0, size);
}
int indexOfRange(Object o, int start, int end) {
Object[] es = elementData;
if (o == null) {
...
} else {
for (int i = start; i < end; i++) {
if (o.equals(es[i])) { //calling overridden equals of the object instance, else it will revert to the Object's equals which simply compares the reference
return i;
}
}
}
return -1;
}
因此您需要为 MyModel
class 创建 equals
和 hashCode
。您可以借助正在使用的 IDE 为您生成它:
举个例子:
class MyModel{
private int value;
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof MyModel)) return false;
MyModel myModel = (MyModel) o;
return value == myModel.value;
}
@Override
public int hashCode() {
return Objects.hash(value);
}
}
检查包含的唯一方法是覆盖 equals()
方法。如果你查看 ArrayList
中的 contains 方法是如何实现的,你可以很容易地找到它。
contains()
方法将调用 indexOf()
方法,该方法将 return 列表中元素的索引。如果索引大于 0,那么它 contains()
方法将 return 为真。
让我们看看indexOf()
方法是如何实现的。
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
这意味着 indexOf()
方法只是遍历列表中的元素并调用 MyModel
class 中的 equals()
方法。
所以没有其他方法可以在不覆盖 Object class
的equals()
方法的情况下检查包含
尝试运行下面的代码,我修改了它并添加了日志,现在你可以检查控制台上打印的输出: 我建议您使用 equals().
检查对象class MyModel {
private int value;
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
@Override
public String toString() {
return "MyModel{" +
"value=" + value +
'}';
}
}
final List<MyModel> listModel = new ArrayList<>();
MyModel myModel;
myModel= new MyModel();
myModel.setValue(1);
myModel.setValue(2);
myModel.setValue(3);
listModel.add(myModel);
//here your myModel object has '3' value and list has [3], So this will return `true`
System.out.println("myModel=>"+myModel.toString()+"-->List = "+listModel.toString()+",, CONTAINS. =>"+listModel.contains(myModel));
myModel= new MyModel();
myModel.setValue(8);
listModel.add(myModel);
//here your myModel object has '8' value and list has [3,8], So this will return `true`
System.out.println("myModel=>"+myModel.toString()+"-->List = "+listModel.toString()+",, CONTAINS. =>"+listModel.contains(myModel));
myModel= new MyModel();
myModel.setValue(100);
//here your myModel object has '100' value and list has [3,8], So this will return `false`
System.out.println("myModel=>"+myModel.toString()+"-->List = "+listModel.toString()+",, CONTAINS. =>"+listModel.contains(myModel));