set接口
set接口和List接口一样 同样继承自Collection接口 它与Collection接口中的方法基本一致 并没有对Collection接口进行功能上的补充只是比Collection接口更加严格了
与List接口不同的是 set接口中元素无序 并且都会以某种规则存入的元素不出现重复
set集合有多个子类 主要用HashSet、LinkedHashSer这两个集合
Set集合取出元素的方式可以采用 迭代器 增强for
set接口的特点:
1.不允许存储重复的元素
2.没有索引 没有带索引的方法 也不能使用普通的for循环进行遍历
HashSet集合介绍
HashSet是Set接口的一个实现类 它所存储的元素不可重复的 并且元素都是无序的(即存取顺序不一致)HashSet底层的实现其实是一个HashMap支持
HashSet是根据对象的哈希值来确定元素在集合中的存储位置 因此具有良好的存取和查找性能 保证元素唯一性的方式依赖于 hashCode于equals方法
HashSet特点
1.不允许存储重复的元素2.没有索引 没有带索引的方法 也不能使用普通的for循环遍历
3.在是一个无序的集合,存储元素和取出元素的顺序有可能不一致
4.底层是一个哈希表结构(查询的速度非常的快)
代码:
public static void main(String[] args) {
//创建HashSet集合对象
HashSet<Integer> set = new HashSet<>();
//添加数据
set.add(1);
set.add(2);
set.add(3);
set.add(1);
//使用迭代器遍历集合
Iterator<Integer> iterator = set.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());//不能有重复是HashSet的一大特点
}
System.out.println("---------------------------");
//使用增强for循环遍历
for (Integer integer : set) {
System.out.println(integer);//不能有重复是HashSet的一大特点
}
}
哈希值
哈希值:是一个十进制的整数 由系统随机给出(就是对象的地址值 是一个逻辑地址 是模拟出来得到地址 不是数据实际存储的物理地址)在Object类有一个方法 可以获取对象的哈希值
方法:int hashCode() 返回该对象的哈希吗值
代码:
public static void main(String[] args) {
String s="a";
int c = s.hashCode();
System.out.println(c);
}
也就是说a的十进制是97
HashSet集合存储数据的结构
在JDK1.8之前 哈希表底层采用数组+链表 即使用链表处理冲突 同一hash值的链表都存储在一个链表里 但是当位于一个桶中的元素较多 即hash值相等的元素较多时 通过key值依次查找的效率较低
而JDK1.8中,哈希表存储采用数组+链表+红黑树实现 当链表长度超过阀值(8)时 将链表转换为红黑树 这样大大减少了查找时间
标签:set,HashSet,元素,接口,链表,哈希 From: https://www.cnblogs.com/shenziyi/p/16798087.html