zoukankan      html  css  js  c++  java
  • Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?

    说明:其实这个题目本身有问题!因为Set只是一个接口,它的不同实现类判断元素是否相等的标准是不同的。笼统地说,Set里的元素是不能重复的,判断元素重复使用equals()。而不是==

    对于HashSet而言,判断两个对象是否相等是通过equals()hashCode()方法,只要两个对象通过 equals()比较返回false、或两个对象的hashCode()不相等,那么HashSet就会把它们当成不相同。

    对于TreeSet而言,判断两个对象相等的唯一标准是:两个对象通过compareTo(Object obj)比较是否返回0,与equals()方法无关。只要两个对象通过compareTo(Object obj)比较没有返回0Java就会把它们当成两个对象处理——这一点是很多人容易误解的,一个示例来说明:

    class Z implements Comparable

    {

    int age;

    public Z(int age)

    {

    this.age = age;

    }

    // 重写equals()方法,总是返回true

    public boolean equals(Object obj)

    {

    return true;

    }

    //重写了compareTo(Object obj)方法,总是返回正整数

    public int compareTo(Object obj)

    {

    return 1;

    }

    }

    public class TreeSetTest2

    {

    public static void main(String[] args)

    {

    TreeSet set = new TreeSet();

    Z z1 = new Z(6);

    set.add(z1);

    //输出true,表明添加成功

    System.out.println(set.add(z1));    //

    //下面输出set集合,将看到有两个元素

    System.out.println(set);

    //修改set集合的第一个元素的age变量

     ((Z)(set.first())).age = 9;

    //输出set集合的最后一个元素的age变量,将看到也变成了9

    System.out.println(((Z)(set.last())).age);

    }

    }

    上面程序中两个Z对象通过equals()比较总会返回true,但通过compareTo(Object obj)比较总是不会返回0,因此两次向TreeSet中添加同一个元素,TreeSet会把它们当成不同的对象进行处理,最后TreeSet集合中会显示有两个对象,但实际上是同一个对象。

    Java Program!
  • 相关阅读:
    状态压缩+枚举 UVA 11464 Even Parity
    数学/思维 UVA 11300 Spreading the Wealth
    贪心 UVA 11729 Commando War
    二分专题
    二分图判定+点染色/并查集 BestCoder Round #48 ($) 1002 wyh2000 and pupil
    数学 Codeforces Round #219 (Div. 2) B. Making Sequences is Fun
    贪心 Codeforces Round #191 (Div. 2) A. Flipping Game
    DP Codeforces Round #FF (Div. 1) A. DZY Loves Sequences
    递推 Codeforces Round #186 (Div. 2) B. Ilya and Queries
    递推DP Codeforces Round #260 (Div. 1) A. Boredom
  • 原文地址:https://www.cnblogs.com/programb/p/14068523.html
Copyright © 2011-2022 走看看