• 明确Set集合接口的特点。

  • java.util.Set接口和java.util.List接口一样,同样继承自Collection接口,它与Collection接口中的方法基本一致,并没有对Collection接口进行功能上的扩充,只是比Collection接口更加严格了。与List接口不同的是,Set接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。

  • 特点(重点) : 元素无序 , 去重   底层 : 是 哈希表(哈希值和数组) , 链表 , 红黑树 (根据数据的哈希值来存入集合中(存入前会先调用hashCode()方法来计算数据的哈希值) , 当两个数据哈希值相等时这时会调用eques()方法来判断两个数据是否相等,如果不相等则用链表的的形式存入集合中 ,  当同一个哈希值地址存入了8个以上的链表数据时,这时链表会变成红黑树)  JDK1.8之后才出现的红黑树

  • Set集合有多个子类,这里我们介绍其中的两个(方法就不一 一介绍了继承的Collection,父类的方法可以直接用):

    • java.util.HashSet集合类

    • java.util.LinkedHashSet集合类

小结

Set集合不能通过下标操作数据,所有的方法都是继承Collection集合接口,没有自己的特有方法。Set集合保存数据的特点为: 不能保存重复元素,不保证元素的存取顺序。而因为Set集合并没有下标,所以遍历的方式只能通过迭代器和高级for循环完成。

HashSet集合介绍

  java.util.HashSetSet接口的一个实现类,保存数据的特点为:

  • 存储的元素是不可重复的

  • 保存的元素都是无序的( 即存取顺序不一致 )。

对象的哈希值

 package com.itheima.set_01;
/*
02_对象的哈希值
哈希值就是一个十进制的值,是一个对象的特征码(不同对象的哈希值可能重复) 哈希值如何获取??Object中有一个方法hashCode方法就可以获取 哈希值能不能自定义?可以,在自定义类中重写该方法即可 哈希值可以自定义,但是如何自定义??我们不会,但是我们可以仿照String类
注意:String的哈希值跟它的内容有关。所以自定义对象的哈希值也应该和内容是有关 总结:对象的哈希值是跟该对象的内容有关的,不同的对象或者内容不同的对象,可能导致它们的哈希值是一样的
*/
public class HashCodeDemo02 {
public static void main(String[] args) {
Student student = new Student("张三", 18);
int hashCode = student.hashCode();
System.out.println(hashCode);//哈希值
String str = student.toString();
/*
底层代码:将真正的内存地址值使用哈希算法求出了哈希值,又被转换成了十六进制
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
} hashcode方法:使用native关键字,是java中jni技术,调用底层C,C++代码在内存开辟空间
public native int hashCode(); */
System.out.println(str);//地址
}
}

哈希表以及HashSet中去重复的原理

  hashSet去重先判断哈希值,如果不同直接就保存,如果相同,还要调用equals方法再判断内容,如果内容不同也保存

 package com.itheima.set_01;

 import java.util.HashSet;
import java.util.Set; public class HashTableDemo03 {
public static void main(String[] args) {
//创建一个存放字符串的Set集合
Set<String> sets = new HashSet<>(); String str1 = "abc";
String str2 = new String("abc");
String str3 = "通话";
String str4 = "重地"; System.out.println(str1== str2);
System.out.println(str1.hashCode());//
System.out.println(str2.hashCode());//
System.out.println(str3.hashCode());//
System.out.println(str4.hashCode());// sets.add(str1);
sets.add(str2);
sets.add(str3);
sets.add(str4); System.out.println(sets); }
}

HashSet存储自定义对象并去重

 package com.itheima.set_01;

 import java.util.HashSet;

 /*
04_HashSet存储自定义对象,去重 总结-要对自定义对象进行去重,必须在类中重写hashCode和equals,自动生成即可
*/
public class HashSetDemo04 {
public static void main(String[] args) {
HashSet<Student> sets = new HashSet<>();
Student student1 = new Student("张三", 18);
Student student2 = new Student("李四", 18);
Student student3 = new Student("王五", 18);
Student student4 = new Student("张三", 18); //如果没有重写hashcode方法,那么哈希值根据地址值得到的
System.out.println(student1.hashCode());
System.out.println(student2.hashCode());
System.out.println(student3.hashCode());
System.out.println(student4.hashCode()); //在实际开发中,相同内容的对象,看作是同一个 sets.add(student1);
sets.add(student2);
sets.add(student3);
sets.add(student4); System.out.println(sets); }
}

LinkedHashSet的扩展

 package com.itheima.set_01;

 import java.util.LinkedHashSet;

 /*
Set-存取无序 04_LinkedHashSet的扩展
LinkedHashSet底层由哈希表+链表,它能保证去重也能保证存取有序
*/
public class LinkedHashSetDemo5 { public static void main(String[] args) {
LinkedHashSet<String> sets = new LinkedHashSet<>();
sets.add("张飞");
sets.add("刘备");
sets.add("关羽");
sets.add("张飞");
System.out.println(sets);
}
}

