zoukankan      html  css  js  c++  java
  • Set接口

    Set接口

    Set中不可以存放重复元素

    HashSet集合

    此类实现SetJ接口,由哈希表。 HashSet集合不能保证的迭代顺序与元素存储顺序相同。

    哈希表:

    哈希表是数组和链表的结合体

    当把这些对象向数组中存放时,会根据这些对象的特有数据结合相应的算法,计算出这个对象在数组中的位置,然后把这个对象存放在数组中。

    这个算法就是Object中的hashCode方法

    注意:当调用add存储元素时,add会调用你存储类型的hashCode方法,如果两个对象hashCode方法算出结果一样,这样现象称为哈希冲突,这时会调用对象的equals方法,比较这两个对象是不是同一个对象,如果相同,那么就不会把第二个对象存放在哈希表中,如果不相同,就会把这个值存放在哈希表中。

    初始容量:数组的长度16

    加载因子:0.75

    16*0.75=12

    当数组存到第12个时会再往后面开数组

    哈希函数:hashCode();

    String重写后的:

    public int hashCode(){

        int  h = hash;//0

        if(h!=0 && value.length>0){

        char  val[]=value;

        for(int i=0;i<value.length;i++){

        h=31*h+val[i];

    }

    hash=h;

    }

    return  h;

    }

    HashSet存储元素

    给HashSet中存储JavaAPI中提供的类型元素时,不需要重写元素的hashCode和equals方法,因为这两个方法,在JavaAPI的每个类中已经重写完毕,如String类、Integer类等。

    给HashSet中存放自定义类型元素时,需要重写对象中的hashCode和equals方法,建立自己的比较方式,才能保证HashSet集合中的对象唯一

     

     

    //重写hashCode 方法

        public int hashCode() {

           return name.hashCode()+age*31;//对象中所有元素相加 //*31-52

          

        }

    //重写equals方法

       

    public boolean equals(Object obj) {

        if(obj==null){

           return false;

        }

        if(obj==this){

           return true;

        }

        if(obj instanceof Pe){

           类名 p=(类名)obj;     //转型

           return p.name==this.name && p.age==this.age;//如果都相同返回true

        }

        return false;

    }

    LinkedHashSet

    元素存放有顺序,

    数据存储结构为哈希表和链表的结合

    判断集合元素唯一的原理

    contains方法使用时,会调用equals方法依次与集合中的旧元素所比较,从而根据返回的布尔值判断是否有重复元素。

    Map接口

    Collection中的集合称为单列集合,Map中的集合称为双列集合。

    Map中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。通过键可以找到所对应的值。

    Map不能存重复元素,如果重复会把原来的值覆盖掉

     

    方法:

    get();   获取值,通过键 找值

    put();   添加值,传入键和值

    remove(); 删除  传入键 删除

    Map集合遍历:

    keyset(); 返回一个set集合;  key值

    1:keySet方法加增强for

    获取装有所有key的Set集合

    Set<Map集合key的类型> set=map.keySet();

        遍历set集合获得每一个key

        for(Integer key:set){

           System.out.print(key+" ");

           System.out.println(map.get(key));

        }

    2:keyset方法加迭代器

    Set<Integer> aet=map.keySet();

        Iterator<Integer> it=set.iterator();

        while(it.hasNext()){

           //获取key值

           int key=it.next();

           //获取value

           String value=map.get(key);

           System.out.println(value);

        }

    Map.Entry嵌套接口(内部类),

    Entry是Map接口中提供的一个静态内部嵌套接口。

    方法:

    getKay();          返回键

    getValue();       返回值

    entrySet();

    用于返回Map集合中所有的键值对(Entry)对象,以Set集合形式返回。

     

    3:

    Set<Map.Entry<String,String>> set=map.entrySet();

        for(Map.Entry<String,String> a:set){

           System.out.println(a.getKey()+" "+a.getValue());

        }

    4:

    Set<Map.Entry<String,String>> set1=map.entrySet();

        Iterator<Map.Entry<String,String>> it1=set1.iterator();

        while(it1.hasNext()){

           Map.Entry<String,String> zz=it1.next();

           System.out.println(zz.getKey()+" "+zz.getValue());

        }

  • 相关阅读:
    【leetcode】21-MergeTwoSortedLists
    【leetcode】20-ValidParentheses
    【c++基础】遍历目录并写入txt文件-linux
    【c++基础】字符数组和string相互转换
    【linux基础】使用命令行编译运行c++程序
    第2章 重新组织函数(4):函数对象、替换算法
    第2章 重新组织函数(3):引入解释性变量、分解临时变量和移除对参数的赋值
    第2章 重新组织函数(2):内联函数、内联临时变量和查询函数
    第2章 重新组织函数(1):提炼函数
    第1章 重构,第一个案例(3):运用多态取代switch
  • 原文地址:https://www.cnblogs.com/hhthtt/p/10488222.html
Copyright © 2011-2022 走看看