博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Java进阶最详解】Set入门一篇看懂(一)继承关系和区别了解
阅读量:284 次
发布时间:2019-03-03

本文共 3914 字,大约阅读时间需要 13 分钟。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H2STEGW1-1598173707686)(414F98FCF91F481A94755ABE21632E46)]

文章目录

Set简介

引言: Set体系集合可以知道某物是否已近存在于集合中,不会存储重复的元素。加入Set的每个元素必须是唯一的,否则,Set是不会把它加进去的。要想加进Set,Object必须定义equals(),这样才能标明对象的唯一性。Set的接口和Collection的一摸一样。Set的接口不保证它会用哪种顺序来存储元素。

集合的出现就是为了持有对象,集合中可以存储任意类型的对象,而且长度可变

java.util包下容器的分类图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CmkFUIFO-1598173707698)(8299922027A14D05A9F45F3F71D25C59)]

  • ?Set的继承关系和区别

Set 的用法:存放的是对象的引用,没有重复对象。

Set实现了Collection接口,它有三种容器实现:HashSet,LinkedHashSet和TreeSet。Set接口相较于Collection接口,几乎没有新增的方法。这三种Set的实现,主要区别在于使用迭代器进行遍历的时候,遍历元素的顺序不同。HashSet:没有顺序LinkedHashSet:插入元素的顺序TreeSet:按照传入的comparator对元素进行排序
  • ?Set的特性有什么
1.Set集合类似于一个罐子,"丢进"Set集合里的多个对象之间没有明显的顺序。2.Set继承自Collection接口,不能包含有重复元素(记住,这是整个Set类层次的共有属性)。3.Set判断两个对象相同不是使用"=="运算符,而是根据equals方法。也就是说,我们在加入一个新元素的时候,如果这个新元素对象和Set中已有对象进行注意equals比较都返回false,则Set就会接受这个新元素对象,否则拒绝。# 注意点:因为Set的这个制约,在使用Set集合的时候,应该注意两点:1) 为Set集合里的元素的实现类实现一个有效equals(Object)方法2) 对Set的构造函数,传入的Collection参数不能包含重复的元素
  • ?为什么需要集合
# 集合为什么存在从传统意义上讲,数组是我们的一个很好的选择,前提是我们事先已经明确知道我们将要保存的对象的数量。一旦在数组初始化时指定了这个数组长度,这个数组长度就是不可变的。如果我们需要保存一个可以动态增长的数据(在编译时无法确定具体的数量),java的集合类就是一个很好的设计方案了。集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类。所以的集合类都位于java.util包下,后来为了处理多线程环境下的并发安全问题,java5还在java.util.concurrent包下提供了一些多线程支持的集合类。# 集合的分类Java容器类类库的用途是"保存对象",并将其划分为两个不同的概念:1) Collection一组"对立"的元素,通常这些元素都服从某种规则1.1) List必须保持元素特定的顺序1.2) Set不能有重复元素1.3) Queue保持一个队列(先进先出)的顺序2) Map一组成对的"键值对"对象Collection和Map的区别在于容器中每个位置保存的元素个数:2.1) Collection 每个位置只能保存一个元素(对象)2) Map保存的是"键值对",就像一个小型数据库。我们可以通过"键"找到该键对应的"值"
  • ?Set和List区别
两个接口都是继承自Collection,是常用来存放数据项的集合,主要区别如下:1.List和Set之间很重要的一个区别是是否允许重复元素的存在,在List中允许插入重复的元素,而在Set中不允许重复元素存在。2.与元素先后存放顺序有关,List是有序集合,会保留元素插入时的顺序,Set是无序集合。3.List可以通过下标来访问,而Set不能。

实现类

HashSet

HashSet类按照哈希算法来存取集合中的对象,存取速度比较快

  • ?如何实现
  • (无序,唯一):哈希表或者叫散列集(hash table)
