Java SetまたはHashSetで重複値が削除されないので調べた結果


タイトル通りこのようなソースを書くと Setで重複値が削除されなかった(;´Д`)

public class TestBean {  

  /** NO */
  private Long no;
  /** 名前 */
  private String name;

 // ゲッターセッター省略

}


private void testHogeHoge() {

  Set<TestBean> set = new HashSet<>();

  TestBean bean = new TestBean();

  bean.setNo(1L);
  bean.setName("ほげ");
  
  set.add(bean);

  bean = new TestBean();

  bean.setNo(1L);
  bean.setName("ほげ");
  
  set.add(bean);

  bean = new TestBean();

  bean.setNo(2L);
  bean.setName("ふが");
  
  set.add(bean);

  System.out.println(set.size());
}



これだと2と出して欲しいのに3が出てきやがった(;´Д`)




色々試したらTestBeanにhashCode()とequals()メソッドを作成したら重複値がちゃんと削除されます(´・ω・`)



hashCode()とequals()はeclipseで簡単に作成できます。

右クリックメニュー → ソース → hashCode()およびequals()の生成

これで作成すると

public class TestBean {  

  /** NO */
  private Long no;
  /** 名前 */
  private String name;

 // ゲッターセッター省略

/* (非 Javadoc)
  * @see java.lang.Object#hashCode()
  */
 @Override
 public int hashCode() {
  final int prime = 31;
  int result = 1;
  result = prime * result + ((id == null) ? 0 : id.hashCode());
  result = prime * result + ((name == null) ? 0 : name.hashCode());
  return result;
 }

 /* (非 Javadoc)
  * @see java.lang.Object#equals(java.lang.Object)
  */
 @Override
 public boolean equals(Object obj) {
  if (this == obj)
   return true;
  if (obj == null)
   return false;
  if (getClass() != obj.getClass())
   return false;
  TestBean other = (TestBean) obj;
  if (id == null) {
   if (other.id != null)
    return false;
  } else if (!id.equals(other.id))
   return false;
  if (name == null) {
   if (other.name != null)
    return false;
  } else if (!name.equals(other.name))
   return false;
  return true;
 }
}


private void testHogeHoge() {

  Set<TestBean> set = new HashSet<>();

  TestBean bean = new TestBean();

  bean.setNo(1L);
  bean.setName("ほげ");
  
  set.add(bean);

  bean = new TestBean();

  bean.setNo(1L);
  bean.setName("ほげ");
  
  set.add(bean);

  bean = new TestBean();

  bean.setNo(2L);
  bean.setName("ふが");
  
  set.add(bean);

  System.out.println(set.size());
}


これで2がでてきます(´・ω・`)



できましたかなブラック企業の皆様(´・ω・`)



2 件のコメント:

  1. Eclipseの自動生成でも全く問題はないのですが、
    Java7からだとObjects.hash()というメソッドが追加されています。
    http://docs.oracle.com/javase/jp/7/api/java/util/Objects.html#hash(java.lang.Object...)

    返信削除
    返信
    1. 参考になります!
      それについても記事を書いてみますね。

      削除