/*
Map : 双列集合
| --------Map
|----HashMap:HashMap:线程不安全的,key和value可以是null
|----LinkedHashMap:
LinkedHashMap是HashMap的子类。底层于HashMap实现的方式一样。
LinkedHashMap可以安照元素存放的顺序进行遍历。因为底层维护了一张链表,该链表记录了元素存放的顺序。
|----Hashtable:Hashtable:线程安全的,key和values不可以是null,否则会报空指针异常
|----Properties: key和value都是字符串,用来读取文件内容。
|----TreeMap: 可以对元素进行排序(只能对key中的元素进行排序)
说明 :
1.Map中的key唯一的,不可重复的,无序的。可以看成是set集合。--- Key中的对象必须重写equlas和hashCode方法
2.Map中的value是可重复的。可以看成是Collection集合中的List。----value中的对象必须重写equals方法
3.Map中的键值对(key-value)。可以看成是一个一个的Entry.Entry是不可重复的。Entry的位置是根据
Map中的key的位置来决定的。所有的Entry可以看成是一个Set的集合。
1.[面试题]HashMap和Hashtable的区别是什么?
HashMap:线程不安全的,key和value可以是null
Hashtable:线程安全的,key和values不可以是null,否则会报空指针异常
2.[面试题]HashMap的底层实现原理?
当我们向HashMap中添加数据(K1,V1)首先会根据K1的hashCode方法算出的哈希值,决定元素存放在数组中的位置。
如果该位置没有其它元素则直接放入。如果该位置已经存在其它元素(K2,V2)会调用K1的equals方法和K2进行内容比较。
如果调用equals方法的返回值是true则会将v2覆盖v1.如果返回值是false则用链表的方式存入到该位置。
如果该位置链表的 数量超过8则底层会改用成红黑树的方式进行存储。
HashMap空参的构造器:
当我们创建一个HashMap空参的构造器时,底层会为我们创建一个长度为16的数组,加载因子为0.75。
当我们添加的元素达到12时会进行扩容。扩容为原来的2倍。
jdk7及以前版本:HashMap是数组+链表
jdk8版本呢以后:HashMap是数组+链表+红黑树。
说明:
1.HashSet底层就是一个HashMap ,HashSet的值都放在HashMap中的key中。
2.LinkedHashSet底层就是一个LinkedHashMap
3.TreeSet底层就是TreeMap
代码:
Map map = new HashMap();
map.put("aa", "AA");
map.put("dd", "DD");
map.put("bb", "BB");
/*获取集合中所有的key值
* Set keySet()*/
Set keySet = map.keySet();
for (Object key : keySet) {
System.out.println(key);
}
/*
* 获取集合中所有的value值
Collection values()
*/
Collection values = map.values();
for (Object value : values) {
System.out.println(value);
}
/*
* 获取集合中所有的entry(entry包含了key和value)
Set entrySet()
*/
Set entrySet = map.entrySet();
for (Object object : entrySet) {
Map.Entry entry1 = (Entry) object;
System.out.println(entry1.getKey() + "-----" + entry1.getValue());
Properties : 用来读取文件内容
@Test
public void test4(){
FileInputStream fis = null;
try {
//1.创建Properties的对象
Properties ps = new Properties();
//2.创建输入流
fis = new FileInputStream(new File("person.properties"));
//3.加载输入流
ps.load(fis);
//4.读取文件内容
String name = ps.getProperty("name");
String age = ps.getProperty("age");
System.out.println(name + " " + age);
} catch (Exception e) {
System.out.println("有异常了");
}finally{
//5.关流
if(fis != null){
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}