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