Java集合框架之Set接口浅析

一、java.util.Set接口综述:

  这里只对Set接口做一简单综述,其具体实现类的分析,朋友们可关注我后续的博文

1.1Set接口简介

  • java.util.set是Java集合框架体系中的重要成员
  • Set接口的意义是,含有相等的元素。相等由集合内元素的equals方法决定。Set继承自Collection接口,可是事实上其所含的方法和Collection接口一样。和List不同的是,Set内部实现是基于Map的,所以Set取值时不保证数据和存入的时候顺序一致,并且不允许空值,不允许重复值。
  • Set的特点,主要由其内部的Map决定的,Set就类似于Map的一个马甲
  • Set主要有2个实现方式,一个是TreeSet,另一个是HashSet
  • Set是对数学上集的抽象,Set中不包含重复的元素.如何界定是否是重复元素?Set最多可含一个null元素;对于任意的非null元素e1和e2,都满足e1.equals(e2)==false.
  • Object.hashcode()的约定:
    • 在程序的一次执行中,无论何时在同一个java对象上重复调用hashcode(),都必须一致地返回同一个整数值,并不像Object.equals()那样提供Object是否被修改了的信息,但这个整数值不必在同一个应用程序的多次运行之间保持一致.
    • 如果两个Object通过equals()判断是相等的,那么,在这两个Object上调用hashcode()必返回相同的值.
    • 如果两个Object通过equals()判断是不相等的,那么,并不要求这两个Object.hashcode()返回不同的整数值.
  • 对象的相等性
    • 引用到堆上同一个对象的两个引用是相等的。如果对两个引用调用hashCode方法,会得到相同的结果,如果对象所属的类没有覆盖Object的hashCode方法的话,hashCode会返回每个对象特有的序号(java是依据对象的内存地址计算出的此序号),所以两个不同的对象的hashCode值是不可能相等的。
    • 如果想要让两个不同的Person对象视为相等的,就必须覆盖Object继下来的hashCode方法和equals方法,因为Object  hashCode方法返回的是该对象的内存地址,所以必须重写hashCode方法,才能保证两个不同的对象具有相同的hashCode,同时也需要两个不同对象比较equals方法会返回true

1.2Set体系结构:

  从类图能够看出,AbstractSet接口继承于AbstractCollection。它是Set的抽象实现,可是其除了添加了equals和hashcode方法,其它方法均继承而来(removeall方法外)。

二、Set方法摘要:

方法摘要
 boolean add(E e)
          如果 set 中尚未存在指定的元素,则添加此元素(可选操作)。
 boolean addAll(Collection<? extends E> c)

          如果 set 中没有指定 collection 中的所有元素,则将其添加到此 set 中(可选操作)。
 void clear()

          移除此 set 中的所有元素(可选操作)。
 boolean contains(Object o)

          如果 set 包含指定的元素,则返回 true
 boolean containsAll(Collection<?> c)

          如果此 set 包含指定 collection 的所有元素,则返回 true
 boolean equals(Object o)

          比较指定对象与此 set 的相等性。
 int hashCode()

          返回 set 的哈希码值。
 boolean isEmpty()

          如果 set 不包含元素,则返回 true
 Iterator<E> iterator()

          返回在此 set 中的元素上进行迭代的迭代器。
 boolean remove(Object o)

          如果 set 中存在指定的元素,则将其移除(可选操作)。
 boolean removeAll(Collection<?> c)

          移除 set 中那些包含在指定 collection 中的元素(可选操作)。
 boolean retainAll(Collection<?> c)

          仅保留 set 中那些包含在指定 collection 中的元素(可选操作)。
 int size()

          返回 set 中的元素数(其容量)。
 Object[] toArray()

          返回一个包含 set 中所有元素的数组。
<T>
T[]
toArray(T[] a)

          返回一个包含此 set 中所有元素的数组;返回数组的运行时类型是指定数组的类型。

三、Set和List的区别:

  • Set 接口实例存储的是无序的,不重复的数据。List 接口实例存储的是有序的,可以重复的元素。

  • Set检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变 <实现类有HashSet,TreeSet>

  • List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变 <实现类有ArrayList,LinkedList,Vector>

参考:

  https://www.cnblogs.com/zfyouxi/p/5184247.html

  http://blog.csdn.net/qq_33642117/article/details/52040345

  http://www.runoob.com/java/java-collections.html

