HashSet与TreeSet对重复元素的判断不同之处

转载 2014年12月29日 10:42:51

转:http://wlt2008-com.iteye.com/blog/1447207

HashSet 的实现其实非常简单,它只是封装了一个 HashMap 对象来存储所有的集合元素,所有放入 HashSet 中的集合元素实际上由 HashMap 的 key 来保存,而 HashMap 的 value 则存储了一个 PRESENT,它是一个静态的 Object 对象。

HashSet 的绝大部分方法都是通过调用 HashMap 的方法来实现的,因此 HashSet 和 HashMap 两个集合在实现本质上是相同的。

 

HashMap 的 put 与 HashSet 的 add

 

于 HashSet 的 add() 方法添加集合元素时实际上转变为调用 HashMap 的 put() 方法来添加 key-value 对。HashMap 的 put() 方法首先调用.hashCode() 判断返回值相等,如果返回值相等则再通过 equals 比较也返回 true,最终认为key对象是相等的已经在HashMap中存在了

 

 

TreeMap 的 put 与 TreeSet 的 add

TreeMap中调用put方法添加键值时,调用对象的它的 compareTo(或 compare)方法对所有键进行比较,此方法饭回0,则认为两个键就是相等的

 

TreeSet添加元素的时候,调用compareTo或compare方法来定位元素的位置,也就是返回compareTo或compare返回0则认为是同一个位置的元素,即相同元素

package com.test.treeSet;

import java.util.*;

public class TestTreeSet {
	public static void p(Object obj){
		System.out.println(obj);
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		MyComparator m = new MyComparator();
		HashSet<Student> set1 = new HashSet<Student>();
		TreeSet<Student> set2 = new TreeSet<Student>(m);
		
		Student s1 = new Student("001","郭玲玲",100);
		Student s2 = new Student("002","刘德华",100);
		Student s3 = new Student("003","林志玲",80);
		Student s4 = new Student("003","郭玲玲",90);
	
		set1.add(s1);
		set1.add(s2);
		set1.add(s3);
		set1.add(s4);
	/*		
		p(set1);
		
		set2.add(s1);
		set2.add(s2);
		set2.add(s3);
		set2.add(s4);
		
		p(set2);*/
/*		
		TreeMap<Student, String> map = new TreeMap<Student, String>(m);
		map.put(s1, s1.num);
		map.put(s2, s2.num);
		map.put(s3, s3.num);
		map.put(s4, s4.num);
		p(map);
*/
	}
	

}
class Student{
	public String name;
	public String num;
	public int score;
	public Student(String num, String name, int score) {
		super();
		this.num = num;
		this.name = name;
		this.score = score;
	}
	@Override
	public String toString() {
		return this.num+" "+this.name+" "+this.score;
	}
	
	@Override
	public boolean equals(Object obj) {
		System.out.println("equals");
		Student s = (Student)obj;
		return this.num.equals(s.num);
	}
	@Override
	public int hashCode() {
		System.out.println("hashCode");
		return this.num.hashCode();
	}
	
}
class MyComparator implements Comparator<Student>{

	public int compare(Student s1, Student s2) {
		System.out.println("调用了compare()");
		if(s1.num.equals(s2.num) ){ //成绩等学号不等
			return 0; //按学号比较
		}else if( s1.score==s2.score &&!s1.num.equals(s2.num) ){
			return s1.num.compareTo(s2.num);
		}
		
		return s1.score-s2.score;

	}
	
}


TreeSet(有顺序的排列元素 Set的里面不容许有重复的、认情况下就通过equals来比较)

Set的里面不容许有重复的,如果是对象的话,就要给它一个比较的规则,否则默认情况下就通过equals来比较...
  • zhouyong0
  • zhouyong0
  • 2011年05月18日 17:23
  • 2071

java中TreeSet类add时去重问题(与自己定义的Comparator有直接关系)

这个是我在百度问答里面问的一个问题(直接copy过来的) 向TreeSet添加p1到p5后,输出发现p5没有加进去... 按我的理解来说,p5与p2虽然score属性值一样,但是它们是不同的对象,应...
  • li346985170
  • li346985170
  • 2013年08月01日 11:46
  • 2084

HashSet判断唯一性的步骤

HashSet 判断唯一性的不是两个步骤而是三个步骤 1.HashCode() 2.== 3.equals() 前面的比较会短路后面的比较 ; 也就是说 1 &&( 2||3) 底层是由Map存储数据...
  • followMyInclinations
  • followMyInclinations
  • 2015年09月06日 14:21
  • 1308

黑马程序员——集合的特殊功能之HashSet集合如何保证元素的唯一性

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- HashSet集合储存的元素的唯一性是怎么保证的呢? 1.查看add方法源码: publi...
  • DoSamba
  • DoSamba
  • 2015年12月29日 02:25
  • 422

HashSet保证元素唯一性的原理

使用Set集合是要去除重复元素,如果在存储的时候逐equals()比较,效率太低,哈希算法提高了去重复的效率,减少了使用equals()方法的次数,当HashSet对象调用add()方法存储对象时,会...
  • StriverLi
  • StriverLi
  • 2017年02月22日 22:26
  • 446

HashSet如何保证元素的唯一性

HashSet的底层实现是哈希表,也就是说,保证元素的唯一性的第一层保证就是元素的HashCode。下面我们从源码的角度来分析:当我们向HashSet中插入一个元素的时候,发生了什么。 public...
  • dajiangqingzhou
  • dajiangqingzhou
  • 2017年09月14日 10:17
  • 90

java学习笔记之 HashSet 保证元素唯一性的方法

问题: 如下,在哈希表中添加了两个相同自定义学生类,可以看到输出为两个名为LEE的学生对象。 import java.util.HashSet; import java.util.Iterator...
  • a542214712
  • a542214712
  • 2012年05月06日 22:27
  • 5252

HashSet与TreeSet对重复元素的判断不同之处

HashSet 的实现其实非常简单,它只是封装了一个 HashMap 对象来存储所有的集合元素,所有放入 HashSet 中的集合元素实际上由 HashMap 的 key 来保存,而 HashMap ...
  • shibushiyouwenti
  • shibushiyouwenti
  • 2014年09月19日 17:18
  • 581

TreeSet和TreeMap不能存放重复元素?能不能存放null?其实不是这样的——灵活的二叉树

问题一:本来认为TreeMap不能存放重复元素?其实并非如此; 其实一般情况下是不允许存放重复元素的,但是它并非这么死板,在一些情况下是可以存放重复元素的,存了又会有引入其他问题。 问题二:能不能...
  • u010698072
  • u010698072
  • 2017年02月16日 13:42
  • 1757

HashSet与TreeSet对重复元素的判断不同之处

转:http://wlt2008-com.iteye.com/blog/1447207 HashSet 的实现其实非常简单,它只是封装了一个 HashMap 对象来存储所有的集合元素,所有放...
  • wxwzy738
  • wxwzy738
  • 2014年12月29日 10:42
  • 1533
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HashSet与TreeSet对重复元素的判断不同之处
举报原因:
原因补充:

(最多只允许输入30个字)