2.Set使用场景
  API介绍:
    java.util.Set接口和java.util.List接口一样,同样继承自Collection接口,
  它与Collection接口中的方法基本一致,并没有对Collection接口进行功能上的扩充,
  只是比Collection接口更加严格了。与List接口不同的是,Set接口中元素无序,
  并且都会以某种规则保证存入的元素不出现重复。Set集合有多个子类,
  这里我们介绍其中的
  java.util.HashSet、
  java.util.LinkedHashSet这两个集合。

特点:都会以某种规则保证存入的元素不出现重复,Set接口中元素无序
  ①元素不出现重复
  ②元素无序( 指 存取 无序)

哈希表:只要往哈希表中存储自定义对象,那么该自定义对象 所属的类 必须重写hashCode&equals方法
  ⑴HashSet集合
  底层是通过HashMap实现的 底层new HashMap对象 ,只用了 key 并没有使用 value value指向统一地址 new Object()
API介绍:

    java.util.HashSet是Set接口的一个实现类,它所存储的元素是不可重复的,
  并且元素都是无序的(即存取顺序不一致)。java.util.HashSet底层的实现其实
  是一个java.util.HashMap支持,HashSet是根据对象的哈希值来确定元素在集合中的存储位置,
  因此具有良好的存取和查找性能。保证元素唯一性的方式依赖于:hashCode与equals方法。

特点:
  ①元素不重复
  ②存取顺序不一致
  ③良好的存取和查找性能
  ④元素唯一性的方式依赖于:hashCode与equals方法

HashSet集合存储数据的结构(哈希表):

  在JDK1.8之前,哈希表底层采用数组+链表实现,即使用链表处理冲突,
同一hash值的链表都存储在一个链表里。但是当位于一个桶中的元素较多,
即hash值相等的元素较多时,通过key值依次查找的效率较低。
而JDK1.8中,哈希表存储采用数组+链表+红黑树实现,
当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。

  总而言之,JDK1.8引入红黑树大程度优化了HashMap的性能,
那么对于我们来讲保证HashSet集合元素的唯一,其实就是根据对象的
hashCode和equals方法来决定的。如果我们往集合中存放自定义的对象,
那么保证其唯一,就必须复写hashCode和equals方法建立属于当前对象的比较方式。

总结:1.8之前是通过 哈希表底层采用数组+链表实现
    1.8中是通过  哈希表存储采用数组+链表+红黑树实现(链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间)
  保证元素其唯一,必须重写hashCode和equals方法建立属于当前对象的比较方式

HashSet存储自定义类型元素(重点):
  给HashSet中存放自定义类型元素时,需要重写对象中的hashCode和equals方法,
建立自己的比较方式,才能保证HashSet集合中的对象唯一

⑵LinkedHashSet
  HashSet保证元素唯一,可是元素存放进去是没有顺序的,那么我们要保证有序,怎么办呢
在HashSet下面有一个子类java.util.LinkedHashSet,它是 链表和哈希表 组合的一个数据存储结构。

