概述:

1.Set不允许重复数据,判断重复标准:equals方法

2.HashSet

1.无序(序号的序),允许存在null

2.hashCode值决定它在HashSet中的位置,通过hashCode值算出存储位置

3.判断重复标准:equals方法 和 hashCode方法 同时相等

a.如果equals相同,hashCode不同,两个相同值的对象存在不同的位置(原因见第二点)

b.如果hashCode相同,equals不同,采用链式结构将2个对象存在同一位置(桶的概念,bucket),这会导致性能下降

4.两个概念初始容量 和 加载因子(hashSet尚未爆仓(只需达到初始容量*加载因子,即16*0.75),系统会动态扩大容量)

5.没有实现线程同步 如果需要同步操作(多线程安全)请使用

Set s = Collections.synchronizedSet(new HashSet(...));

6.迭代过程中必须使用迭代器自身的remove方法删除数据,否则会出异常

3.LinkedHashSet

1.他是HashSet子类。

2.它以链表的方式维护元素的次序,所以它会按照添加顺序访问集合中的对象。

3.顺序遍历的时候性能比HashSet好,但是其他涉及到元素位置变化的操作性能就不如HashSet了。(数据结构知识)

4.虽然它有一定的访问顺序,但是它和List还是有区别的,最明显的一点:它仍然不能有重复对象。

4.TreeSet

1.SortedSet接口的实现类,它保持了排序状态。

2.方法:第一个、前一个、后一个、最后一个、范围截取、小于某元素、大于或者等于某元素

3.采用红黑树的数据结构来存储数据

4.支持2种排序方式:自然排序 和 定制排序

1.自然排序

a.调用Comparable接口的compareTo方法进行比较

由于需要排序,进入TreeSet的对象需要是同一个类的实例,否则在比较的时候会出现类转化异常。

2.定制排序

实现Comparator接口(见例子)

5.如果碰到不能排序的对象加入到TreeSet中 会出现异常(见例子)

5.EnumSet

1.性能相对不错的 枚举Set

2.不多讲,有兴趣可以看看api

6.HashSet、TreeSet、EnumSet都是线程不安全的

PS:

1.Set不仅仅如此,这里只做基本的阐述,更加详细的请参见 JAVA API

2.初学者挑能看懂的看吧,基础的操作其实还是比较简单的

package com.cxy.collection;import java.util.Comparator;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.TreeSet;/*** @author cxy*/
public class SetTest
{public static void main(String[] args){Set s = new HashSet();s.add(null);s.add(new A());s.add(new A());//由于2个A对象的hashCode返回的都是1,并且equals方法返回的是true,所以这两个对象只能存在1个s.add(new B());s.add(new B());//B对象的equals方法返回的永远是false,所以这两个B对象都能留下s.add(new C());s.add(new C());//2个C对象hashCode返回的都是2,并且equals方法返回的是true,并且hashCode没有和以往对象相等的,所以留住1个C对象System.out.println(s); //通过打印结果可以看出 HashSet无序性。LinkedHashSet<String> lhs = new LinkedHashSet<String>();lhs.add("world");lhs.add("said");lhs.add("hello");System.out.println(lhs);  //按照加入顺序打印TreeSet ts=new TreeSet();ts.add(100);ts.add(64);ts.add(-100);ts.add(0);System.out.println(ts);  //发现打印出来的已然是有序状态System.out.println("第一个:"+ts.first()); System.out.println("最后一个:"+ts.last()); System.out.println("小于64的最大元素(64前面的):"+ts.lower(64));  System.out.println("大于0的最小元素(0后面的):"+ts.higher(0));  System.out.println("0~100之间的:"+ts.subSet(0, 100));  //半闭半开区间System.out.println("小于64的集合"+ts.headSet(64));System.out.println("大于或者等于0的集合"+ts.tailSet(0));try{TreeSet errorSet=new TreeSet();errorSet.add(new error());errorSet.add(new error());}catch(Exception e){System.out.println("由于error类没有实现Comparable接口的compareTo方法,所以这里出现类型转换的异常");}try{TreeSet errorSet1=new TreeSet();errorSet1.add(123);errorSet1.add("asd");}catch(Exception e){System.out.println("不同类实例的比较 会出类转换异常");}//一个定制排序的setTreeSet myStyleSet=new TreeSet(new Comparator(){@Overridepublic int compare(Object o1, Object o2){return 0;  //一个永远平等的集合~ 你懂的~}});  }
}class A
{@Overridepublic int hashCode(){return 1;}@Overridepublic boolean equals(Object obj){return true;}
}class B
{@Overridepublic int hashCode(){return 1;}@Overridepublic boolean equals(Object obj){return false;}
}class C
{@Overridepublic int hashCode(){return 2;}@Overridepublic boolean equals(Object obj){return true;}
}//一个没有实现比较的类
class error
{}

相关文章连接:

《JAVA基础 之 Collection》

《JAVA基础 之 List》

声明:

1.原创文章,转载请标明并加本文连接。

2.更详尽的API请参见  http://docs.oracle.com/javase/7/docs/api/

3.文章反映个人愚见,如有异议欢迎讨论指正

【CXY】JAVA基础 之 Set相关推荐

