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());

    }

原文地址:https://www.cnblogs.com/hhthtt/p/10488222.html