Java集合框架之Set接口浅析的更多相关文章

  1. Java集合框架之Map接口浅析

    Java集合框架之Map接口浅析 一.Map接口综述: 1.1java.util.Map<k, v>简介 位于java.util包下的Map接口,是Java集合框架的重要成员,它是和Col ...

  2. Java集合框架之List接口浅析

    Java集合框架之List接口浅析 一.List综述: 毫无疑问List接口位于java.util包下,继承自 Collection接口 存储元素的特点: 有序可重复(有序:即存进去是什么顺序,取出来 ...

  3. Java集合框架之Collection接口

    Java是一门面向对象的语言,那么我们写程序的时候最经常操作的便是对象了,为此,Java提供了一些专门用来处理对象的类库,这些类库的集合我们称之为集合框架.Java集合工具包位于Java.util包下 ...

  4. java 集合框架(二)Iterable接口

    Iterable接口是java 集合框架的顶级接口,实现此接口使集合对象可以通过迭代器遍历自身元素,我们可以看下它的成员方法 修饰符和返回值 方法名 描述 Iterator<T> iter ...

  5. Java集合框架之四大接口、常用实现类

    Java集合框架 <Java集合框架的四大接口> Collection:存储无序的.不唯一的数据:其下有List和Set两大接口. List:存储有序的.不唯一的数据: Set:存储无序的 ...

  6. Java集合框架中Map接口的使用

    在我们常用的Java集合框架接口中,除了前面说过的Collection接口以及他的根接口List接口和Set接口的使用,Map接口也是一个经常使用的接口,和Collection接口不同,Map接口并不 ...

  7. Java集合框架中List接口的简单使用

    Java集合框架可以简单的理解为一种放置对象的容器,和数学中的集合概念类似,Java中的集合可以存放一系列对象的引用,也可以看做是数组的提升,Java集合类是一种工具类,只有相同类型的对象引用才可以放 ...

  8. Java集合框架的基础接口有哪些?

    Collection为集合层级的根接口.一个集合代表一组对象,这些对象即为它的元素.Java平台不提供这个接口任何直接的实现. Set是一个不能包含重复元素的集合.这个接口对数学集合抽象进行建模,被用 ...

  9. java集合框架部分相关接口与类的介绍

    集合基础 接口 Iterable //Implementing this interface allows an object to be the target of the "for-ea ...

随机推荐

  1. PHP-2.数据库小功能

    <?php /* * <PHP数据库部分功能实现> */ $KCNUM = @$_POST['KCNUM']; //建立一个数据库连接 $conn = mysql_connect(' ...

  2. 用margin还是padding ?

    margin是用来隔开元素与元素的间距:padding是用来隔开元素与内容的间隔. margin用于布局分开元素使元素与元素互不相干:padding用于元素与内容之间的间隔,让内容(文字)与(包裹)元 ...

  3. JS制作简易的考试答题管理系统

    答题卡系统: 网站运行效果 代码区域: HTML 代码: <style type="text/css"> body { font-size: 30px; backgro ...

  4. 使用用树莓派打造远程WEB服务器

    简介:系统配置Raspberry Pi 3B + Raspbian + MySQL5.7 + Tomcat 9 + Nginx + 公网IP. 工具:Win32DiskImager .FileZill ...

  5. Kubernetes容器集群管理环境 - 完整部署(中篇)

    接着Kubernetes容器集群管理环境 - 完整部署(上篇)继续往下部署: 八.部署master节点master节点的kube-apiserver.kube-scheduler 和 kube-con ...

  6. 【有容云】PPT | 容器落地之二三事儿

    编者注: 本文为10月29日有容云联合创始人兼研发副总裁江松在 Docker Live时代线下系列-广州站中演讲的PPT,本次线下沙龙为有容云倾力打造Docker Live时代系列主题线下沙龙,每月一 ...

  7. 夯实Java基础(四)——面向对象之多态

    1.多态介绍 面向对象三大特征:封装.继承.多态.多态是Java面向对象最核心,最难以理解的内容.从一定角度来看,封装和继承几乎都是为多态而准备的. 多态就是指程序中定义的引用变量所指向的具体类型和通 ...

  8. .net开源生态,WTM与NCC

    天下大势,分久必合,合久必分.改朝换代都如花开花谢,过眼云烟,更别提开发语言的更迭了. 我们所坚持的,只是那最初的感动,那“只是在人群中多看了你一眼”的惊艳.三十年河东,三十年河西,不忘初心,方得始终 ...

  9. 万万没想到,JVM内存结构的面试题可以问的这么难?

    在我的博客中,之前有很多文章介绍过JVM内存结构,相信很多看多我文章的朋友对这部分知识都有一定的了解了. 那么,请大家尝试着回答一下以下问题: 1.JVM管理的内存结构是怎样的? 2.不同的虚拟机在实 ...

  10. 3PHP如何用PDO的连接方式方式导出mysql数据

    首先连接mysql,具体看上一篇 接下来在try{}中加入以下代码 $query="select * from 你的数据表名称"          //$query的内容给个SQL ...