2013-12-03 7 views
0

я удаление объекта Студента из ArrayList студентов, это мой код, ниже является 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, как я сделал в приведенном выше коде,

делает хэш-код() играет роль в удалении объекта студенческого из коллекции,

У нас есть лучший подход,

+3

Почему у вас есть блок 'try-catch'? –

ответ

2

Это небезопасно, как вы реализовали из-за своего equals() можете попробовать бросить объект, который не является студентом. Вы должны относиться к нему:

@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() не играет роли в этом случае.

+2

'if (o == null)' case не требуется. Будет обрабатываться 'instanceof'. Кроме того, последние 5 строк могут быть заменены на: 'return this.getId() == student.getId();' –

+0

@RohitJain Спасибо за предложение. – Math

+0

Btw, 'o == this', хотя это не обязательно, это способ попытаться сделать вещи быстрее. Это небольшой метод, но он может быть больше и может использоваться несколько раз. – Math

1

Ваш вопрос

есть, это безопасно удаление элемента из ArrayList, как я сделал в приведенном выше коде,

Да, это безопасно (я считаю безопасным как потокобезопасное или правильно использовать, поставляя объект в качестве параметра), потому что, когда функция remove в вызове ни одна другая нить выполняет какую-либо другую операцию.

делает хэш-код() играет роль в удалении объекта Студенческого из коллекции,

Нет, hashCode() не играет жизненно важную роль при вызове функции Arraylist удалить. Если вы посмотрите на source code for remove function, вы увидите, что удалить объект сравнения с помощью функции equals, поэтому переопределенная функция equals играет роль в сравнении.

+0

Не могли бы вы рассказать о роли хэш-кода в удалении? – Yaneeve

5

делает хэш-код() играет роль в удалении объекта Студенческого из коллекции,

No. equals() метод принимает роль.

Например, просто посмотрите на source code of ArrayListremove() метод

>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, Так как вы говорите, если идентификаторы равны, то студент составляет, следовательно, это безопасно (не говорит о потоках).

Смежные вопросы