Map中keySet()的使用:
Map<String,Integer> map = new HashMap<String,Intrger>();
map.put("a","1");
map.put("b","2");
map.put("c","3");
set<String> ks = map.keySet();
for(String s:ks){
System.out.println(s);
HashMap中keySet()方法:
public Set<K> keySet() {
Set<K> ks = keySet;
return (ks != null ? ks : (keySet = new keySet()));
而且keySet成员初始为null,且没有在构造函数中初始化过
所以初次调用keySet()方法时会new keySet(),而keySet()是一个内部类
【Map接口】
继承关系
底层数据结构:哈希表
哈希表:通过关键码来映射到值的一个数据结构
哈希函数:键与值映射的一个映射关系
哈希函数:
1、直接寻址方 f(x) = kx+b(k、b都是常数) 查询添加都应对应相同的哈希函数,插入的顺序和存放的顺序不一致,键无序
2、除留余数法 f(x) = x % k (k <= m)[m为存储位置长度]
哈希冲突:不同元素通过同一个哈希函数放在了相同的位置
m!=n ==> f(m) = f(n)
哈希冲突的解决:
1、链地址法 每一个索引位置存储的数据以链表的形式链接起来,当访问查找数据时,对相应索引位置的链表进行遍历。
2、探测发 (线性探测 随机探测) 通过哈希函数,找到关键字KEY在线性序列中的位置
对map集合的遍历:3种遍历方法
//通过键值对遍历 void clean()
//先将HashMap实例转化为set实例(类型map.entry())
Iterator<Map.Entry<String, String>> iterator = hashMap.entrySet().iterator();
while(iterator.hasNext()) {
Map.Entry<String, String> next = iterator.next();
String key = next.getKey();
String value = next.getValue();
System.out.print(key + ":" + value + " ");
}
System.out.println("============");
//通过键来对Map进行遍历
//仅仅对键进行访问
Iterator<String> iterator1 = hashMap.keySet().iterator();
while(iterator1.hasNext()) {
String next = iterator1.next();
System.out.println(next+" ");
}
System.out.println("==============");
//通过值来对Map集合进行遍历
Iterator<String> iterator2 = hashMap.values().iterator();
while(iterator2.hasNext()) {
String next = iterator2.next();
System.out.println(next+" ");
}