Set集合
java.util.set接口和java.util.List接口一样,同样继承自collection接口,它与collection接口中的方法基本一致,并没有对Collection接口进行功能上的扩充,只是比Collection接口更加严格了。与List接口不同的是,Set 接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。
Set接口的特点:
- 不允许存储重复的元素
- 没有索引,没有带索引的方法,也不能使用普通的for循环遍历
tips:因为没有索引,所以不能用普通for循环遍历,Set集合取出元素的方式可以采用 :迭代器、增强for。
HashSet集合
java.util.HashSet是Set接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的(即存取顺序不一致)。 java.util.HashSet 底层的实现其实是一个java.util.HashMap支持。
HashSet是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。保证元素唯一性的方式依赖于: hashCode 与equals方法。
HashSet特点:
- 不允许存储重复的元素
- 没有索引,没有带索引的方法,也不能使用普通的for循环遍历
- 是一个无序的集合,存储元素和取出元素的顺序有可能不一致
- 底层是一个哈希表结构(查询的速度非常的快)
常用方法:
boolean add(E e) 如果没有已存在,则将指定的元素添加到该集合中。
void clear() 从这个集合中移除所有的元素。
Object clone() 返回该 HashSet实例浅拷贝:元素本身不是克隆。
boolean contains(Object o) 如果这套 true返回包含指定的元素。
boolean isEmpty() 返回 true如果这个集合不包含元素。
Iterator<E> iterator() 返回此集合中元素的迭代器。
boolean remove(Object o) 如果当前存在,则从该集合中移除指定的元素。
int size() 返回该集合中元素个数(其基数)。
Spliterator<E> spliterator() 创建一个后期绑定和快速失败 Spliterator在这个集合中的元素。
set集合常用方法以及遍历方式实践:
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
//Set集合常用方法以及遍历方式
public class SetDemo {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("han");
set.add("hsz");
set.add("hhh");
//判断该集合是否为空
System.out.println(set.isEmpty());
//判断该集合是否包含某元素
System.out.println(set.contains("han"));
//获取集合中的元素数
System.out.println(set.size());
//删除集合中指定位置的元素
System.out.println(set.remove("hsz"));
//1、使用增强型for循环遍历\因为set集合没有索引,所以不能使用普通for循环遍历
for (String s : set) {
System.out.println(s);
}
System.out.println("=================");
//2、使用迭代器Iterator遍历
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()){
String next = iterator.next();
System.out.println(next);
}
}
}
哈希值:
哈希值:是一个十进制的整数,由系统随机给出(就是对象的地址值,是一个逻辑地址,是模拟出来得到地址,不是数据实际存储的物理地址)在Object类有一个方法,可以获取对象的哈希值
int hashCode() 返回该对象的哈希码值。
hashCode方法的源码:
public native int hashCode();
native:代表该方法调用的是本地操作系统的方法
哈希表:
在JDK1.8之前,哈希表底层采用数组+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里。但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低。而JDK1.8中 ,哈希表存储采用数组+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。
Set集合存储元素不重复的原理:
HashSet存储自定义类型元素:
set集合报错元素唯一:
存储的元素(String, Integer…student, Person…),必须重写hashCode方法和equals方法
LinkedHashSet集合:
java. util.LinkedHashSet集合extends HashSet集合
LinkedHashSet集合特点:
底层是一个哈希表(数组+链表/红黑树)+链表:多了一条链表(记录元素的存储顺序),保证元素有序