zoukankan      html  css  js  c++  java
  • java Set接口(元素不可以重复)

    Set是Collection子接口;

    Set和Collection基本上一样,一点除外:

    Set无法记住添加的顺序,不允许包含重复的元素。

    当试图添加两个相同元素进Set集合,添加操作失败,add()方法返回false。

    Set判断两个对象是否相等用equals,而不是使用==。

    也就是说两个对象equals比较返回true,Set集合是不会接受这个两个对象的。

    常用子类:

    HashSet:散列存放

    TreeSet:有序存放

    hashCode方法对于HashSet的作用

    HashSet类是Set接口最常用的实现类,采用hash算法存储数据,具有良好的存储和查找功能。

    散列存储:不记录添加顺序;排列顺序时,顺序有可能发生变化;

    线程不安全的,多个线程访问一个HashSet要使用同步代码;

    HashSet集合元素值允许是null,但是最多只能有一个;//因为Set集合就不可以装重复的对象!

    hash(翻译为哈希,或散列)算法的功能:

    保证通过一个对象快速找到另一个对象;

    其算法价值体现在速度,可以保证查询快速执行;

    当从HashSet中访问元素时,HashSet先计算该元素的hashCode(也就是该对象的hashCode方法返回值),然后直接到该HashCode对应的位置取出该元素;

    在这里对象的hashCode就好比是数组里的索引,但是不是索引;

    HashSet元素添加

    当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,判断已经存储在集合中的对象的hashCode值是否与添加的对象的hashCode值一致:若不一致:直接添加进去;若一致,再进行equals方法比较,equals方法如果返回true,表明对象已经添加进去了,就不会再添加新的对象了,否则添加进去;

    如果我们重写了equals方法,也要重写hashCode方法,反之亦然;。

    HashSet集合判断两个元素相等的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode方法返回值也相等。

    如果需要某个类的对象保存到HashSet集合中,覆写该类的equals()和hashCode()方法,应该尽量保证两个对象通过equals比较返回true时,他们的hashCode返回也相等。

     

    我的总结:

    很重要的一点:理解!往HashSet集合里面存入数据,要先后调用两个方法:hashCode方法和equals方法!!!

    备注:使用eclipse添加这两个方法。

    Eg:

    package july7;

    //hashset方法和equals方法判断输入的对象是否重复!

    import java.util.HashSet;

    import java.util.Set;

    class PersonDemo{

        private String name;

        public PersonDemo(String name) {

            super();

            this.name = name;

        }

        @Override

        public String toString() {

            return "name= " + name ;

        }

        //没有覆写hashcode和equals方法前,显示三次(一样的)。覆写后,只剩下一个了!说明覆写后方法起作用了,重复的输入不进去!

        @Override

        public int hashCode() {

            final int prime = 31;

            int result = 1;

            result = prime * result + ((name == null) ? 0 : name.hashCode());

            return result;

        }

        @Override

        public boolean equals(Object obj) {

            if (this == obj)

                return true;

            if (obj == null)

                return false;

            if (getClass() != obj.getClass())

                return false;

            PersonDemo other = (PersonDemo) obj;

            if (name == null) {

                if (other.name != null)

                    return false;

            } else if (!name.equals(other.name))

                return false;

            return true;

        }

    }

    public class Demo12 {

        public static void main(String[] args) {

           

            Set s = new HashSet();

           

            s.add(new PersonDemo("章泽天"));

            s.add(new PersonDemo("章泽天"));

            s.add(new PersonDemo("章泽天"));

            System.out.println(s);

        }

    }  

  • 相关阅读:
    unicode utf-8 ascll
    解压赋值。django导读,http协议,
    手撸orm
    优酷oneday 元类单例 多路复用
    前后台交互, 按钮, 输入栏,列表,选项 ,dom
    jq 事件;jq选择器,与js转化,jq操作文档,属性,类名,全局变量;获取盒子信息
    事件补充;对象操作;字符串类型操作;数组操作;数字类型操作
    if结构 ,循环结构,数据类型转换,逻辑运算符;三个弹出窗口;计算后样式获取,修改;函数
    js 引入与选择器;对文档修改;数据类型基础语法;计算后样式
    伪类边框,字体图标,显隐,overflow,阴影,二维变形
  • 原文地址:https://www.cnblogs.com/fanweisheng/p/11136138.html
Copyright © 2011-2022 走看看