Set(集合)接口

简介

同样继承自Collection接口,它与Collection接口中的方法基本一致,并没有对Collection接口进行功能上的扩充,只是比Collection接口更加严格了。

    元素是有序的,元素值唯一,不允许重复

HashSet集合

HashSet是Set接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的


当向HashSet集合中添加一个对象时,首先会调用该对象的hashCode()方法来确定元素的存储位置,然后再调用对象
的equals()方法来确保该位置没有重复元素

底层数据结构式哈希表,是通过元素的hashcode和equals来保证元素的唯一性

如果元素的hashcode值相同(有对象存在),才会判断equals是否为true(是否重复true表示重复);如果元素的hashcode的值不同(该位置没对象存在),不会调用equals,直接将该对象存入集合。

    对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法

hashSet使用 :

HashSet hs=new HashSet();
    hs.add();
    Iterator it=hs.iterator();
    while(it.hasNext) {
        it.next();

}

往HashSet集合中存入自定义对象,姓名和年龄相同为同一个人。

复写equals和hashcode方法

public boolean equals(Object obj){
   if(!(obj.instanceof Person))
          return false;
    Person p= (Person)obj;
    return this.getname().equals(p.getname())&&this.getage()==p.getage();
}
    //复写hashcode方法
    public int hashCode() {
        return name.hashcode+age*12;
    }

HashSet是根据对象的哈希值来确定元素在集合中的存储的位置,因此具有良好的存取和查找性能

HashSet类是对AbstractSet类的扩展。它创建了一个类集。该类集使用散列表进行存储,而散列表则通过使用称之为散列法的机制来存储信息。在散列中,一个关键字的信息内容被用来确定唯一的一个值,称为散列码。而散列码则被用来当作与关键字相连的数据的存储下标。

构造方法

HashSet()方法                                构造一个默认的散列集合
    HashSet(Collection c)方法             用类c中的元素初始化散列集合
    HashSet(int initialCapacity) 方法    用capacity初始化散列集合的容量
    HashSet(int initialCapacity, float fillRatio)方法     用参数初始化散列集合的容量和填充比(也称加载容量)

主要方法

public boolean add(E o)                    向集合添加指定元素
    public void clear()                              清空集合中所有元素
    public boolean contains(Object o)     判断集合是否包含指定元素
    public boolean isEmpty()                   判断集合是否还有元素。如果集合不包含任何元素,则返回true
    public Iterator iterator()                      返回对此集合中元素进行迭代的迭代器
    public boolean remove(Object o)       删除集合中的元素
    public int size()                                  返回此集合中的元素的个数
    public Object[] toArray                       将集合中的元素放到数组中,并返回该数组

TreeSet集合

TreeSet内部采用平衡二叉树来存储元素,这样的结构可以保证TreeSet集合中没有重复的元素并且可以对元素进行排序

可以对Set集合中的元素进行自然排序。

TreeSet则是以二叉树的方式来存储元素,它可以实现对集合中的元素进行排序。方便我们对其进行访问和检索

所谓二叉树就是说每个节点最多有两个子节点的有序树,每个节点及其子节点组成的树称为子树


排序方式一

    要让自定义对象是实现 Comparable接口,强制让对象具有比较性。排序时当主要条件相同时,一定要判断下次要条件。然后重写compareTo()方法

如果想要按原样顺序输出,则让compareTo()方法返回 1。

TreeSet存储自定义对象:往TreeSet集合中存储自定义对象,根据学生年龄进行排序。

public int compareTo(Object obj) {
    if(!obj instanceof Student) {
       throw new RuntimeException("不是学生");
       Student s=(Student)obj;
       if(this.age>s.age)
           return 1;
       if(this.age==s.age)
           return this.name.compareTo(s.name);
    }
    return -1;
}

排序方式二

当元素自身不具备比较性时,或者具备的比较性不是所需要的,这时就需要让集合自身具备比较性。
在集合初始化的时候,就让集合具有比较性。

定义比较器,将比较器作为参数传递给TreeSet集合的构造函数。

TreeSet存储自定义对象:往TreeSet集合中存储自定义对象,根据学生年龄进行排序。

排序方式二:定义一个类实现comparator接口,覆盖compare方法。让集合具备比较性

TreeSet ts=new TreeSet(new MyCompare());
    class MyCompare implements Comparator {
        public int compare(Object o1,Object o2) {
            Student s1=(Student)o1;
            Student s2=(Student)o2;
            int num=s1.getName().compareTo(S2.getname());
            if(num==0)
               return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
        }
    }

构造方法

TreeSet()方法                                构造一个空的树集合,其元素按升序排序
    TreeSet(Collection c)方法              用类c中的元素初始化树集合
    TreeSet(Comparator comp)方法    按照由comp指定的比较方法进行排序
    TreeSet(SortedSet ss)方法            构造了一个包含了ss元素的树集合

方法

public E first()       返回有序集合中第一个元素,即最小的那个元素

public E last()       返回有序集合中最后一个元素,即最大的那个元素

public SortedSet subSet(E fromElement,E toElement)       返回有序集合从fromElement(包括)到toElement(不包括)的元素

