今天主要说夏set集合,每天抽出一个小时总结下,生活会更加美好!

--< java.util >-- Set接口

  数据结构:数据的存储方式;

  Set接口中的方法和Collection中方法一致的。

|--HashSet:

  HashSet类直接实现了Set接口, 其底层其实是包装了一个HashMap去实现的。HashSet采用HashCode算法来存取集合中的元素,因此具有比较好的读取和查找性能。

   底层数据结构是哈希表,线程是不同步的无序,高效;HashSet是线程非安全的,元素值可以为NULL,但只能放入一个null

    HashSet集合保证元素唯一性:通过元素的hashCode方法,和equals方法完成的。

  HashSet需要同时通过equals和HashCode来判断两个元素是否相等,具体规则是,如果两个元素通过equals为true,并且两个元素的hashCode相等,则这两个元素相等(即重复)。

  当元素的hashCode值相同时,才继续判断元素的equals是否为true。

  如果为true,那么视为相同元素,不存。如果为false,那么存储。

  如果hashCode值不同,那么不判断equals,从而提高对象比较的速度。 

注掉HashCode方法

注掉equalse

|--LinkedHashSet:

  有序,hashset的子类。

     这个相对于HashSet来说有一个很大的不一样是LinkedHashSet是有序的。LinkedHashSet在迭代访问Set中的全部元素时,性能比HashSet好,但是插入时性能稍微逊色于HashSet。

  

    Set<String> set = new LinkedHashSet<String>();
for(int i= ;i<;i++){
set.add(i+"");
}
set.add(""); //重复数据,不会写入
set.add(null); //可以写入空数据
Iterator<String> iter = set.iterator();
while(iter.hasNext()){
System.out.println(iter.next()); //输出是有序的
}

结果如下


    null  

|--TreeSet:

  对Set集合中的元素的进行指定顺序的排序。不同步。TreeSet底层的数据结构就是二叉树。

 1.不能写入空数据

2.写入的数据是有序的。

3.不写入重复数据

  哈希表的原理:

   1,对对象元素中的关键字(对象中的特有数据),进行哈希算法的运算,并得出一个具体的算法值,这个值 称为哈希值

  2,哈希值就是这个元素的位置。

  3,如果哈希值出现冲突,再次判断这个关键字对应的对象是否相同。如果对象相同,就不存储,因为元素重复。如果对象不同,就存储,在原来对象的哈希值基础 +1顺延。

  4,存储哈希值的结构,我们称为哈希表。

  5,既然哈希表是根据哈希值存储的,为了提高效率,最好保证对象的关键字是唯一的。

  这样可以尽量少的判断关键字对应的对象是否相同,提高了哈希表的操作效率。

  对于ArrayList集合,判断元素是否存在,或者删元素底层依据都是equals方法。

  对于HashSet集合,判断元素是否存在,或者删除元素,底层依据的是hashCode方法和equals方法。  

  TreeSet:

  用于对Set集合进行元素的指定顺序排序,排序需要依据元素自身具备的比较性。

  如果元素不具备比较性,在运行时会发生ClassCastException异常。

  所以需要元素实现Comparable接口,强制让元素具备比较性,复写compareTo方法

  依据compareTo方法的返回值,确定元素在TreeSet数据结构中的位置。

  TreeSet方法保证元素唯一性的方式:就是参考比较方法的结果是否为0,如果return 0,视为两个对象重复,不存。

注意:在进行比较时,如果判断元素不唯一,比如,同姓名,同年龄,才视为同一个人。

在判断时,需要分主要条件和次要条件,当主要条件相同时,再判断次要条件,按照次要条件排序。

  TreeSet集合排序有两种方式,Comparable和Comparator区别:

  1:让元素自身具备比较性,需要元素对象实现Comparable接口,覆盖compareTo方法。

  2:让集合自身具备比较性,需要定义一个实现了Comparator接口的比较器,并覆盖compare方法,并将该类对象作为实际参数传递给TreeSet集合的构造函数。

  第二种方式较为灵活。

遍历Set

.迭代遍历:
Set<String> set = new HashSet<String>();
Iterator<String> it = set.iterator();
while (it.hasNext()) {
String str = it.next();
System.out.println(str);
} .for循环遍历:
for (String str : set) {
System.out.println(str);
}