JavaSE Set集合的更多相关文章

  1. JavaSE笔记-集合

    Java集合大致可分为:List,Set,Map,Queue List:有序,可重复 Set:无序(输出和插入顺序不一定一致),不可重复 Map:映射关系,根据key去访问value Queue:队列 ...

  2. JavaSE Map集合

    Map集合 在Map集合中保存的数据为一组数据,其中:一个数据为key,另外一个数据为value.而key和value具备对应的关系,在集合中它们属于一组(一对)数据.而每个key只能对应唯一的一个v ...

  3. JavaSE List集合

    我们掌握了Collection接口的使用后,再来看看Collection接口中的子接口和实现类,他们都具备那些特性呢? 接下来,我们一起学习Collection中的常用几个子接口: ​ java.ut ...

  4. JavaSE Collection集合

    集合:是java中提供的一种容器,可以用来存储多个对象.可是我们前面学习的数组也是可以保存多个对象的,为什么还要提供集合容器呢?集合和数组它们有啥区别呢? 数组的长度是固定的.一旦创建完成不能改变长度 ...

  5. Javase之集合体系(4)之Map集合

    集合体系之Map集合 ##Map<K,V>( 接口 ) 特点:将键映射到值对象,一个映射不能包含重复的键:每个键只能映射一个值 Map集合与Collection集合的区别 ​ Map集合存 ...

  6. Javase之集合体系(2)之List及其子类ArrayList,LinkedList与Vector及其迭代器知识

    集合体系之List及其子类ArrayList,LinkedList与Vector及其迭代器知识 List(接口) 特点:有序(存储与取出顺序相同),可重复 List子类特点: ​ ArrayList: ...

  7. Javase之集合体系(3)之Set及其子类知识

    集合体系之Set及其子类知识 Set(接口) public interface Set<E>extends Collection<E> ​ 特点:无序(存储顺序与取出顺序不一致 ...

  8. Javase之集合泛型

    集合泛型知识 泛型 是一种把类型明确工作推迟到创建对象或者调用方法的时候才明确的特殊类型. 也称参数化类型,把类型当成参数传递. 在jdk1.5中出现.一般来说经常在集合中使用. 格式 <数据类 ...

  9. Javase之集合体系之(1)集合顶层类Collection与其迭代器知识

    集合体系之集合顶层类Collection与其迭代器知识 集合的由来:Java是一门面向对象语言,而面向对象语言对事物的描述是通过对象体现的,为了方便对多个对象进行操作,就必须把多个对象进行存储,而要存 ...

随机推荐

  1. .NET Core 跨平台 串口通讯 ,Windows/Linux 串口通讯,flyfire.CustomSerialPort 的使用

    目录 1,前言 2,安装虚拟串口软件 3,新建项目,加入 flyfire.CustomSerialPort 4,flyfire.CustomSerialPort 说明 5,开始使用 flyfire.C ...

  2. 一步步改造wcf,数据加密传输-匿名客户端加密传输

    一步步改造wcf,数据加密传输-匿名客户端加密传输 百度搜索wcf加密传输,资料挺多,真真正正能用的确不多. 一是本来就很复杂,而是各位大神给的资料不足.本人今天来提供一个简易方法. 匿名客户端加密传 ...

  3. PS插件CameraRaw-初次尝试

    一.百度百科原话 RAW的原意就是“未经加工”.可以理解为:RAW图像就是CMOS或者CCD图像感应器将捕捉到的光源信号转化为数字信号的原始数据.RAW文件是一种记录了数码相机传感器的原始信息,同时记 ...

  4. C/C++掌握技能(三)

    #include<cstdio> ][]={ //平年和闰年的每个月的天数 {,},{,},{,},{,},{,},{,},{,}, {,},{,},{,},{,},{,},{,} }; ...

  5. tomcat 启动 证书异常java.io.IOException: Alias name [cas] does not identify a key entry

    在搭建CAS server的过程中,Tomcat开启https,配置秘钥证书,证书是通过keytool生成的 <Connector port=" protocol="org. ...

  6. MySQL笔记(4)---表

    1.前言 上一章记录了MySQL中的一些文件组成,以及相关作用和参数配置,本章开始记录深层次的存储结构,以便更好理解MySQL的设计. 2.索引组织表 InnoDB中,表都是根据主键顺序组织存放的,这 ...

  7. django中url,静态文件,POST请求的配置 分类: Python 2015-06-01 17:00 789人阅读 评论(0) 收藏

    平时使用的是pycharm,所以这篇文章主要也是使用pycharm默认创建的django项目为基础进行讲解.项目目录如下图: 1.URL的配置 当创建好项目后,运行项目就可以看到django默认的页面 ...

  8. 业余实现一个统计A股数据工具

    自己瞎捣鼓了几天 python,数据来源新浪财经,每天收盘启动爬虫抓取一遍,web 端呈现日线与周线数据:实时图表显示上证指数与个股指数等.技术点:scrapy apscheduler sqlalch ...

  9. Redis 缓存服务配置与使用

    缓存服务器Couchbase另外一种选择Redis documentation http://redis.io/documentation http://redis.cn/documentation. ...

  10. spring@Transactional注解事务不回滚不起作用无效的问题处理

    这几天在项目里面发现我使用@Transactional注解事务之后,抛了异常居然不回滚.后来终于找到了原因. 如果你也出现了这种情况,可以从下面开始排查. 一.特性先来了解一下@Transaction ...