  1. 【CXY】JAVA基础 之 异常概述

    概述: 1.异常给初学者的感觉(笔者当时就是这个感觉,不知道其他人是否有共鸣?) 1.异常是个什么东西?理解不了 2.很复杂 3.异常很"简陋",没什么用 4.我保证我写的程序正确 ...

  2. 【CXY】JAVA基础 之 异常

    讲述: 1.五个关键字 1.try:尝试捕获异常,具体的下面讲述 2.catch:当try捕获到异常了,系统会自动生成一个异常信息,这个异常信息就给catch,形象的说我抓住了这个异常. 3.thro ...

  3. 【CXY】JAVA基础 之 Collections

    概述: 1.Collections(注意不是Collection,而是Collections,多了一个s) 2.它是一个集合工具类 3.方法分类:常规操作(查找,最大,最小等).排序.线程安全(同步) ...

  4. 【CXY】JAVA基础 之 Map

    概述: 1.键值对,key-value,具有映射关系的数据 2.Map的key不允许重复,value可以重复 3.Map里的key类似一个Set,甚至可以通过map.keySet()拿到key的Set ...

  5. 【CXY】JAVA基础 之 List

    概述: 1.有序的(序号(索引)的序,不是顺序的序,相对Set对比产生的说法),可重复集合 2.List是Collection的子接口,所以List可以使用Collection全部方法.(见本人博客相 ...

  6. 【CXY】JAVA基础 之 Collection

    概述: 1.Collection java集合框架的根级接口(root interface) 2.常用子接口:List.Set.Queue,注意map是自成体系的 3.方法:新增.包含.遍历.交集.判 ...

  7. 第一阶段:Java基础总复习一一一和一一一面向对象OOP总复习

    一.Java基础 0.Maven的介绍: 官网:https://maven.apache.org/download.cgi (1)Maven是什么? Maven 是 Apache 开源组织奉献的一个开 ...

  8. Java基础入门语法和安装

    1. Java概述 1.1 Java语言背景介绍(了解) 语言:人与人交流沟通的表达方式 计算机语言:人与计算机之间进行信息交流沟通的一种特殊语言 Java语言是美国Sun公司(Stanford Un ...

  9. Java笔记整理-02.Java基础语法

    1,标识符 由英文字母.数字._(下划线)和$组成,长度不限.其中英文字母包含大写字母(A-Z)和小写字母(a-z),数字包含0到9. 标识符的第一个字符不能是数字(即标识符不能以数字开头). 标识符 ...

最新文章

  1. CentOS Linux搭建SVN服务器
  2. 【干货】eval函数用法解释及对开发者的便利讲解
  3. ssl1597-石子合并问题【区间dp练习】
  4. JS计算本周一和本周五的日期
  5. AcWing1069.凸多边形的划分(区间DP)题解
  6. python:for循环修改list的值,应使用range
  7. oracle去重复值查询,Oracle 重复数据查询以及删除
  8. Html 返回顶部代码及注释说明
  9. 世界各个国家及其国家代码
  10. 单片机流水灯工作原理
  11. 大数据应用场景有哪些?一篇文章告诉你
  12. 虚幻引擎4学习途径汇总
  13. IDEA中 单元测试@Test的使用
  14. 展锐Camera open failure log解析程序
  15. Unity中使用插件在地形中制作道路
  16. Chapter17: Artificial Intelligenc-Enabled De Novo Design of Novel Compounds that Are Synthesizable
  17. 港科百创 | 未磁科技完成超亿元A轮融资,获国内首张原子磁力计心磁图仪注册证...
  18. python语言实现冒泡算法(附代码)
  19. Linux上搭建Magento电子商务网站
  20. 金立创始人刘立荣:从南下淘金到身价15亿

热门文章

  1. Diffusion models代码解读:入门与实战
  2. 物联网之MQTT3.1.1和MQTT5协议 (4) PUBLISH报文
  3. 玩转华为数据中心交换机系列 | 汇总
  4. Greenplum 添加mirror步骤
  5. element-plus 兼容低版本浏览器问题(uc内核 55)
  6. 项目1:基于Java API文档制作的搜索引擎
  7. 【python】python制作 连连看 游戏脚本(一)
  8. 熟练运用计算机软件英语,计算机软件英语论文
  9. 检查linux中nginx是否已安装成功,linux服务下安装nginx 系统版本Ubuntu 18.04.4
  10. 重新安装opencv,踩坑。