HashSet是Set接口的典型实现,HashSet使用HASH算法来存储集合中的元素,因此具有良好的存取和查找性能。当向HashSet结合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据 hashCode值来决定该对象在HashSet中存储位置(为什么HashSet 是如何保证不重复的)。也就是说,HashSet集合判断两个元素相等的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode()方法返回值相等。不能保证元素的排列顺序,顺序有可能发生变化;集合元素可以是null,但只能放入一个null;
  • ?有什么特点
-它不允许出现重复元素;-不保证集合中元素的顺序-允许包含值为null的元素,但最多只能有一个null元素。-HashSet的实现是不同步的。

LinkedHashSet

LinkedHashSet是HashSet的子类

  • ?如何实现
  • 链表和哈希表组成 。 由链表保证元素的排序 , 由哈希表证元素的唯一性
LinkedHashSet集合同样是根据元素的hashCode值来决定元素的存储位置,但是它同时使用链表维护元素的次序。这样使得元素看起 来像是以插入顺序保存的,也就是说,当遍历该集合时候,LinkedHashSet将会以元素的添加顺序访问集合的元素。LinkedHashSet在迭代访问Set中的全部元素时,性能比HashSet好(链表很适合进行遍历),但是插入时性能稍微逊色于HashSet。
  • ?有什么特点
-LinkedHashSet是HashSet的子类-LinkedHashSet的底层使用的是LinkedHashMap-除了迭代器遍历元素的表现不同之外,它的其他方法都是复用的HashSet的方法。

TreeSet

TreeSet类实现了SortedSet接口,能够对集合中的对象进行排序——可以实现排序等功能的集合

  • ?如何实现
  • (有序,唯一):红黑树(自平衡的排序二叉树。)
TreeSet是SortedSet接口的唯一实现类,底层的数据结构是红黑树,TreeSet可以确保集合元素处于排序状态。TreeSet支持两种排序方式,自然排序 和定制排序,其中自然排序为默认的排序方式,如下示例:自然排序——自然排序使用要排序元素的CompareTo(Object obj)方法来比较元素之间大小关系,然后将元素按照升序排列。定制排序——自然排序是根据集合元素的大小,以升序排列,如果要定制排序,应该使用Comparator接口,实现 int compare(T o1,T o2)方法
  • ?有什么特点
-TreeSet描述的是Set的一种变体——可以实现排序等功能的集合它在将对象元素添加到集合中时会自动按照某种比较规则将其插入到有序的对象序列中.-HashSet是基于Hash算法实现的,其性能通常优于TreeSet,我们通常都应该使用HashSet在我们需要排序的功能时,我门才使用TreeSet

其余Set

在这里插入图片描述

SortedSet

此接口主要用于排序操作,即实现此接口的子类都属于排序的子类

EnumSet

EnumSet是一个专门为枚举类设计的集合类,EnumSet中所有元素都必须是指定枚举类型的枚举值,该枚举类型在创建EnumSet时显式、或隐式地指定。EnumSet的集合元素也是有序的,

它们以枚举值在Enum类内的定义顺序来决定集合元素的顺序


List和Set的转化

(1)因为List和Set都实现了Collection接口的addAll(Collection<? extends E> c)方法,因此可以采用addAll()方法将List和Set互相转换;

(2)另外,List和Set也提供了Collection<? extends E> c作为参数的构造函数,因此通常采用构造函数的形式完成互相转化。

//List转SetSet
set = new HashSet<>(list);//Set转ListList
list1 = new ArrayList<>(set);

具体事例

Java Set转List的2种方法

Map
map = new HashMap
(); map.put("ele1", "小樱"); map.put("ele2", "若曦"); map.put("ele3", "晴川"); Set
set = map.keySet();
  1. 通过ArrayList进行转换(Collection<? extends E> c作为参数的构造函数)
List
list1 = new ArrayList
(set); for(int i = 0; i < list1.size(); i++){ System.out.println("list1(" + i + ") --> " + list1.get(i)); }
  1. List实现类进行转换(addAll(Collection<? extends E> c)方法)
List
list2 = new ArrayList
(); list2.addAll(set); for(String elem : list2){ System.out.println(elem); }

—end

转载地址:http://wrdl.baihongyu.com/

你可能感兴趣的文章