タイトル通りこのようなソースを書くと 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がでてきます(´・ω・`)
できましたかなブラック企業の皆様(´・ω・`)
Eclipseの自動生成でも全く問題はないのですが、
返信削除Java7からだとObjects.hash()というメソッドが追加されています。
http://docs.oracle.com/javase/jp/7/api/java/util/Objects.html#hash(java.lang.Object...)
参考になります!
削除それについても記事を書いてみますね。