Java中Set接口与实现类的使用
Set接口与实现类的使用
文章目录
- Set接口与实现类的使用
- Set及其实现类的特点
- 开发中的使用频率及场景
- Set中无序性、不可重复性的理解
- 添加到HashSet\LinkedHashSet中元素的要求
Java集合框架体系(java.util包下)
- java.util.Collection:存储一个一个的数据
- 子接口:List:存储有序的、可重复的数据(动态数组)
- ArrayList(主要实现类)、LinkedList、Vector
- 子接口:Set:存储无序的、不可重复的数据
- HashSet(主要实现类)、LinkedHashSet、TreeSet
- 子接口:List:存储有序的、可重复的数据(动态数组)
- java.util.Map:存储一对一对的数据(类似于函数)
- HashMap(主要实现类)、LinkedHashMap、TreeMap、Hashtable、Properties
Set及其实现类的特点
- java.util.Collection
- 子接口 Set
- HashSet 主要实现类 底层使用的HashMap ,即数组+单向链表+红黑树结构进行存储(jdk8之前)
- LinkedHashSet 是HashSet的子类,在现有的数组+单向链表+红黑树结构的基础上,头添加了一组双向链表,用于记录添加元素的先后顺序。(可以按照添加顺序进行遍历)
- TreeSet:底层使用红黑树存储、可以按照添加的元素的指定的属性大小顺序进行遍历。
- HashSet 主要实现类 底层使用的HashMap ,即数组+单向链表+红黑树结构进行存储(jdk8之前)
- 子接口 Set
//使用HashSet,遍历元素的顺序和存入元素的顺序不一致
package Collection;public class Person{String name;int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}
}package Collection;
import org.junit.Test;import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;public class SetTest {public static void main(String[] args) {Set set = new HashSet();set.add("AA");set.add(123);set.add("BB");set.add(new Person("Tom",12));Iterator iterator = set.iterator();while(iterator.hasNext()){System.out.println(iterator.next());}}
}
//使用LinkedHashSet进行遍历,与存入顺序一致
package Collection;import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;public class LinkedHashSetTest {public static void main(String[] args) {//使用LinkedHashSet进行遍历Set set = new LinkedHashSet();set.add(123);set.add("ABC");set.add("567");Iterator iterator = set.iterator();while(iterator.hasNext()){System.out.println(iterator.next());}}
}
//输出结果
//123
//ABC
//567
开发中的使用频率及场景
- 相较于List、Map来说,set的使用频率较少
- 用来过滤重复数据
Set中无序性、不可重复性的理解
-
无序性 : 不等于随机性。也不等同于
添加元素的顺序和遍历元素的顺序不一致
。而是和添加元素的位置有关,不像ArrayList那样依次紧密排列。 根据添加元素的哈希值,计算其在数组中的存储位置,此位置不是依次排列的,表现为无序性
-
不可重复性:添加到Set中的元素是不能相同的,比较的标准,需要判断
hashCode
得到的哈希值与equals()得到的boolean结果。哈希值相同且equals()返回true,则认为元素是相同的。
添加到HashSet\LinkedHashSet中元素的要求
- 要求元素所在的类要重写两个方法,
equals()
和hashCode()
- 要求
equals()
和hashCode()
要保持一致性,只需要在IDEA中自动生成两个方法的重写即可,即能保证两个方法的一致性