`
万俟辉夜
  • 浏览: 21566 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

HashSet、LinkedHashSet、TreeSet判断相等

    博客分类:
  • Java
阅读更多

实现Set接口常用的有3个类,HashSet、LinkedHashSet、TreeSet,Set能保证数据的唯一存储,对于基本类型比较好判断相等,但往往在实际编程中,Set中大部分都是以对象的形式保存,这时候各对象的地址就不一样了,所以就算对象的所有属性都相等,由于地址不同还是都添加到Set中,这与我们期望的不一样,就需要了解Set对于元素判断相等的机制了。

 

 

首先是HashSet,HashSet是利用哈希表的形式存储数据元素,所有遍历HashSet的元素顺序是不定的,不一定与添加的顺序相同。HashSet是通过hashCode()函数和equals()函数来判断两个元素是否相等,从而决定要不要存储该元素。 运行机制是:先取得该对象元素,然后调用该类的hashCode(),若该hashCode已经存在,则直接return,继续往后执行;若hashCode不存在,在调用equals()函数,若equals函数返回假,则插入该元素,否则return继续往后执行。所以我们需要重写HashSet判断元素相等的机制,即重写Object类的hashCode()和equals()。具体代码如下:

 

 

package com.lsx.model;

public class User {

	private int age;
	private String name;
	
	public User() {
		super();
	}
	
	public User(int age, String name) {
		super();
		this.age = age;
		this.name = name;
	}
	
	public int getAge() {
		return age;
	}
	
	public void setAge(int age) {
		this.age = age;
	}
	
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	@Override
	public boolean equals(Object obj) {
		// TODO Auto-generated method stub
		System.out.println("ff");
		return name == ((User)obj).getName();
	}
	
	@Override
	public int hashCode() {
		// TODO Auto-generated method stub
		System.out.println("gg");
		return age * name.hashCode();
	}
	
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "age: " + age + "  name: " + name;
	}
}

 这样就自己在hashCode和equals中写判断相等条件即可。

 

 

LinkedHashSet: LinkedHashSet是继承自HashSet,所以判断相等机制与HashSet一样,只是LinkedHashSet维护着一个运行于所有条目的双重链接列表,此链接列表定义了迭代顺序,即LinkedHashSet的遍历顺序与元素插入顺序一致。

 

 

TreeSet : TreeSet的插入机制不同于HashSet和LinkedHashSet,每插入一个元素时,都会对元素进行比较,调用元素对象的compareTo()函数,然后通过返回结果来决定元素插入位置(如果两个函数返回0则不插入),所以TreeSet能够保证插入的元素是按照特定的顺序来存储的,即TreeSet是有序的。故要判断两个元素对象是否相等,只需要实现comparable接口,重写compareTo()方法,在方法中写判断相等条件。 代码如下:

 

 

public class User implements Comparable<User> {

...

@Override
	public int compareTo(User arg0) {
		// TODO Auto-generated method stub
		return this.name.compareTo(arg0.getName());
	}
}
 

 

本文如果写的有什么不足,希望大家与我交流,共同学习,共同进步。。。。。。。。。

 

 

0
0
分享到:
评论
3 楼 万俟辉夜 2012-10-22  
nello 写道
运行机制是:先取得该对象元素,然后调用该类的hashCode(),若该hashCode已经存在,则直接return,继续往后执行;若hashCode不存在,在调用equals()函数,若equals函数返回真,则插入该元素,否则return继续往后执行。 
------------------------------------------
1,"return继续往后执行"?!
2,"若hashCode不存在,在调用equals()函数,若equals函数返回真,则插入该元素" 返回为真不是代表已经存在了吗?怎么还要插入,再插入还怎么能保证数据唯一?!



第一条可能写的不专业吧,意思就是HashSet内部不再往后执行,而直接跳转到我们写的代码这里来;第二条是我的笔误,应该是返回假。感谢指出这篇文章的错误之处。。。
2 楼 sweat89 2012-10-22  
nello 写道
运行机制是:先取得该对象元素,然后调用该类的hashCode(),若该hashCode已经存在,则直接return,继续往后执行;若hashCode不存在,在调用equals()函数,若equals函数返回真,则插入该元素,否则return继续往后执行。 
------------------------------------------
1,"return继续往后执行"?!
2,"若hashCode不存在,在调用equals()函数,若equals函数返回真,则插入该元素" 返回为真不是代表已经存在了吗?怎么还要插入,再插入还怎么能保证数据唯一?!

+1
1 楼 nello 2012-10-22  
运行机制是:先取得该对象元素,然后调用该类的hashCode(),若该hashCode已经存在,则直接return,继续往后执行;若hashCode不存在,在调用equals()函数,若equals函数返回真,则插入该元素,否则return继续往后执行。 
------------------------------------------
1,"return继续往后执行"?!
2,"若hashCode不存在,在调用equals()函数,若equals函数返回真,则插入该元素" 返回为真不是代表已经存在了吗?怎么还要插入,再插入还怎么能保证数据唯一?!

相关推荐

    HashSet,TreeSet和LinkedHashSet的区别1

    本文主要探讨了三种基于Set接口的实现类:HashSet、LinkedHashSet和TreeSet,它们各自有不同的特性和使用场景。 首先,HashSet是最基础的Set实现,它不保证元素的特定顺序,也不保证在多次操作后保持元素的顺序不变...

    Java—Set集合详解(HashSet/LinkedHashSet/TreeSet/EnumSet)

    Set集合在Java编程中扮演着重要的角色,它是一种不允许元素重复的...在处理自定义对象时,确保正确地重写`equals()`和`hashCode()`方法至关重要,因为这是判断对象是否相等的标准,特别是在使用HashSet和TreeSet时。

    JavaSE专题-Set集合.doc

    Set集合是JavaSE中的一种重要数据结构,主要包括HashSet、TreeSet和LinkedHashSet三个子类。下面我们将对Set集合的原理、特点、使用场景等进行详细的探索和分析。 HashSet HashSet是Set集合中的一种重要实现类,...

    java中set接口使用方法详解

    Set接口的实现类主要有HashSet、TreeSet和LinkedHashSet,它们各自有不同的特性和使用场景。 1. **HashSet** HashSet是最基本的Set实现类,它的内部基于HashMap实现。这意味着它的元素存储是无序的,且通过哈希...

    Java数据结构--13.Java8数据结构TreeSet.pdf

    在Java集合框架中,TreeSet是一个重要的数据结构,它是Set接口的实现类之一,与HashSet和LinkedHashSet不同,TreeSet具有排序功能,这是因为其不仅继承自AbstractSet,还实现了SortedSet和NavigableSet接口。...

    对Java中Set的深入研究.pdf

    Set接口继承自Collection接口,并提供了多种实现类,如HashSet、LinkedHashSet、TreeSet和CopyOnWriteArraySet等。这些实现类各自有不同的特性和使用场景。 1. 实现类详解: - `CopyOnWriteArraySet`:这个类基于`...

    java Collection&Map

    - **Set接口**:不允许重复元素,主要实现有HashSet、TreeSet和LinkedHashSet。 - HashSet:无序存储,不保证元素顺序,允许快速查找。 - TreeSet:有序存储,遵循自然排序或自定义比较器排序,实现了SortedSet...

    set-collections-map

    Set接口主要有三种实现类:`HashSet`、`LinkedHashSet`以及`TreeSet`。 ##### 1.1 认识Set集合的特点 - **HashSet**:基于哈希表的实现,不保证元素的顺序,不允许重复元素。 - **LinkedHashSet**:基于哈希表和...

    day06-集合1

    Set接口的主要实现类有HashSet、LinkedHashSet和TreeSet,其中HashSet是基于哈希表实现的,具有高效查找和添加元素的特性。 2. **哈希值简介** 哈希值(Hash Value)是JDK根据对象的内存地址、字符串内容或数字...

    Java 集合框架高难度进阶版面试题集锦解析

    - IdentityHashMap 使用对象的引用相等性而非对象的equals()方法来判断键是否相同。 - HashMap 默认使用对象的equals()和hashCode()方法来比较键。 16. Iterator 和 Enumeration 的区别: - Iterator 支持删除...

    JAVA集合类[参考].pdf

    `HashSet`的子类`LinkedHashSet`同时实现了散列和链表结构,因此它保留了元素的插入顺序。 另一方面,`TreeSet`实现了`SortedSet`接口,这意味着它可以根据元素的自然排序或者自定义的比较器进行排序。为了在`...

    java中集合的用法与区别.docx

    IdentityHashMap使用对象的引用相等性作为判断键是否相同的依据,而非equals()方法的返回值。 在性能方面,由于Map使用哈希散列,查找元素通常比List快。在选择集合类时,需要考虑数据结构的需求、线程安全、元素的...

    Java集合框架

    equals方法用于判断两个对象是否相等,hashCode方法则用于获取对象的哈希码,好的哈希函数可以将集合中的元素均匀分布在哈希表中,从而减少哈希冲突,提高集合的性能。 综上所述,Java集合框架是Java语言中用于数据...

    【List、Set、数据结构、Collections】.pdf

    如果需要在HashSet中存储不可变对象,则需要确保对象的相等性判断依据(equals方法)和哈希码(hashCode方法)的正确实现。 可变参数的格式是在方法声明中使用省略号“...”来表示方法可以接受任意数量的参数,这些...

    Java中Set的深入研究

    如果两个元素的`equals()`方法返回`true`,则它们被视为相等的元素,因此,`HashSet`不会存储这两个元素。 #### 2. LinkedHashSet `LinkedHashSet`是`HashSet`的一个子类,它通过链接列表保持了元素的插入顺序。这...

    java&c++概念及面试常问问题及解答

    Set接口的实现类包括HashSet、LinkedHashSet和TreeSet。每个实现类都有其特定的特性,如HashSet基于哈希表实现,插入和查找速度快;TreeSet则按照元素的自然排序或定制的Comparator进行排序。 5. Map接口: 不同于...

    黑马程序员java培训就业班笔记集合体系总结.docx

    常见的实现类有HashSet、LinkedHashSet和TreeSet。 - HashSet是基于哈希表实现的,元素插入没有特定顺序,但查找速度快。 - LinkedHashSet保持元素的插入顺序,同时满足Set接口的特性。 - TreeSet是基于红黑树...

    JAVA容器的作用和概览

    Set接口的主要实现类有HashSet、LinkedHashSet和TreeSet。每个实现类都有其特性,例如: 1. HashSet:不保证元素的顺序,允许null元素,但不允许重复元素。 2. LinkedHashSet:保持元素插入的顺序,允许null元素,...

    exercicio-com-set:Java程序

    5. **方法重写**:在Java中,子类可以重写父类的方法,这在集合框架中尤其重要,因为集合会调用对象的equals()和hashCode()方法来判断元素是否相等和确定存储位置。 6. **多线程**:如果项目中涉及到并发编程,可能...

Global site tag (gtag.js) - Google Analytics