[英]Remove an item from List
我正在從學生的ArrayList中刪除一個Student對象,這是我的代碼,下面是Student.java
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package corejava.list;
/**
*
* @author Rahul
*/
public class Student {
private int id;
private String name;
public Student(int id,String name){
this.id = id;
this.name = name;
}
public Student(int id){
this.id = id;
}
@Override
public int hashCode(){
return this.getId() * 37;
}
@Override
public String toString(){
StringBuffer strb = new StringBuffer();
strb.append("\tID : ").append(this.getId()).append(", NAME : ").append(this.getName());
return strb.toString();
}
@Override
public boolean equals(Object studentOne){
Student student = (Student) studentOne;
boolean flag = false;
if(this.getId() == student.getId()){
flag = true;
}
return flag;
}
/**
* @return the id
*/
public int getId() {
return id;
}
/**
* @return the name
*/
public String getName() {
return name;
}
}
這是我的班級,有一個主要的方法,
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package corejava.list;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
*
* @author Rahul
*/
public class RemoveList {
public static void main(String [] args){
List<Student> studentList = null;
try{
studentList = new ArrayList<Student>(){{
add(new Student(12,"Tom"));
add(new Student(14, "Jack"));
add(new Student(15, "Julean"));
add(new Student(16, "Doughlas"));
add(new Student(17, "Bathsheba"));
}};
for(Iterator<Student> itr = studentList.iterator(); itr.hasNext();){
System.out.println(itr.next());
}
System.out.println(studentList.remove(new Student(12)));
for(Iterator<Student> itr = studentList.iterator(); itr.hasNext();){
System.out.println(itr.next());
}
}catch(Exception e){
e.printStackTrace();
}
}
}
現在我的問題是,像我在上面的代碼中所做的那樣,是否可以安全地從ArrayList中刪除項目,
hashCode()在從集合中刪除Student對象時是否起作用,
我們有更好的方法嗎?
hashCode()在從集合中刪除Student對象時是否起作用,
否equals()
方法起作用。
例如,僅查看ArrayList remove()
方法的源代碼。
>public boolean remove(Object o) {
440 if (o == null) {
441 for (int index = 0; index < size; index++)
442 if (elementData[index] == null) {
443 fastRemove(index);
444 return true;
445 }
446 } else {
447 for (int index = 0; index < size; index++)
448 if (o.equals(elementData[index])) { //here
449 fastRemove(index);
450 return true;
451 }
452 }
453 return false;
454 }
像我在上面的代碼中所做的那樣,從數組列表中刪除項目是否安全?
該安全性取決於您對Student
的平等定義,因為您要告訴我Id是否相等,所以Student等於因此是安全的(不談論線程)。
由於equals()
可能會嘗試強制轉換不是Student的對象,因此實現該方法並不安全。 您應該對待它:
@Override
public boolean equals(Object o){
//-- add it to your code --//
if(o == this)
return true;
if(!(o instanceof Student))
return false;
//-- at this point you're safe to cast --//
Student student = (Student) o;
boolean flag = false;
if(this.getId() == student.getId()){
flag = true;
}
return flag;
}
hashCode()
在這種情況下不起作用。
你的問題
是,就像我在上面的代碼中所做的那樣,是否可以安全地從ArrayList中刪除項目,
是的,它是安全的(我認為安全是線程安全的,或者可以通過提供對象作為參數來使用它是正確的),因為在調用remove
函數時,沒有其他線程在執行任何其他操作。
hashCode()在從集合中刪除Student對象時是否起作用,
不,當您調用Arraylist
remove函數時, hashCode()
不會發揮重要作用。 如果你看一下為刪除功能的源代碼 ,那么你看到比較刪除使用函數對象equals
這樣的功能equals
重寫起着比較的作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.