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!
  • 相关阅读:
    万豪项目总结
    解决jquery animate({scrollTop$pos},500)与$(window).scroll方法冲突的问题
    一波水文来袭-让我们一起谈谈闭包【原创】
    JS模块化规范AMD之RequireJS
    JS模块化规范CMD之SeaJS
    邂逅Sass和Compass之Compass篇
    邂逅Sass和Compass之Sass篇
    idea 修改SVN账户信息
    idea 创建/加载 maven项目速度较慢
    gitlab新建分支,idea中无法找到
  • 原文地址:https://www.cnblogs.com/programb/p/14068523.html
Copyright © 2011-2022 走看看