Java集合框架之Set接口浅析
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 中所有元素的数组。 |
|
|
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接口浅析的更多相关文章
- Java集合框架之Map接口浅析
Java集合框架之Map接口浅析 一.Map接口综述: 1.1java.util.Map<k, v>简介 位于java.util包下的Map接口,是Java集合框架的重要成员,它是和Col ...
- Java集合框架之List接口浅析
Java集合框架之List接口浅析 一.List综述: 毫无疑问List接口位于java.util包下,继承自 Collection接口 存储元素的特点: 有序可重复(有序:即存进去是什么顺序,取出来 ...
- Java集合框架之Collection接口
Java是一门面向对象的语言,那么我们写程序的时候最经常操作的便是对象了,为此,Java提供了一些专门用来处理对象的类库,这些类库的集合我们称之为集合框架.Java集合工具包位于Java.util包下 ...
- java 集合框架(二)Iterable接口
Iterable接口是java 集合框架的顶级接口,实现此接口使集合对象可以通过迭代器遍历自身元素,我们可以看下它的成员方法 修饰符和返回值 方法名 描述 Iterator<T> iter ...
- Java集合框架之四大接口、常用实现类
Java集合框架 <Java集合框架的四大接口> Collection:存储无序的.不唯一的数据:其下有List和Set两大接口. List:存储有序的.不唯一的数据: Set:存储无序的 ...
- Java集合框架中Map接口的使用
在我们常用的Java集合框架接口中,除了前面说过的Collection接口以及他的根接口List接口和Set接口的使用,Map接口也是一个经常使用的接口,和Collection接口不同,Map接口并不 ...
- Java集合框架中List接口的简单使用
Java集合框架可以简单的理解为一种放置对象的容器,和数学中的集合概念类似,Java中的集合可以存放一系列对象的引用,也可以看做是数组的提升,Java集合类是一种工具类,只有相同类型的对象引用才可以放 ...
- Java集合框架的基础接口有哪些?
Collection为集合层级的根接口.一个集合代表一组对象,这些对象即为它的元素.Java平台不提供这个接口任何直接的实现. Set是一个不能包含重复元素的集合.这个接口对数学集合抽象进行建模,被用 ...
- java集合框架部分相关接口与类的介绍
集合基础 接口 Iterable //Implementing this interface allows an object to be the target of the "for-ea ...
随机推荐
- spring boot入门篇
Spring Boot[快速入门] Spring Boot 概述 Build Anything with Spring Boot:Spring Boot is the starting point ...
- linux下的FTP安装及调优
前言: 在之前交换平台的开发中,FTP的各种操作算是核心功能点. 在FTP的开发中,遇到了不少坑. 如FTP需要设置被动模式,否则10M以上的包可能会上传失败. 如FTP需要设置囚牢模式,否则访问的文 ...
- .net持续集成sonarqube篇之 sonarqube集成单元测试
系列目录 通过前面章节我们可以看到,不论怎么构建,单元测试覆盖率一栏总是0% 这是因为单元测试覆盖率报告需要额外集成.这一节我们就讲解如何在sonarqube里集成单元测试覆盖率报告. 这里需要借助O ...
- javascript+jQuery补充
一.jQuery事件绑定 <div class='c1'> <div> <div class='title'>菜单一</div> <div cla ...
- Linq查找最大值max最小值min效率比较
对linq查找极值的几种方法做一个效率上的比较 // 首先创建了一个10_000_000大小的PointF列表 var rdn = new Random(); var points = Enumera ...
- Handler 使用详解
极力推荐文章:欢迎收藏 Android 干货分享 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以 ...
- .lib .dll 区别介绍、使用(dll的两种引入方式)
.lib .dll文件都是程序可直接引用的文件,前者就是所谓的库文件,后者是动态链接库(Dynamic Link Library)也是一个库文件.而.pdb则可以理解为符号表文件.DLL(Dynami ...
- 一文读懂tomcat组件--一个web服务器的架构演化史
1. tomcat是谁? 2. tomcat可以做什么? tomcat是一个web容器,可以将web应用部署到tomcat,由它提供web服务,一个web容器中可以部署多个web应用,这些we ...
- Django:在OS X环境下连接MySQL数据库
正常的安装只需要执行以下2条命令: $ brew install mysql-connector-c $ pip3 install mysqlclient 但在执行 pip3 install mysq ...
- CSS等分布局方法
原文链接:http://caibaojian.com/css-equal-layout.html CSS等比例划分,在CSS布局中是比较重要的,下面分享几种常用方法和探讨一下兼容性. 一:浮动布局+百 ...