今天复习到最近复习到容器部分,学过数据结构,知道哈希表,哈希函数,哈希查找,但是一直都没有实现过,也不知道怎么用的,今天看了一下视频,跟着写了一下hashmap的操作,读了一下hashmap的源码。也算是加强一下理解吧。
package com.map;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class HashMapDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
//这里两个类型分别是建和值的类型、
//HashMap<String,String> map=new HashMap<String,String>();
//也按下面方法写,接口Map的引用变量可以指向是实现类HashMap的对象
//道理和前面的linkedList是一样的
Map<String,String> map=new HashMap<String,String>();
//这里注意,键是唯一的,不能重复。下面添加一个重复的,会被后来添加的覆盖掉。
map.put("Jay", "周杰伦");
map.put("halin", "庾澄庆");
map.put("Jay", "张三");
map.put("Rose", "螺丝");
map.put("Mary", "玛丽");
System.out.println(map);
// //获取map中所有的键
// Set<String> keys=map.keySet();
// //Set集合也是继承了Iterator。只要是继承了Iterator都可以用迭代器或者增强for循环
// for(String key:keys){
// System.out.println(key);
// }
//获取map当中所有的值
//Collection集合也是继承了Iterator。只要是继承了Iterator都可以用迭代器或者增强for循环
Collection<String> values = map.values();
for(String value:values){
System.out.println(value);
}
//得到key的同事得到key对应的值
Set<String> keys=map.keySet();
for(String key:keys){
System.out.println(key+"-----"+map.get(key));
}
/*当我们调用put(key,value)方法的时候
* 首先会把key和value封装到entry静态内部类对象当中
* 然后把entry放到数组里面。所以我们想获取map中的键值对
* 我们只需要获取数组中的entry对象。
* 调用entry对象中的getKey和getValue方法
*
* entrySet就是从数组中取出entry对象放到Set里面
* */
//想输出hashmap里面所有的键值对的时候,基本上都用这种方法。
Set<Entry<String, String>> entrys = map.entrySet();
for(Entry<String,String> entry:entrys){
System.out.println(entry.getKey()+"----"+entry.getValue());
}
/*hashMap调用默认构造方法,会产生一个底层长度为16的entry数组
*entry是一个静态内部类
*
*
*hashmap内部结构是一个数组链表结构 既有数组又有链表
*因为不同的Key有可能算出相同的散列值,根据散列值存放到数组的下标会冲突
*这个时候有两种情况 1 若建和值是一样的直接覆盖掉
* 2 键值不一样,就会在数组上该下标的地方形成链表。把有冲突的地方链起来
*
*
* */
}
}