Java Listなどの集合系のremoveAllの使い方


転載:http://blog.csdn.net/will_awoke/articale/detail/6528872
このタイトルを見て、集合的なレモベオールの方法さえうまく使えないのに、プログラマになるのかと首をかしげる人が多いと思います.
 
はい、私は私が確かにこの方法を使っていないことを認めて、私を蔑視しましょう.O(∩∩)Oは
 
まず問題を貼る-->
 
エンティティクラス(User):
[java]  view plin copy
public クラス User {              prvate String name       prvate 要点 age;              //setter and getter       public String get Name() {           return name       }       public void set Name(String) name {           this.name = name       }       public 要点 getAge() {           return age;       }       public void setAge(int メッセージ {           this.age = age;       }          )    
テストセット類(UserList):
[java]  view plin copy
import java.util.ArayList;   import java.util.List;      public クラス UserList {              prvate List<User> subList;       prvate List<User> all List;              public UserList(){           subList=new ArayList<User>()           allList=new ArayList<User>()                      for(int i=0;i<3;i+){               User user=new User();               user.setAge(i)               user.setName(「lyh」+i);               subList.add(user)           }                      for(int i=0;i<10;i+){               User user=new User();               user.setAge(i)               user.setName(「lyh」+i);               allList.add(user)           }       }              public static void main(String[] アークス           UserList userList=new UserList()           userList.allList.removeAll(userList.subList)//RemoveAllメソッドを呼び出す                      System.out.println(userList.allList.size();                  }   )    
皆さんは最後のプリントの結果はいくらですか? 7?That's wrong 結果は10です
 
どうしてですか?removeAll方法に問題がありますか?
 
これは最近removeAllを使っていた時に出会った疑問です.(もちろん、実際の問題を簡単に抽象化しました.)当時はそれが理解できなくて、甚だしきに至っては幼稚にJavaのBUGだと思っていました.自分の頭がBUGです.
 
 
原因解析:
 
まずAPIを見ます
[x]  view plin copy
bollan removeAll(Collection)<?> c)      指定をリストから削除 コレクション に含まれるすべての要素(オプション操作).    そうです.つまり、サブセットに含まれている要素を取り除くということです.なぜ7ではなく、10ですか?
APIの説明を見て、含まれるすべての要素を削除します.この単語に注意してください.
 
removeAll方法を実行する時に、まず集合元素を比較しますので、もし元素が等しいなら除去操作を行います.これについて言えば、多くの人はもう分かりました.同じではないので、除去を実行しませんでした.
 
ソースを確認して、上記の推測をさらに確認し、removeとremoveAllの方法で実現しました.
java.util.AbstractCollection<E>
具体的なコードは:
[java]  view plin copy
public bollan removeAll(Collection)<?> c) {          bollan modified = false;          Iterator it = iterator();          while (it.has Next() {              if (c.co ntains(it.next()))) {                  it.remove()                  modified = true;              }          }          return modified      }   [java]  view plin copy
public bollan remove(Object) o) {           Iterator it = iterator();           if (o==null) {               while (it.has Next() {                   if (t.next()==null) {                       it.remove()                       return true;                   }               }           } else {               while (it.has Next() {                   if (o.equals(it.next()) {                       it.remove()                       return true;                   }               }           }           return false;       }   removeAllメソッドを呼び出した時に、実際には、remove方法を循環的に呼び出していますが、remove方法には重要なコードがあります.
if(o.equals(it.next)!
Soは、上述の例においてエンティティ類にOverride hashCodeとequals方法がないため、removeAll方法を実行する時はequals方法により、集合要素が等しいかどうかを判断します.Override equals方法がないと、デフォルトはまだ比較対象ですので、上記の問題が発生します.
 
結局、やはり基礎がしっかりしていないので、同時に自分にも目を覚まして、実体の種類を書く時にはできるだけOverride hashCodeとequalsの方法を書くと、いつか問題が起こるかもしれません.
 
問題の概要は終わりました.もちろん、この問題は本質的に簡単です.同じ疑問を持っている友達に会ったら少しだけ助けてほしいです.
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
プロジェクトをしています.二つのLiSTランキングを並べ替える時、レモヴェルが現れます. falseに戻ります.削除に失敗したのは、オブジェクトを書き換えるためのhascodeとequalメソッドがないからです.
@Override
	public int hashCode() {
		// TODO Auto-generated method stub
		//return super.hashCode();
		return id;
	}
	
	@Override
	public boolean equals(Object o) {
		// TODO Auto-generated method stub
		//return super.equals(o);
		ChannelItem item = (ChannelItem) o;
		if(this.id.equals(item.id)){
			return true;
		}else{
			return false;
		}
	}