`
satan_conjuror
  • 浏览: 19074 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

hashSet集合去重的一个误区

    博客分类:
  • java
阅读更多

最近工作上遇到的一个需要去除重复对象值得一个问题!hashSet在存储数据的时候,他的去重原理是对象的hashcode不一致才能存进去,如果相同时不能存的,但是如果当你利用生成对象然后设置数据值得时候放进去不希望相同值的对象也能放进去的时候就会出现问题,下面贴一个简单的例子介绍下就知道了!

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

public class HashSetMisunderstanding {
	public static void main(String[] args) {
		new HashSetMisunderstanding().judgeList();
	}
	public void judgeList(){
		Set<A> list = new HashSet<A>();//这里创建一个hashset集合
		for(int i=1;i<4;i++){
			A a = new A(1,1);//循环中创建新的对象A来存储相同的数据
			list.add(a);
		}
		for(int i=2;i<6;i++){
			A a= new A(1,1);
			if(list.add(a)){//判断是否能存储进去
				System.out.println("添加成功->"+i);
			}
		}
		for(A a:list){
			System.out.println(a.toString());//打印出相应的值 看看是否唯一
		}
	}
	
	class A implements Serializable{
		private static final long serialVersionUID = 1L;
		private Integer mi;
		private Integer bi;
		
		public A() {
			super();
		}
		public A(Integer mi, Integer bi) {
			super();
			this.mi = mi;
			this.bi = bi;
		}
		public Integer getMi() {
			return mi;
		}
		public Integer getBi() {
			return bi;
		}
		public void setMi(Integer mi) {
			this.mi = mi;
		}
		public void setBi(Integer bi) {
			this.bi = bi;
		}
		@Override
		public String toString() {
			
			return (mi==null?mi:mi.toString())+"--"+(bi==null?bi:bi.toString());
		}
	}
}

 最后打印出来的结果就是:

添加成功->2
添加成功->3
添加成功->4
添加成功->5
1--1
1--1
1--1
1--1
1--1
1--1
1--1
从上面结果可以看出来,相同值得对象是会被添加到hashset里面的,但是如果将创建A对象的位置变一下得到的结果就不一样了:

public void judgeList(){
		Set<A> list = new HashSet<A>();//这里创建一个hashset集合
		A a = new A(1,1);//循环中创建新的对象A来存储相同的数据
		for(int i=1;i<4;i++){
			list.add(a);
		}
		for(int i=2;i<6;i++){
			if(list.add(a)){//判断是否能存储进去
				System.out.println("添加成功->"+i);
			}
		}
		for(A aa:list){
			System.out.println(aa.toString());//打印出相应的值 看看是否唯一
		}
	}

 如上的时候就只会有一个值出来!因为创建的A对象只有一个hashcode值,这个时候就是不能重复添加的!

以上只是经验之谈,希望对有你有帮助,如果有更好的解释,希望您也能贴出来给大家一起分享!

 

@Override
public int hashCode() {
  final int prime = 31;
  int result = 1;
  result = prime * result + ((判定字段== null) ? 0 : 判定字段.hashCode());
  return result;
}

 使用复写hashCode的方式就可以了。

 

分享到:
评论
2 楼 satan_conjuror 2017-07-14  
@Override
public int hashCode() {
  final int prime = 31;
  int result = 1;
  result = prime * result + ((判定字段== null) ? 0 : 判定字段.hashCode());
  return result;
}

这种复写hashCode的方式就可以通过自己需要判定的字段来确定是否重复,只要复写了hashCode再用set去重处理时就可以解决了!
1 楼 abel_d 2017-06-12  
那么如何对这种情况的
引用
set
元素去重呢

相关推荐

    hashSet底层去重原理.xmind

    hashSet底层去重原理

    HashSet去重

    - **`HashSet`与`HashMap`的关系**:实际上,`HashSet`底层是使用`HashMap`实现的,`HashSet`中的元素实际上是`HashMap`的键(key),值(value)为一个固定的静态对象(`PRESENT`)。 #### 七、结论 通过上述分析可以...

    java HashSet 集合排序

    java HashSet 集合排序,需要通过利用TreeSet集合排序。2013-10-30。

    List 集合去重的3种方法.docx

    在Java编程中,处理列表(List)集合的去重是一个常见的任务,特别是在处理大量数据时。上述描述中提到了在实际开发中遇到的问题,即如何在一个没有主键的集合对象中,根据特定条件(如业务需求)筛选出不重复的元素...

    Java HashSet集合存储遍历学生对象代码实例

    在本文中,我们将通过一个实例,介绍如何使用Java HashSet集合来存储和遍历学生对象,并解决添加重复元素的问题。 知识点1: HashSet集合的特点 HashSet集合是一种基于哈希表的集合实现,它的特点是: * 不存储...

    集合类HashSet

    当我们在HashSet中添加一个元素时,Java会先计算该元素的哈希码,然后根据哈希码决定该元素在底层HashMap中的位置。如果两个元素的哈希码相同,它们会被放在同一个桶(bucket)中。为了避免冲突,Java还使用了equals...

    Java数组去重 集合List去重的常用方法总结

    ### Java数组去重与List集合去重的常用方法总结 #### 一、Java数组去重方法 在实际的开发工作中,经常会遇到需要处理数组中重复元素的问题。下面将详细介绍两种常用的数组去重方法。 ##### 方法一:For双循环法 ...

    set集合的基本特点,set集合底层去重原理,集合怎么进行排序

    **HashSet** 是Set接口的一个常见实现,其去重机制基于散列(Hashing)技术。当向HashSet中添加元素时,它会调用元素类的`hashCode()`方法生成一个散列码,这个散列码用于快速定位元素在内部数组的位置。如果两个...

    List 去重的6种方法(contains、迭代、hashSet、treeSet、linkedHashSet、stream)

    1:contains判断去重(有序) 此方法的优点的:理解起来比较简单,并且最终得到的集合也是有序...Stream 实现去重功能和其他方法不同的是,它不用新创建集合,使用自身接收一个去重的结果就可以了,并且实现代码也很简洁

    Java中List集合对象去重及按属性去重的8种方法

    对于包含自定义对象的List,可以实现一个比较器(Comparator)来根据对象的特定属性进行去重。 ```java @Test void testRemoveByAttribute1() { List&lt;Player&gt; uniquePlayers = playerList.stream() .distinct...

    hashset集合及红黑树简单随手记

    在JDK1.8之前,哈希表底层采用数组+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里。

    java jsonarray 踢重 去重操作

    3. **去重操作**:通过创建一个`HashSet`并将其初始化为`List`的内容,自动去除了重复的元素。这是因为`HashSet`不允许有重复元素。 4. **转换回JSONArray**:最后,使用`JSONArray.fromObject()`方法将`HashSet`...

    java中List对象列表实现去重或取出及排序的方法

    HashSet是一个不允许重复元素的集合,添加元素时,会自动忽略重复元素。 ```java List&lt;Student&gt; list = new ArrayList(); // 添加元素到list Set&lt;Student&gt; set = new HashSet(list); list.clear(); list.addAll(set...

    HashSet详解和使用示例_动力节点Java学院整理

    HashSet是Java编程语言中的一种集合类,它是一个不包含重复元素的集合,其内部实现基于HashMap。HashSet不保证元素的顺序,允许存储null元素,并且是非同步的,这意味着在多线程环境下,如果需要保证线程安全,需要...

    集合的概念及应用和HashSet保证数据不重复的原理

    1. **哈希函数**:当向HashSet中添加一个元素时,首先会调用该元素所属类的`hashCode()`方法生成哈希码。一个好的哈希函数应该尽可能地将不同元素映射到不同的哈希码,以减少哈希冲突。如果两个对象的哈希码相同,...

    HashSet的实现原理

    5. 包访问权限的构造函数:这个构造函数是HashSet内部使用的,它用于创建一个支持链接哈希集合的HashSet实例。这并不对外公开,主要是为了支持LinkedHashSet的实现。 最后,我们来看看HashSet的一些基本操作。由于...

    合并一维字符串数组并去重 C#

    在C#编程中,合并一维字符串数组并去重是一个常见的任务,特别是在处理数据集合或者进行数据整合时。本文将详细讲解如何实现这个功能,并提供相关的代码示例。 首先,我们要理解C#中的数组和字符串的基本概念。数组...

Global site tag (gtag.js) - Google Analytics