Java之Set的使用场景的更多相关文章

  1. Java 常用List集合使用场景分析

    Java 常用List集合使用场景分析 过年前的最后一篇,本章通过介绍ArrayList,LinkedList,Vector,CopyOnWriteArrayList 底层实现原理和四个集合的区别.让 ...

  2. 简单模拟Java中反射的应用场景

    有人说Java是一门静态语言.那么何为静态语言,动态语言又是什么? 1.动态语言 是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至代码可以 被引进,已有的函数可以被删除或是其他结构上的变化 ...

  3. 八大排序算法详解(动图演示 思路分析 实例代码java 复杂度分析 适用场景)

    一.分类 1.内部排序和外部排序 内部排序:待排序记录存放在计算机随机存储器中(说简单点,就是内存)进行的排序过程. 外部排序:待排序记录的数量很大,以致于内存不能一次容纳全部记录,所以在排序过程中需 ...

  4. Java之Map的使用场景

    总结之 Map接口 的使用场景(day04) Map: Map中的集合,元素是成对存在的(理解为夫妻).每个元素由键与值两部分组成,通过键可以找对所对应的值 Map中的集合不能包含重复的键,值可以重复 ...

  5. Java设计模式六大原则之场景应用分析

    定义:不要存在多于一个导致类变更的原因. 通俗的说.即一个类仅仅负责一项职责. 问题由来:类T负责两个不同的职责:职责P1,职责P2.当由于职责P1需求发生改变而须要改动类T时,有可能会导致原本执行正 ...

  6. Java反射机制的适用场景及其利与弊 ***

    一.反射的适用场景是什么? 1).Java的反射机制在做基础框架的时候非常有用,有一句话这么说来着:反射机制是很多Java框架的基石.而一般应用层面很少用,不过这种东西,现在很多开源框架基本都已经给你 ...

  7. Java中应用多线程的场景?

    最典型的应用比如tomcat,tomcat内部采用的就是多线程,上百个客户端访问同一个web应用,tomcat接入后都是把后续的处理扔给一个新的线程来处理,这个新的线程最后调用到我们的servlet程 ...

  8. Java基础学习总结(75)——Java反射机制及应用场景

    什么是Java反射机制? JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的以及动态调用对象的方法的功能称为 ...

  9. 长篇图解java反射机制及其应用场景

    一.什么是java反射? 在java的面向对象编程过程中,通常我们需要先知道一个Class类,然后new 类名()方式来获取该类的对象.也就是说我们需要在写代码的时候(编译期或者编译期之前)就知道我们 ...

随机推荐

  1. HDU 1978 How many ways(经典记忆化搜索)

    S - How many ways Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  2. nginx rewrite flag

    1.break可以理解为switch中的break,而last可以理解为continue,一个是跳出server{}的匹配规则,一个还将继续匹配之后的规则. 无论使用last还是break,浏览器上面 ...

  3. (转)postfix疯狂外发垃圾邮件之分析与解决

    从进程中看到,好像是postfix有问题.我这postfix主要是用来给程序发达邮件用的,如报警,程序外发邮件等.平时postfix进程不会像现在这样异常,这在postf主进程CPU占用高,其它的相关 ...

  4. php初进一个项目组,使用几个函数帮忙熟悉流程

    初进一个项目组的时候,可能对他的框架啊神马不熟悉的.有时候类里又有各种魔术方法的使用,IDE还跳转不过去对象的方法.这时候很多php内置函数就可以帮上些忙了. 1. instanceof 2. get ...

  5. 林帆:Docker运行GUI软件的方法

    继上周的“Kubernetes v1.0特性解析”分享之后,本周我们邀请到ThoughtWorks咨询师林帆为大家带来主题为“Docker运行GUI软件的方法”的分享. 嘉宾简介:林帆,Thought ...

  6. 20155218《网络对抗》Exp3 免杀原理与实践

    20155218<网络对抗>Exp3 免杀原理与实践 一.使用msf生成后门程序的检测 (1)将上周msf生成的后门文件放在virscan.org中进行扫描,截图如下: (2)使用msf时 ...

  7. mfc CAnimateCtrl

    知识点: CAnimateCtrl成员函数 播放avi动画 一. CAnimateCtrl成员函数 Autoplay; CAnimateCtrl ::成员函数 Open 打开avi视频 Play 播放 ...

  8. ElasticSearch查询 第一篇:搜索API

    <ElasticSearch查询>目录导航: ElasticSearch查询 第一篇:搜索API ElasticSearch查询 第二篇:文档更新 ElasticSearch查询 第三篇: ...

  9. Markdown 入门指南

    导语: Markdown是一种轻量级的标记语言,语法简单,学习成本不算太高,但确实可以让你专注于文字,不用太分心与排版等等. Markdown 官方文档 这里可以看到官方的Markdown语法规则: ...

  10. DokuWiki 使用

    新建文件夹 修改url, 将新文件夹的名称赋值给url上的id, 如要建一个"DokuWiki"的文件夹,并在文件夹下新增一个"QuickStart"的页面,改 ...