set继承自collection接口,其子类和子接口如下:

set的共同特性:不能添加相同的元素,通常无法记住元素添加的顺序

1.HashSet类

判断两元素相同的标准:1.equals方法返回true,2.hashCode的值相等

将元素添加进hashSet的时候,如果重写了equals方法,那么hashcode方法也应该重写,他们应该保持一致

尽量不要修改集合元素中参与计算equals和hashcode的实例变量,否则可能导致HashSet无法正确操作这些元素,比如下面这种情况

class R {
int count;
public R(int count) {
this.count = count;
}
public String toString() {
return "R[" + count + "]";
}
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj != null && obj.getClass() == R.class) { //注意,这个实现使R对象都是equals
return true;
}
return false;
}
public int hashCode() {
return this.count;
}
} public class HashSetTest2 {
public static void main(String[] args) {
HashSet hs = new HashSet();
hs.add(new R(5));
hs.add(new R(-3));
hs.add(new R(9));
hs.add(new R(-2));
System.out.println(hs); //[R[5], R[9], R[-3], R[-2]] Iterator it = hs.iterator();
R first = (R)it.next();
first.count = -3;
System.out.println(hs); //[R[-3], R[9], R[-3], R[-2]] hs.remove(new R(-3));
System.out.println(hs);//[R[-3], R[9], R[-2]]
System.out.println(hs.contains(new R(-3))); //false
System.out.println(hs.contains(new R(5))); //true /*这样的结果可以看出
* 我们找到值为5的对象,将其值替换为-3之后,这个set中就有两个完全一样的元素了
* 删除值为-3的元素时,先通过hashCode找到了原来-3的元素,将其删除
*
* 但是结果显示hashset中并没有-3,却有5
* 因为根据我们实现的equals方法,所有R对象都是equal的
* 但是hashcode值却是根据count的值算出来的
* 第一个元素的hashcode值是根据5算出来的,所以这个元素被hashset认为与R(5)相通,与R(-3)不同。
*
* */
}
}

2.TreeSet类

此类可保证集合元素处于排序状态(红黑树实现),与HashSet相比,添加了如下方法

自然排序:

添加到TreeSet中的对象必须已经实现了Comparable接口的 compareTo方法,并且必须是同一种类型的对象

TreeSet判断两个对象是否相等的标准是:compareTo方法返回值为0则相等,否则不相等。

class Z implements Comparable {
int age;
public Z(int age) {
this.age = age;
} @Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
return true;
}
@Override
public int compareTo(Object o) {
// TODO Auto-generated method stub
return 1;
}
} /*重要:
* 在TreeSet中添加元素的时候要保证equals方法和Comparable接口的结果一致
* 否则就会出现下面的情况,尽管两个元素equal,但是TreeSet仍然认为他们两个是不同的元素
* 存的时候就成了“一个元素的两个引用”
* */
public class TreeSetTest2 {
public static void main(String[] args) {
TreeSet ts = new TreeSet();
Z z1 = new Z(6);
ts.add(z1);
System.out.println(ts.add(z1));
System.out.println(ts);
((Z)(ts.first())).age = -1;
System.out.println(((Z)(ts.last())).age);
}
}

尽量不要修改TreeSet中的可变对象中的实例变量,一旦这个变量影响了compareTo方法的返回值,该集合中的元素的顺序就会不一致

定制排序:

如果需要实现定制排序,则需要在创建TreeSet对象的时候,使一个Comparator对象与TreeSet集合关联起来。

Comparator接口中有一个 compare(T o1, T o2)方法,返回正数说明o1大于o2,负数则是小于,0就是等于。

class M
{
int age;
public M(int age)
{
this.age = age;
}
public String toString()
{
return "M[age:" + age + "]";
}
}
public class TreeSetTest4
{
public static void main(String[] args)
{
TreeSet ts = new TreeSet(new Comparator()
{
//根据M对象的age属性来决定大小
public int compare(Object o1, Object o2)
{
M m1 = (M)o1;
M m2 = (M)o2;
return m1.age > m2.age ? -1
: m1.age < m2.age ? 1 : 0;
}
});
ts.add(new M(5));
ts.add(new M(-3));
ts.add(new M(9));
System.out.println(ts);
}
}

3.EnumSet类

enum Season
{
SPRING,SUMMER,FALL,WINTER
}
public class EnumSetTest
{
public static void main(String[] args)
{
//创建一个EnumSet集合,集合元素就是Season枚举类的全部枚举值
EnumSet es1 = EnumSet.allOf(Season.class);
//输出[SPRING,SUMMER,FALL,WINTER]
System.out.println(es1);
//创建一个EnumSet空集合,指定其集合元素是Season类的枚举值。
EnumSet es2 = EnumSet.noneOf(Season.class);
//输出[]
System.out.println(es2);
//手动添加两个元素
es2.add(Season.WINTER);
es2.add(Season.SPRING);
//输出[SPRING,WINTER]
System.out.println(es2);
//以指定枚举值创建EnumSet集合
EnumSet es3 = EnumSet.of(Season.SUMMER , Season.WINTER);
//输出[SUMMER,WINTER]
System.out.println(es3);
EnumSet es4 = EnumSet.range(Season.SUMMER , Season.WINTER);
//输出[SUMMER,FALL,WINTER]
System.out.println(es4);
//新创建的EnumSet集合的元素和es4集合的元素有相同类型,
//es5的集合元素 + es4集合元素 = Season枚举类的全部枚举值
EnumSet es5 = EnumSet.complementOf(es4);
//输出[SPRING]
System.out.println(es5);
}
}

