【CXY】JAVA基础 之 Set
概述:
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相关推荐
- 【CXY】JAVA基础 之 异常概述
概述: 1.异常给初学者的感觉(笔者当时就是这个感觉,不知道其他人是否有共鸣?) 1.异常是个什么东西?理解不了 2.很复杂 3.异常很"简陋",没什么用 4.我保证我写的程序正确 ...
- 【CXY】JAVA基础 之 异常
讲述: 1.五个关键字 1.try:尝试捕获异常,具体的下面讲述 2.catch:当try捕获到异常了,系统会自动生成一个异常信息,这个异常信息就给catch,形象的说我抓住了这个异常. 3.thro ...
- 【CXY】JAVA基础 之 Collections
概述: 1.Collections(注意不是Collection,而是Collections,多了一个s) 2.它是一个集合工具类 3.方法分类:常规操作(查找,最大,最小等).排序.线程安全(同步) ...
- 【CXY】JAVA基础 之 Map
概述: 1.键值对,key-value,具有映射关系的数据 2.Map的key不允许重复,value可以重复 3.Map里的key类似一个Set,甚至可以通过map.keySet()拿到key的Set ...
- 【CXY】JAVA基础 之 List
概述: 1.有序的(序号(索引)的序,不是顺序的序,相对Set对比产生的说法),可重复集合 2.List是Collection的子接口,所以List可以使用Collection全部方法.(见本人博客相 ...
- 【CXY】JAVA基础 之 Collection
概述: 1.Collection java集合框架的根级接口(root interface) 2.常用子接口:List.Set.Queue,注意map是自成体系的 3.方法:新增.包含.遍历.交集.判 ...
- 第一阶段:Java基础总复习一一一和一一一面向对象OOP总复习
一.Java基础 0.Maven的介绍: 官网:https://maven.apache.org/download.cgi (1)Maven是什么? Maven 是 Apache 开源组织奉献的一个开 ...
- Java基础入门语法和安装
1. Java概述 1.1 Java语言背景介绍(了解) 语言:人与人交流沟通的表达方式 计算机语言:人与计算机之间进行信息交流沟通的一种特殊语言 Java语言是美国Sun公司(Stanford Un ...
- Java笔记整理-02.Java基础语法
1,标识符 由英文字母.数字._(下划线)和$组成,长度不限.其中英文字母包含大写字母(A-Z)和小写字母(a-z),数字包含0到9. 标识符的第一个字符不能是数字(即标识符不能以数字开头). 标识符 ...
最新文章
- CentOS Linux搭建SVN服务器
- 【干货】eval函数用法解释及对开发者的便利讲解
- ssl1597-石子合并问题【区间dp练习】
- JS计算本周一和本周五的日期
- AcWing1069.凸多边形的划分(区间DP)题解
- python:for循环修改list的值,应使用range
- oracle去重复值查询,Oracle 重复数据查询以及删除
- Html 返回顶部代码及注释说明
- 世界各个国家及其国家代码
- 单片机流水灯工作原理
- 大数据应用场景有哪些?一篇文章告诉你
- 虚幻引擎4学习途径汇总
- IDEA中 单元测试@Test的使用
- 展锐Camera open failure log解析程序
- Unity中使用插件在地形中制作道路
- Chapter17: Artificial Intelligenc-Enabled De Novo Design of Novel Compounds that Are Synthesizable
- 港科百创 | 未磁科技完成超亿元A轮融资,获国内首张原子磁力计心磁图仪注册证...
- python语言实现冒泡算法(附代码)
- Linux上搭建Magento电子商务网站
- 金立创始人刘立荣:从南下淘金到身价15亿
热门文章
- Diffusion models代码解读:入门与实战
- 物联网之MQTT3.1.1和MQTT5协议 (4) PUBLISH报文
- 玩转华为数据中心交换机系列 | 汇总
- Greenplum 添加mirror步骤
- element-plus 兼容低版本浏览器问题(uc内核 55)
- 项目1:基于Java API文档制作的搜索引擎
- 【python】python制作 连连看 游戏脚本(一)
- 熟练运用计算机软件英语,计算机软件英语论文
- 检查linux中nginx是否已安装成功,linux服务下安装nginx 系统版本Ubuntu 18.04.4
- 重新安装opencv,踩坑。