Java精选笔记_集合【Set(集合)接口】的更多相关文章

  1. Java精选笔记_集合概述(Collection接口、Collections工具类、Arrays工具类)

    集合概述 集合有时又称为容器,简单地说,它是一个对象,能将具有相同性质的多个元素汇聚成一个整体.集合被用于存储.获取.操纵和传输聚合的数据. 使用集合的技巧 看到Array就是数组结构,有角标,查询速 ...

  2. Java精选笔记_集合【Map(映射)接口】

    Map(映射)接口 简介 该集合存储键值对,一对一对的往里存,并且键是唯一的.要保证map集合中键的唯一性. 从Map集合中访问元素时,只要指定了Key,就能找到对应的Value. 关键字是以后用于检 ...

  3. Java精选笔记_面向对象(包、访问控制、内存机制、垃圾回收机制)

    包 包的定义与使用 专门用来存放类的,通常功能相同的类存放在相同的包中. 包的声明只能位于Java源文件的第一行 Java语言中的常用包 java.lang:包含Java语言的核心类,如String. ...

  4. Java精选笔记_集合【List(列表)接口】

    List(列表)接口 简介 List接口继承自Collection接口,是单列集合的一个重要分支,习惯性地会将实现了List接口的对象称为List集合. 元素是有序的,即元素的存入顺序和取出顺序一致, ...

  5. Java精选笔记_文件上传与下载

    文件上传与下载 如何实现文件上传 在Web应用中,由于大多数文件的上传都是通过表单的形式提交给服务器的,因此,要想在程序中实现文件上传的功能,首先得创建一个用于提交上传文件的表单页面. 为了使Serv ...

  6. Java精选笔记_国际化

    国际化 什么是国际化 指软件在开发时就应该具备支持多种语言和地区的功能,当应对不同国家和地区的用户访问,针对不同国家和地区的用户,提供相应的.符合来访者阅读习惯的页面和数据. 由于国际化interna ...

  7. Java精选笔记_自定义标签

    自定义标签 自定义标签入门 什么是自定义标签 自定义标签可以有效地将HTML代码与Java代码分离,从而使不懂Java编程的HTML设计人员也可以编写出功能强大的JSP页面 JSP规范中定义了多个用于 ...

  8. Java精选笔记_会话技术

    会话及其会话技术 会话概述 指的是一个客户端(浏览器)与Web服务器之间连续发生的一系列请求和响应过程. 会话:从浏览器开启到浏览器关闭.会话技术:用来保存在会话期间 浏览器和服务器所产生的数据. 在 ...

  9. Java精选笔记_其他IO流(ObjectInputStream、DataInputStream、PrintStream、标准输入输出流)

    其他IO流 ObjectInputStream和ObjectOutputStream 如果希望永久将对象转为字节数据写入到硬盘上,即对象序列化,可以使用ObjectOutputStream(对象输出流 ...

随机推荐

  1. Freemarker-2.3.22 Demo - No02_绑定单个参数

    package No02_绑定单个参数; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStre ...

  2. JS 计算1到1000000个自然数中有几个1的自然数?

    <script> window.onload=function(){ var   arr=[]; for(var i=1;i<1000001;i++) { var stri= i.t ...

  3. Windows下 Pycharm连接Github 教程

    Pycharm连接Github 绑定账号 1.File->Settings->Version Control->Github Settings.png 会出现github,然后在旁边 ...

  4. 广度优先遍历目录(Windows平台、C++)

    深度优先的遍历网上一大把,就是递归调用,这里就不说了,说点网上找不到的. #include <Windows.h> #include <stdint.h> #include & ...

  5. vue分享插件

    vshare 基于百度分享开发的支持VUE2.X的分享插件,为您带来更多的流量!提供多种风格按钮,代码加载更快,引入社会化流量,提升网页抓取速度等优点.github地址:https://github. ...

  6. dubbo 常见错误 通配符的匹配很全面, 但无法找到元素 'dubbo:application' java.lang.reflect.MalformedParameterizedTypeException 通配符的匹配很全面, 但无法找到元素 'dubbo:application' 的声明。 Unsupported major.minor version 52.0 (unable to l

    dubbo 常见错误 1. Caused by: java.lang.reflect.MalformedParameterizedTypeException 启动时报错,原因是dubbo 依赖 spr ...

  7. PHP并发IO编程之路

    并发IO问题一直是服务器端编程中的技术难题,从最早的同步阻塞直接Fork进程,到Worker进程池/线程池,到现在的异步IO.协程.PHP程序员因为有强大的LAMP框架,对这类底层方面的知识知之甚少, ...

  8. 专题实验 Statspack & 9大动态视图

    statspack 是一个DBA经常用的调优工具, 它的主要作用是, 针对数据库的不同时刻做快照, 然后来比对快照之前的差异和瓶颈, 快照可以是手动的也可以是自动的, 从 oracle 10g开始, ...

  9. css 3 制作水波状进度条

    效果图如下 : 代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...

  10. 【转】如何搭建IPv6测试你的APP

    IPv6的简介 IPv4 和 IPv6的区别就是 IP 地址前者是 .(dot)分割,后者是以 :(冒号)分割的(更多详细信息自行搜索). PS:在使用 IPv6 的热点时候,记得手机开 飞行模式 哦 ...