集合(七) Set—HashSet,TreeSet和LinkedHashSet
四、Set
Set和List一样,也是继承Collection的接口,但Set是不包含重复元素的集合。由于先啃下Map,Set的难度将会大幅减小。因为Set基本上都是以Map为基础实现的,例如两个主要集合HashSet以HashMap为基础实现,是无序的;而TreeSet以TreeMap为基础实现,是有序的。
1.HashSet
与HashMap相同,HashSet同样允许元素为null,且是线程不安全的。构造函数就不再介绍了,倒是想展示一下它的成员域:
// HashSet是通过map(HashMap对象)保存内容的
private transient HashMap<E,Object> map; // PRESENT是向map中插入key-value对应的value
// 因为HashSet中只需要用到key,而HashMap是key-value键值对;
// 所以,向map中添加键值对时,键值对的值固定是PRESENT
private static final Object PRESENT = new Object();
可以说简单粗暴,就一个HashMap和一个Object对象。至于Object类对象就只负责填充HashMap的值,也就是说HashSet就是HashMap的键!
HashSet的不重复性:(添加不是put,而是add)
HashSet<String> hs = new HashSet();
hs.add("wu");
hs.add("Wu");
String s = new String ("wu");
hs.add(s);
StringBuffer sb= new StringBuffer("wu");
hs.add(sb.toString());
System.out.println(hs);
结果如下,其实非常好理解,HashMap的键怎么会重复呢?只会不断地覆盖,正是如此。
[wu, Wu]
HashSet的其他用法:
hs.add("yi");
hs.add("ming"); HashSet hs2 = (HashSet) hs.clone();
System.out.println(hs2); hs2.remove("Wu");
hs.retainAll(hs2); Iterator it = hs.iterator();
while (it.hasNext())
System.out.print(it.next()+" ");
System.out.println();
String [] ss = (String [])hs2.toArray(new String[0]);
for (String str:ss)
System.out.print(str+" ");
其实这些方法大部分还是Collection得方法,值得一提的是可以用foreach遍历,不过首先要用toArray()方法转为数组,但是toArray必须要有参数new String [0],因为没有参数转化的是Object []类型,而Object []类型不能强制转换为String [] 类型,因此无参数方法可能不太友好,如果非常想使用,只能对于每个数组元素取出后单独转化,即Object是可以直接强制转为String类型的,然而数组不行。
结果如下:
[wu, Wu]
[yi, ming, wu, Wu]
yi ming wu
yi ming wu
2.TreeSet
显然HashSet是无序集合,如果想要一个有序集合,就需要使用TreeSet了。TreeSet是基于TreeMap来实现的,这样一来就简单很多了。
// NavigableMap对象
private transient NavigableMap<E,Object> m; // TreeSet是通过TreeMap实现的,
// PRESENT是键-值对中的值。
private static final Object PRESENT = new Object();
与TreeMap同样的特色是可以以Comparator对象作为参数。比如我们将上面的字符串按照wu yi ming 的顺序排列:
class COM implements Comparator<String>
{
@Override
public int compare(String o1, String o2) {
if(o1.length()>o2.length())
return 1;
else if (o1.length()<o2.length())
return -1;
else
{
if(o1.compareTo(o2)>0)
return 1;
else
return -1;
} }
} public class Treeset {
public static void main(String [] args)
{
TreeSet<String> ts = new TreeSet(new COM());
ts.add("wu");
ts.add("yi");
ts.add("ming");
System.out.println(ts);
}
}
首先排字符串长度,然后排首字母即可,当然这个返回值我也记不太住,看运气吧
集合(七) Set—HashSet,TreeSet和LinkedHashSet的更多相关文章
- HashSet,TreeSet和LinkedHashSet的区别
Set接口Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false.Set判断两个对象相同不是使用==运算符,而是根据equals方法.也就是说,只要两个对象用eq ...
- Set下面HashSet,TreeSet和LinkedHashSet的区别
Set接口Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false.Set判断两个对象相同不是使用==运算符,而是根据equals方法.也就是说,只要两个对象用eq ...
- HashSet,TreeSet和LinkedHashSet
Set接口 Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false. Set判断两个对象相同不是使用==运算符,而是根据equals方法.也就是说,只要两个对象用 ...
- Set集合[HashSet,TreeSet,LinkedHashSet],Map集合[HashMap,HashTable,TreeMap]
------------ Set ------------------- 有序: 根据添加元素顺序判定, 如果输出的结果和添加元素顺序是一样 无序: 根据添加元素顺序判定,如果输出的结果和添加元素的顺 ...
- Leetcode: LFU Cache && Summary of various Sets: HashSet, TreeSet, LinkedHashSet
Design and implement a data structure for Least Frequently Used (LFU) cache. It should support the f ...
- Set集合——HashSet、TreeSet、LinkedHashSet(2015年07月06日)
一.Set集合不同于List的是: Set不允许重复 Set是无序集合 Set没有下标索引,所以对Set的遍历要通过迭代器Iterator 二.HashSet 1.HashSet由一个哈希表支持,内部 ...
- Java集合概述、Set集合(HashSet类、LinkedHashSet类、TreeSet类、EnumSet类)
Java集合概述.Set集合(HashSet类.LinkedHashSet类.TreeSet类.EnumSet类) 1.Java集合概述1)数组可以保存多个对象,但数组长度不可变,一旦在初始化数组时指 ...
- Java集合详解7:HashSet,TreeSet与LinkedHashSet
今天我们来探索一下HashSet,TreeSet与LinkedHashSet的基本原理与源码实现,由于这三个set都是基于之前文章的三个map进行实现的,所以推荐大家先看一下前面有关map的文章,结合 ...
- Java集合详解7:一文搞清楚HashSet,TreeSet与LinkedHashSet的异同
<Java集合详解系列>是我在完成夯实Java基础篇的系列博客后准备开始写的新系列. 这些文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查 ...
随机推荐
- linux文本处理三剑客命令及用法
grep:文本过滤工具 功能说明: sed :字符流编辑器 功能说明: awk :
- RTSP协议概况
RTSP协议概况 简单的交互命令就能实现RTSP对接,C代表Client S代表Server 例如:C1-客户端发的第一个命令 S1-服务器响应的第一个回复 [C1]OPTIONS rtsp://10 ...
- jdk1.8 -- stream 的使用
一.stream介绍 stream 是jdk 一个加强的api操作,翻译过来就是流的意思,主要是对Collection 集合的一些操作,流一但生成就会有方向性,类似于自来水管的水流一样,不可以重复使用 ...
- Hadoop集群搭建-02安装配置Zookeeper
Hadoop集群搭建-05安装配置YARN Hadoop集群搭建-04安装配置HDFS Hadoop集群搭建-03编译安装hadoop Hadoop集群搭建-02安装配置Zookeeper Hado ...
- MYSQL---触发器简单了解
触发器 trigger 1.触发器是指事先为某张表绑定一段代码,当表中某些内容发生改变(增insert.删delete.改update)时,系统自动触发绑定的那段代码并执行.比如 一旦订单表里插入新订 ...
- 2019牛客暑期多校训练营(第二场) - B - Eddy Walker 2 - BM算法
参考于: https://www.luogu.org/problemnew/solution/P4723 shadowice1984 (太难) https://www.cnblogs.com/zhgy ...
- centos7 追加python3 + 使用pip + virtualenv
一.安装Python3的方法: 首先安装依赖包: yum -y groupinstall "Development tools" yum -y install zlib-devel ...
- isEmpty 和 isBlank 区别
isEmpty 和 isBlank 区别 org.apache.commons.lang.StringUtils 类提供了 String 的常用操作,最为常用的判空有如下两种 isEmpty(Stri ...
- C++中重载函数详解
函数的重载详解 什么时函数重载: 函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数.重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避 ...
- Autofac通过配置的方式
autofac是比较简单易用的IOC容器.下面我们展示如何通过json配置文件,来进行控制反转. 需要用到以下程序集.可以通过nugget分别安装 Microsoft.Extensions.Confi ...