簡體   English   中英

從列表中刪除一個項目

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM