实现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());
}
}
本文如果写的有什么不足,希望大家与我交流,共同学习,共同进步。。。。。。。。。
分享到:
相关推荐
本文主要探讨了三种基于Set接口的实现类:HashSet、LinkedHashSet和TreeSet,它们各自有不同的特性和使用场景。 首先,HashSet是最基础的Set实现,它不保证元素的特定顺序,也不保证在多次操作后保持元素的顺序不变...
Set集合在Java编程中扮演着重要的角色,它是一种不允许元素重复的...在处理自定义对象时,确保正确地重写`equals()`和`hashCode()`方法至关重要,因为这是判断对象是否相等的标准,特别是在使用HashSet和TreeSet时。
Set集合是JavaSE中的一种重要数据结构,主要包括HashSet、TreeSet和LinkedHashSet三个子类。下面我们将对Set集合的原理、特点、使用场景等进行详细的探索和分析。 HashSet HashSet是Set集合中的一种重要实现类,...
Set接口的实现类主要有HashSet、TreeSet和LinkedHashSet,它们各自有不同的特性和使用场景。 1. **HashSet** HashSet是最基本的Set实现类,它的内部基于HashMap实现。这意味着它的元素存储是无序的,且通过哈希...
在Java集合框架中,TreeSet是一个重要的数据结构,它是Set接口的实现类之一,与HashSet和LinkedHashSet不同,TreeSet具有排序功能,这是因为其不仅继承自AbstractSet,还实现了SortedSet和NavigableSet接口。...
Set接口继承自Collection接口,并提供了多种实现类,如HashSet、LinkedHashSet、TreeSet和CopyOnWriteArraySet等。这些实现类各自有不同的特性和使用场景。 1. 实现类详解: - `CopyOnWriteArraySet`:这个类基于`...
- **Set接口**:不允许重复元素,主要实现有HashSet、TreeSet和LinkedHashSet。 - HashSet:无序存储,不保证元素顺序,允许快速查找。 - TreeSet:有序存储,遵循自然排序或自定义比较器排序,实现了SortedSet...
Set接口主要有三种实现类:`HashSet`、`LinkedHashSet`以及`TreeSet`。 ##### 1.1 认识Set集合的特点 - **HashSet**:基于哈希表的实现,不保证元素的顺序,不允许重复元素。 - **LinkedHashSet**:基于哈希表和...
Set接口的主要实现类有HashSet、LinkedHashSet和TreeSet,其中HashSet是基于哈希表实现的,具有高效查找和添加元素的特性。 2. **哈希值简介** 哈希值(Hash Value)是JDK根据对象的内存地址、字符串内容或数字...
- IdentityHashMap 使用对象的引用相等性而非对象的equals()方法来判断键是否相同。 - HashMap 默认使用对象的equals()和hashCode()方法来比较键。 16. Iterator 和 Enumeration 的区别: - Iterator 支持删除...
`HashSet`的子类`LinkedHashSet`同时实现了散列和链表结构,因此它保留了元素的插入顺序。 另一方面,`TreeSet`实现了`SortedSet`接口,这意味着它可以根据元素的自然排序或者自定义的比较器进行排序。为了在`...
IdentityHashMap使用对象的引用相等性作为判断键是否相同的依据,而非equals()方法的返回值。 在性能方面,由于Map使用哈希散列,查找元素通常比List快。在选择集合类时,需要考虑数据结构的需求、线程安全、元素的...
equals方法用于判断两个对象是否相等,hashCode方法则用于获取对象的哈希码,好的哈希函数可以将集合中的元素均匀分布在哈希表中,从而减少哈希冲突,提高集合的性能。 综上所述,Java集合框架是Java语言中用于数据...
如果需要在HashSet中存储不可变对象,则需要确保对象的相等性判断依据(equals方法)和哈希码(hashCode方法)的正确实现。 可变参数的格式是在方法声明中使用省略号“...”来表示方法可以接受任意数量的参数,这些...
如果两个元素的`equals()`方法返回`true`,则它们被视为相等的元素,因此,`HashSet`不会存储这两个元素。 #### 2. LinkedHashSet `LinkedHashSet`是`HashSet`的一个子类,它通过链接列表保持了元素的插入顺序。这...
Set接口的实现类包括HashSet、LinkedHashSet和TreeSet。每个实现类都有其特定的特性,如HashSet基于哈希表实现,插入和查找速度快;TreeSet则按照元素的自然排序或定制的Comparator进行排序。 5. Map接口: 不同于...
常见的实现类有HashSet、LinkedHashSet和TreeSet。 - HashSet是基于哈希表实现的,元素插入没有特定顺序,但查找速度快。 - LinkedHashSet保持元素的插入顺序,同时满足Set接口的特性。 - TreeSet是基于红黑树...
Set接口的主要实现类有HashSet、LinkedHashSet和TreeSet。每个实现类都有其特性,例如: 1. HashSet:不保证元素的顺序,允许null元素,但不允许重复元素。 2. LinkedHashSet:保持元素插入的顺序,允许null元素,...
5. **方法重写**:在Java中,子类可以重写父类的方法,这在集合框架中尤其重要,因为集合会调用对象的equals()和hashCode()方法来判断元素是否相等和确定存储位置。 6. **多线程**:如果项目中涉及到并发编程,可能...