java基础集合简介Set(三)中的更多相关文章

  1. java基础集合简介Map(三)下

    --Map接口简介 今天来看一看map集合,map映射接口,用于存放键值对,<key,value>,通过key来查找value,顾名思义key不能为空,唯一且不重复,不然底层怎么查呢! 可 ...

  2. java基础集合简介List/Vector(三)上

    集合特点: 1:对象封装数据,对象多了也需要存储.集合用于存储对象. 2:集合是可变长度的. 集合和数组的区别: 1:数组是固定长度的:集合可变长度的. 2:数组可以存储基本数据类型,也可以存储引用数 ...

  3. JAVA基础-集合(二)

    一.Map整体结构体系 Map是集合的另一大派系,与Collection派系不同的是Map集合是以键值对儿的形式存储在集合的.两个键为映射关系,其中第一个键为主键(主键是唯一的不可重复),第二个键为v ...

  4. Java基础-集合的嵌套

    Java基础-集合的嵌套 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.静态导入 静态导入是在JDK1.5后的新特性,可以减少开发的代码量,但是实际用处是很一般,静态导入的标准 ...

  5. Java基础类库简介

    Java基础类库简介 一.常用的基础类库:11个jar(Java Archive,Java归档)包 作为java语言使用者,我们可以感受到java语言带来的优势(平台无关.面向对象.多线程.高效易扩展 ...

  6. Java基础——集合框架

    Java的集合框架是Java中很重要的一环,Java平台提供了一个全新的集合框架.“集合框架”主要由一组用来操作对象的接口组成.不同接口描述一组不同数据类型.Java平台的完整集合框架如下图所示: 上 ...

  7. java基础梳理--朝花夕拾(三)

    1.了解面向对象的编程思想以及面向对象的特性: 对象: EveryThing is Object: 万物皆是对象,在程序中,我们可以将类.接口.方法.属性等都认为是对象: 面向对象: 是一种程序设计方 ...

  8. Java基础扫盲系列(三)— Java内省技术

    前言 Java内省技术属于Java基础体系的的一部分,但是很多人都不甚了解.笔者也是在学习Spring源码的过程中遇到该技术模块的.为了完善技术体系,本文将全面的学习该技术.在提到Java内省技术,就 ...

  9. java基础---集合(1)

    一. 基本概念 集合.数组都是对多个数据进行存储操作的结构,简称Java容器 数组:长度确定,类型确定,对于添加.删除.插入等操作效率不高,元素有序可重复 Java中集合框架顶层框架是:java.ut ...

随机推荐

  1. Install gitlab

    yum install -y curl policycoreutils-python openssh-server postfix wget wget https://mirrors.tuna.tsi ...

  2. 2019-9-17:基础学习,windows server 2008 r2,搭建web服务器和FTP服务器

    一.信息服务iis管理器安装 1,点击打开“服务器管理器”-->选择“角色”-->选择“添加角色”,打开“添加角色向导” 2,点击“下一步”-->勾选“web服务器(IIS)”--& ...

  3. linux bash shell编程之参数变量和流程控制。

    参数变量:用来向脚本中传递参数 我们在执行脚本的时候可以在其后面加入一些参数,通常来说这些参数与脚本中变量为对应关系. start.sh argu1 argu2 引用方式: $1,,2,……${10} ...

  4. Redis系列(四):Redis持久化和主从复制原理

    一.持久化 所谓的持久化就是把内存中的数据写到磁盘中去,防止服务宕机后内存数据丢失.Redis4.0之前提供了两种持久化方式:RDB(默认) 和AOF,Redis4.x之后新增了一种混合持久化(本文所 ...

  5. R 语言学习笔记(1)——R 工作空间与输入输出

    什么是工作空间? 工作空间(workspace)就是当前 R 的工作环境,它储存着所有用户定义的对象(objectives)包括了向量.矩阵.函数.数据框.列表等. 处理 R 文件的工作流程 #设置当 ...

  6. 学习spring和spring mvc过程中遇到的一些问题

    以下仅为个人通过网上查找资料总结的内容,如有不对的地方欢迎提出: 注解: @Controller//表明本类是一个Controller @RequestMapping(value="/dem ...

  7. 2019-2020-4 20199317《Linux内核原理与分析》第四周作业

    第3章  MenuOS的构造 1  Linux内核源代码简介        计算机的“3大法宝”:存储程序计算机.函数调用堆栈和中断. 操作系统的“两把宝剑”:一把是中断上下文的切换——保存现场和恢复 ...

  8. WebGL简易教程——目录

    目录 1. 绪论 2. 目录 3. 资源 1. 绪论 最近研究WebGL,看了<WebGL编程指南>这本书,结合自己的专业知识写的一系列教程.之前在看OpenGL/WebGL的时候总是感觉 ...

  9. Spring之junit测试集成

    简介 Spring提供spring-test-5.2.1.RELEASE.jar 可以整合junit. 优势:可以简化测试代码(不需要手动创建上下文,即手动创建spring容器) 使用spring和j ...

  10. pyecharts实现星巴克门店分布可视化分析

    项目介绍 使用pyecharts对星巴克门店分布进行可视化分析: 全球门店分布/拥有星巴克门店最多的10个国家或地区: 拥有星巴克门店最多的10个城市: 门店所有权占比: 中国地区门店分布热点图. 数 ...