Java集合框架(set)的更多相关文章

  1. Java集合框架List,Map,Set等全面介绍

    Java集合框架的基本接口/类层次结构: java.util.Collection [I]+--java.util.List [I]   +--java.util.ArrayList [C]   +- ...

  2. Java集合框架练习-计算表达式的值

    最近在看<算法>这本书,正好看到一个计算表达式的问题,于是就打算写一下,也正好熟悉一下Java集合框架的使用,大致测试了一下,没啥问题. import java.util.*; /* * ...

  3. 【集合框架】Java集合框架综述

    一.前言 现笔者打算做关于Java集合框架的教程,具体是打算分析Java源码,因为平时在写程序的过程中用Java集合特别频繁,但是对于里面一些具体的原理还没有进行很好的梳理,所以拟从源码的角度去熟悉梳 ...

  4. Java 集合框架

    Java集合框架大致可以分为五个部分:List列表,Set集合.Map映射.迭代器.工具类 List 接口通常表示一个列表(数组.队列.链表 栈),其中的元素 可以重复 的是:ArrayList 和L ...

  5. Java集合框架之map

    Java集合框架之map. Map的主要实现类有HashMap,LinkedHashMap,TreeMap,等等.具体可参阅API文档. 其中HashMap是无序排序. LinkedHashMap是自 ...

  6. 22章、Java集合框架习题

    1.描述Java集合框架.列出接口.便利抽象类和具体类. Java集合框架支持2种容器:(1) 集合(Collection),存储元素集合 (2)图(Map),存储键值对.

  7. Java集合框架实现自定义排序

    Java集合框架针对不同的数据结构提供了多种排序的方法,虽然很多时候我们可以自己实现排序,比如数组等,但是灵活的使用JDK提供的排序方法,可以提高开发效率,而且通常JDK的实现要比自己造的轮子性能更优 ...

  8. (转)Java集合框架:HashMap

    来源:朱小厮 链接:http://blog.csdn.net/u013256816/article/details/50912762 Java集合框架概述 Java集合框架无论是在工作.学习.面试中都 ...

  9. Java集合框架

    集合框架体系如图所示 Java 集合框架提供了一套性能优良,使用方便的接口和类,java集合框架位于java.util包中, 所以当使用集合框架的时候需要进行导包. Map接口的常用方法 Map接口提 ...

  10. Java集合框架(常用类) JCF

    Java集合框架(常用类) JCF 为了实现某一目的或功能而预先设计好一系列封装好的具有继承关系或实现关系类的接口: 集合的由来: 特点:元素类型可以不同,集合长度可变,空间不固定: 管理集合类和接口 ...

随机推荐

  1. 随机生成30道四则运算-NEW

    补充:紧跟上一个随机生成30道四则运算的题目,做了一点补充,可以有真分数之间的运算,于是需要在原来的基础上做一些改进. 首先指出上一个程序中的几个不足:1.每次执行的结果都一样,所以不能每天给孩子出3 ...

  2. 智能客服 利用python运行java代码

    因为需要在linux中用python来进行分析,顾需要利用python来运行java中语音转文字和文字转语音代码 在python中运行java代码需要利用jpype

  3. 有关rand(),srand()产生随机数学习总结

    看到夏雪冬日的有关rand()和srand()产生随机数的总结,挺好的,学习了,然后又有百度其他人的成果,系统总结一下.本文转自夏雪冬日:http://www.cnblogs.com/heyongga ...

  4. lintcode-107-单词切分

    107-单词切分 给出一个字符串s和一个词典,判断字符串s是否可以被空格切分成一个或多个出现在字典中的单词. 样例 给出 s = "lintcode" dict = [" ...

  5. ansible介绍和安装

    ansible是由 Python 编写的强大的配置管理解决方案,ansible 的特点就在于它的简洁与高效率 ansible与其他的配置管理工具不同点在于:不需要你在想要配置的每个节点上安装自己的组件 ...

  6. java 基础 --final--008

    finally:被finally控制的语句一定会执行,但是如果执行之前jvm退出了,就不会执行了.比如System.exit(0);final:常见的可以修饰类(该类不能被继承) 方法(方法不能被重写 ...

  7. 第92天:CSS3中颜色和文本属性

    一.颜色的表示方式 1. rgba(255,0,0,0.1)  rgba是代表Red(红色) Green(绿色) Blue(蓝色)和 Alpha透明度.虽然它有的时候被描述为一个颜色空间 新增了RGB ...

  8. luogu 2115 破坏(01分数规划)

    题意:给出一个序列,删除一个连续的子串后使得剩下的平均值最小. 典型的01分数规划,令f(x)=(sum1[i]+sum2[j])/(i+j).sum1表示前缀和,sum2表示后缀和,那么我们就相当于 ...

  9. bzoj4815[CQOI2017]小Q的格子

    题意 不简述题意了,简述题意之后这道题就做出来了.放个原题面. 小Q是个程序员. 作为一个年轻的程序员,小Q总是被老C欺负,老C经常把一些麻烦的任务交给小Q来处理. 每当小Q不知道如何解决时,就只好向 ...

  10. 【bzoj5183】[Baltic2016]Park 离线+对偶图+并查集

    题目描述 在Byteland的首都,有一个矩形围栏围起来的公园.在这个公园里树和访客都以一个圆形表示.公园有四个出入口,每个角落一个(1=左下角,2=右下角,3=右上角,4=左上角).访客能通过这些出 ...