五、集合——3-Set集合
3-Set集合
Set集合与Collection集合基本相同,没有提供额外的方法。
Set集合中不许包含相同的元素,如果试图把两个相同的元素添加到同一个Set中,添加操作会失败add()方法将返回false,新元素也不会被添加。(适用于HashSet、LinkedHashSet、TreeSet)
1.HashSet
(1)HashSet按照哈希算法存储集合中的元素,具有很好的存取和查找性能;
(2)HashSet的特征:
1)不保证元素的排列顺序,可能和添加顺序不同,顺序也可能发生改变;
2)HashSet不是同步的,当多个线程访问同一个HashSet时,必须通过代码保证其同步;
3)集合元素值可以为null;
(3)HashSet判断两个元素是否相同的标准:
①元素通过equals()方法返回true;
②元素的hashCode()方法的返回值相同;
(4)当把对象放入HashSet中时,如果需要重写该对象对应类的equals()方法,那么也应该重写其hashCode()方法,其规则是:当两个对象通过equals()方法比较返回true时,两个对象的hashCode()方法的返回值也相同;
(5)当程序把可变对象添加到HashSet集合中时,尽量不要去修改该集合元素中参与计算hashCode()、equals()的实例变量,否则将会导致HashSet无法正确操作集合元素。
2.LinkedHashSet
(1)LinkedHashSet是HashSet的子类;
(2)LinkedHashSet同样根据hashcode值来确定元素的存储位置,同时也是用链表来维护元素的次序;
(3)由于LinkedHashSet是用了链表来维护元素次序,所以元素的顺序与元素添加时的顺序是一致的,但是LinkedHashSet同样不能够存放相同的元素。
3.TreeSet
(1)TreeSet是SortedSet接口的实现类,TreeSet可以确保元素处于有序的状态(这里的有序状态是指按照一定的规则对元素进行排序);
(2)TreeSet的通用方法:
import java.util.TreeSet;//TreeSet的通用方法 public class TreeSetTest {public static void main(String[] args) {TreeSet nums = new TreeSet();//看似是放入了基本类型的元素,但实际上这里有一个自动装箱的过程//在集合中实际的元素是Integernums.add(1);nums.add(5);nums.add(3);nums.add(2);nums.add(6);//输出元素System.out.println(nums); //已完成排序//输出集合第一个元素 System.out.println(nums.first());//输出集合的最后一个元素 System.out.println(nums.last());//返回小于4的子集System.out.println(nums.headSet(4));//返回大于5的子集System.out.println(nums.tailSet(5));//返回大于等于3小于5的子集System.out.println(nums.subSet(3, 5));} }
(3)自然排序
1)自然排序,就是TreeSet调用集合元素的compareTo(Object obj)方法来比较元素之间的大小,然后将元素按照升序排列;
2)Comparable接口:
该接口中定义了一个compareTo(Object obj)方法,该方法返回一个整数值,实现了该接口的类对象就可以比较大小,obj1.compareTo(obj2):
当返回值为0,obj1和obj2相等
当返回值为正整数,obj1>obj2
当返回值为负整数,obj1<obj2
3)已经实现了Comparable接口的常用类:
①基本数据类型的包装类;
②String;
③Date、Time;
4)向TreeSet中添加的元素必须实现Comparable接口(当只有一个元素时,可以不用,但这没有任何意义);
5)TreeSet若要正常工作需要存放同一个类型的元素;
6)TreeSet判断两个元素是否相等:compareTo()方法的返回值是否为0,为0则相同;
7)当需要把一个对象放入TreeSet中,重写该对象对应类的equals()方法时,应该保证此方法与compareTo()方法有一致的结果;
8)尽量不要修改放入TreeSet集合中的可变对象元素;
9)自然排序的使用:
Student类:
//需要放入TreeSet中,所以应该实现Comparable接口 public class Student implements Comparable{private String name;private int age;public Student(){}public Student(String name,int age){this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}//实现Comparable接口必须实现compareTo()方法 @Overridepublic int compareTo(Object o) {// TODO Auto-generated method stubStudent stu = (Student) o;//return 0 this=stu//return>0 this>stu//return<0 this<stureturn this.age - stu.age;}//重写toString方法 @Overridepublic String toString() {// TODO Auto-generated method stubreturn "["+this.name+"]";} }
CompareToTest类:
import java.util.TreeSet;public class CompareToTest {public static void main(String[] args) {TreeSet set = new TreeSet();Student a = new Student("A",18);Student b = new Student("B",13);Student c = new Student("C",15);Student d = new Student("D",11);//添加元素 set.add(a);set.add(b);set.add(c);set.add(d);System.out.println(set);} }
(4)定制排序
1)自定义的排序方式,如降序排序等,通过接口Comparator接口实现;
2)在Comparator接口中包含一个compare(T o1,T o2)方法,它的返回值是一个int:
当返回值为0时,o1=o2;
当返回值大于0时,o1>o2;
当返回值小于0时,o1<o2;
3)使用定制排序仍然需要保证TreeSet中为同一类型的元素;
4)定制排序的使用:
import java.util.Comparator; import java.util.TreeSet;public class ComparatorTest {public static void main(String[] args) {//使用定制排序//需要使用Comparator接口//并与TreeSet建立关联TreeSet set = new TreeSet(new Comparator(){@Overridepublic int compare(Object o1, Object o2) {// TODO Auto-generated method stubStudent stu1 = (Student)o1;Student stu2 = (Student)o2;return stu1.getAge()>stu2.getAge()?-1:stu1.getAge()<stu2.getAge()?1:0;}});} }
4.EnumSet
(1)EnumSet是一个专门为枚举类设计的集合类,在EnumSet中所有元素必须是指定枚举类型的枚举值,该枚举类型在创建EnumSet时显式或隐式的指定;
(2)EnumSet集合也是有序的,以枚举值在Enum类内部的定义顺序来决定集合元素的顺序;
(3)EnumSet不允许添加null元素,但是可以判断是否含有null,也可以视图删除null;
(4)使用EnumSet保存枚举类的多个枚举值:
import java.util.EnumSet;enum Season{SPRING,SUMMER,FALL,WINTER } public class EnumSetTest1 {public static void main(String[] args) {//创建一个EnumSet,集合元素是Enum类Season的全部枚举值EnumSet es1 = EnumSet.allOf(Season.class);System.out.println(es1);//创建一个EnumSet空集合,指定集合元素为Season类的枚举值EnumSet es2 = EnumSet.noneOf(Season.class);System.out.println(es2);//为es2添加元素//集合中的顺序为枚举值的顺序 es2.add(Season.FALL);es2.add(Season.SUMMER);System.out.println(es2);//以指定枚举值创建EnumSet集合EnumSet es3 = EnumSet.of(Season.FALL,Season.SUMMER);System.out.println(es3);} }
(5)EnumSet的其他用法:
import java.util.Collection; import java.util.EnumSet; import java.util.HashSet; enum Season2{SPRING,SUMMER,FALL,WINTER } public class EnumSetTest2 {public static void main(String[] args) {Collection set = new HashSet();set.clear();set.add(Season2.FALL);set.add(Season2.SPRING);set.add(Season2.WINTER);System.out.println(set);//复制Collection中的所有元素来创建EnumSet集合EnumSet es = EnumSet.copyOf(set);System.out.println(es);} }
5.Set各实现类的性能分析
(1)HashSet的性能比TreeSet的性能要好,因为TreeSet使用红黑树算法维持元素的顺序,在需要保持排序方式的Set时才选用TreeSet;
(2)遍历LinkedHashSet的性能要优于遍历HashSet的性能;
(3)EnumSet是所有Set中性能最好的,但它只能保存同一个枚举类的枚举值作为元素;
(4)所有的Set集合都是非线程安全的,当需要有多个线程同时访问同一个Set时,需要手动实现Set集合的线程同步,可以使用工具类Collections的synchronizedSet方法来包装该Set集合,例如:
SrotedSet s = Collections.synchronizedSet(new TreeSet());
转载于:https://www.cnblogs.com/ljiwej/p/7275756.html
五、集合——3-Set集合相关推荐
- redis源码剖析(五)—— 字符串,列表,哈希,集合,有序集合
文章目录 对象 REDIS_STRING (字符串) REDIS_LIST 列表 REDIS_SET (集合) REDIS_ZSET (有序集合) REDIS_HASH (hash表) int ref ...
- python核心编程五——映像和集合
1.字典 不同意一个键相应多个值:当有键发生冲突(即.字典键反复赋值),取最后(近期)的赋值. >>> dict1 = {' foo':789, 'foo': 'xyz'} ...
- 学习Java第二十五天--集合框架之集合嵌套案例
Map集合和其它集合嵌套的案例.以及Map集合和Map集合嵌套的案例 案例1:Map和ArrayList的嵌套 案例2:Map和Map的嵌套 案例1:Map和ArrayList的嵌套 import j ...
- java集合(4)-Set集合
Set集合,类似于一个罐子,程序可以把多个对象"丢进"Set集合,而Set集合通常不能记住每个元素的添加顺序.Set集合与Collection基本相同,没有提供任何额外的方法.实际 ...
- python集合运算符_Python 集合、字典、运算符
先区分一下序列类型和散列类型: 序列类型:list.string.tuple,他们中的元素是有序的. 散列类型:set.dict,他们中的元素无序的.(注意:python3.7.0开始字典变成&quo ...
- 小汤学编程之JAVA基础day11——集合框架:List/Set/Map集合、Collections集合工具类、泛型、TreeMap和TreeSet
一.集合的特点 二.继承结构图 三.List集合 1.特点 2.ArrayList类 3.LinkedList类 4.两者的对比 5.集合的遍历 四.Set集合 1.特 ...
- java set集合与List集合练习
题目:分别向Set集合一级List集合中添加"A","a","C","c","a",五个元素,观察重 ...
- 集合 (二) ----- Map集合详解
相关文章: <集合 (一) ----- 集合的基本概念与Collection集合详解> <集合 (二) ----- Map集合详解> 文章目录 Map集合详解 一.Map集合基 ...
- 小白学习java集合框架(集合Collection)
希望各位能够留下你们美丽的赞和评论谢谢,或者有好的资源帮帮小编提升实力一起努力,奥里给!! 拒绝垃圾视频:超级好的视频,建议从头开始看:https://www.bilibili.com/video/B ...
- java学习--基础知识进阶第七天--HashSet集合、HashMap集合(集合遍历)
今日内容介绍 u HashSet集合 u HashMap集合(集合遍历) 第1章 HashSet集合 1.1 Set接口的特点 Set体系的集合: A:存入集合的顺序和取出集合的顺序不一致 B ...
最新文章
- dell服务器630虚拟盘初始化,DELL服务器配置Raid的步骤
- 输入输出 scanf和*修饰符
- 深度学习与模式识别之项目整理
- python3安装后无法使用退格键的问题
- .NET Core全新路线图
- REST与Apache Camel
- php删除菜单栏,如何删除WordPress站点健康状态面板和菜单项
- ajax 请求post和get,ajax请求get和post
- ARGMAX(以及ARGMIN)的意思
- mysql滚动条不见了,11-JS处理滚动条
- 布尔运算,二进制和门电路
- 叙述计算机网络的分类与拓扑结构,计算机的网络中有线网络和无线网络最主要的区别是()。...
- 数据库阻塞---讲解设计应用程序时避免阻塞的八个准则
- 计算机专业英语2013单词翻译,计算机专业英语词汇翻译
- 抖音怎么知道自己上热门 抖音是靠md5识别视频的
- 知乎推荐育儿书籍汇总
- 【SQL】小CASE
- dhcp服务器日志文件,dhcp服务器日志查看
- 浙大计算机就业方向,浙大四大 王牌专业,毕业后工作待遇高,发展前景非常广阔...
- 中国风来袭!如何用ArcGIS制作水墨风山水画?