四、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的更多相关文章

  1. HashSet,TreeSet和LinkedHashSet的区别

    Set接口Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false.Set判断两个对象相同不是使用==运算符,而是根据equals方法.也就是说,只要两个对象用eq ...

  2. Set下面HashSet,TreeSet和LinkedHashSet的区别

    Set接口Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false.Set判断两个对象相同不是使用==运算符,而是根据equals方法.也就是说,只要两个对象用eq ...

  3. HashSet,TreeSet和LinkedHashSet

    Set接口 Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false. Set判断两个对象相同不是使用==运算符,而是根据equals方法.也就是说,只要两个对象用 ...

  4. Set集合[HashSet,TreeSet,LinkedHashSet],Map集合[HashMap,HashTable,TreeMap]

    ------------ Set ------------------- 有序: 根据添加元素顺序判定, 如果输出的结果和添加元素顺序是一样 无序: 根据添加元素顺序判定,如果输出的结果和添加元素的顺 ...

  5. 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 ...

  6. Set集合——HashSet、TreeSet、LinkedHashSet(2015年07月06日)

    一.Set集合不同于List的是: Set不允许重复 Set是无序集合 Set没有下标索引,所以对Set的遍历要通过迭代器Iterator 二.HashSet 1.HashSet由一个哈希表支持,内部 ...

  7. Java集合概述、Set集合(HashSet类、LinkedHashSet类、TreeSet类、EnumSet类)

    Java集合概述.Set集合(HashSet类.LinkedHashSet类.TreeSet类.EnumSet类) 1.Java集合概述1)数组可以保存多个对象,但数组长度不可变,一旦在初始化数组时指 ...

  8. Java集合详解7:HashSet,TreeSet与LinkedHashSet

    今天我们来探索一下HashSet,TreeSet与LinkedHashSet的基本原理与源码实现,由于这三个set都是基于之前文章的三个map进行实现的,所以推荐大家先看一下前面有关map的文章,结合 ...

  9. Java集合详解7:一文搞清楚HashSet,TreeSet与LinkedHashSet的异同

    <Java集合详解系列>是我在完成夯实Java基础篇的系列博客后准备开始写的新系列. 这些文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查 ...

随机推荐

  1. TP5模型belongsTo和hasOne这两个方法的区别

    在使用tp5模型的ORM的时候出现belongsTo和hasOne都有表示一对一的关系,但是二者并不相同.以下举例说明两者的区别: 首先有user表 字段 id name password字段 然后有 ...

  2. P1494 小Z的袜子 【普通莫队】

    我的第二道莫队题,对莫队又有了自己的看法. 在第一题的基础上之上,觉得莫队有个很关键的地方在于 莫队所维护的值是什么,怎么推出维护的公式来. 这道题就是这样,一开始还没自己推出公式来,也有几个坑点. ...

  3. 第二周Java课堂作业

    演示一: public class EnumTest { public static void main(String[] args) { Size s=Size.SMALL; Size t=Size ...

  4. 题解 洛谷P1311 【选择客栈】

    可能这做法是最奇葩的ST表 我们枚举k,计算每种色调的客栈各有多少种方法  我们利用一种奇怪的思想:除了不可行的,剩下的都是可行的 所以我们先求出 每种颜色的客栈随机选择两个,一共有多少种结果 接着减 ...

  5. windows环境下使用C++&Socket实现文件传输

    server #include <stdio.h> #include <iostream> #include <cstring> #include <fstr ...

  6. Lazy的SDL教程 翻译----Lesson 22 Timing

    原文:http://lazyfoo.net/tutorials/SDL/22_timing/index.php Timing 计时 Last Updated 3/10/14 Another impor ...

  7. 并不对劲的bzoj4945:loj2305:uoj317:p3825[NOI2017]游戏

    题目大意 2-SAT,其中有\(d\)(\(d\leq 8\))个点是\(3-SAT\). 题解 枚举\(d\)个点不取三个中(假设三个为\(a,b,c\))的哪一个,然后整体变成做\(2-SAT\) ...

  8. the specified service is marked as deletion,can not find the file specified

    使用命令注册windows service sc create CCGSQueueService binpath= "D:\DKX4003\services\xxx.xx.xx\xxx.ex ...

  9. mac手册汉化 2019

    1.安装依赖 brew install automake brew install opencc 2.编译 wget https://github.com/man-pages-zh/manpages- ...

  10. JS基础_Unicode编码表

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...