Map是以键值对(key-value)的形式来存储数据的。而且Map不允许key的重复,通过Map存储key-value对时,只需要考虑key的存储就可以,key存储后value就会跟着key(完全可以把value当前key的"附庸舞")。
注意:如果只管Map里边的key,并把所有的key都手机起来那就变成set了。Map与set是一一对应的。
HashMap用"hash"算法控制"一个萝卜一个坑"来进行快速存储;
TreeMap就是真正的"红黑树";
3、Hashtable线程是安全的(实现不好,性能低),HashMap是线程不安全的(但可以通过collections工具类来提升安全),HashMap性能要好些,除此之外Hashtable与HashMap几乎一样。
Map对key是有要求的:
1、HashMap对key的要求:
HashMap是根据key的hashCode()方法的返回值来计算key的存、取位置。
怎样才算两个key重复呢?
①、通过eqauls()方法比较返回true;
②、两个key的hashCode()返回值相等。
1 import java.util.*;
2
3 public class HashMapTest{
4 public static void main(String[] args){
5 //HashMap只考虑key的存储,它对key的存储机制,几乎与HashSet的机制相同,add每放一次都仅一个值,put可放key-value对
6 //如果希望HashMap记住我们添加元素的顺序,应该考虑使用LinkedHashMap
7 HashMap<String,double> test = new HashMap<>();
8
9 //对于Map而言,每次添加都要key-value对
10 test.put("语文",88.0);
11 test.put("数学",99.0);
12 test.put("英语",78.0);
13
14 System.out.println(test.size());
15 System.out.println(test);
16 }
17 }
1 import java.util.*;
2
3 class Person{
4 private String name;
5 private double height;
6 public Person(String name, double height){
7 this.name = name;
8 this.height = height;
9 }
10
11 @Override
12 public String toString(){
13 return "他/她是:" + name + "身高是:" + height;
14 }
15
16 @Override
17 public boolean equals(Object obj){
18 if(this == obj){
19 return true;
20 }
21 //判断关键属性是否相等
22 if(obj != null && obj.getClass() == Person.class){
23 Person p = (Person)obj;
24 return this.height = p.height && this.name.equals(p.name);
25 }
26 return false;
27 }
28
29 @Override
30 public int hashCode(){
31 return name.hashCode() + 10*(int)height;
32 }
33 }
34
35 public class TestHashMap{
36 public static void main(String[] args){
37 HashMap<Person,double> hs = new HashMap<>();
38
39 hs.put(new Person("James",180),77);
40 hs.put(new Person("Polo",171),76);
41 hs.put(new Person("James",180),77);
42
43 System.out.println(hs);
44 }
45 }
2、TreeMap对key的要求:
TreeMap底层的红黑树只对key进行排序,并且要求key必须是可比较大小的。TreeMap和TreeSet一样同样有两 种排序方法:
自然排序:要求所有key实现Comparable接口/(自定义的必须手动实现、默认已实现(API)的直接调用即可);
定制排序:要求创建TreeMap时提供一个Comparator对象
那TreeMap怎样才算两个key重复呢?
通过Compare()方法比较大小返回0时,则表明两个元素是相等的。
1 public class TreeMapTest{
2 public static void main(String[] args){
3 //如果创建TreeMap时没有传入Comparator对象,说明用的是自然排序
4 //因为String已经实现了Comparable接口
5 TreeMap<String , Double> test = new TreeMap<>();
6
7 //对于Map而言,每次添加都要key-value对
8 test.put("aaa",88.0);
9 test.put("abc",99.0);
10 test.put("xyz",78.0);
11
12 System.out.println(test);
13 }
14 }
查看/遍历Map方法:
遍历Map有以下三种方法:
遍历所有键值对: entrySet()
遍历所有key: keySet()
遍历所有value: values()
JDK1.7后基本都是用第二种方法进行遍历,因为第二种方法性能是最好的
set和Map遍历的情况是一样的:都可以用for循环和迭代器进行遍历。
1 import java.util.*;
2
3 class TestForMap {
4 public static void main(String[] args){
5 HashMap<String, String> hp = new HashMap<String, String>();
6 hp.put("username","hp");
7 hp.put("password","12345");
8 hp.put("email","hp@hp.com");
9 hp.put("UserID","358");
10
11 //keySet()方式使用for循环遍历Map
12 for(String key : hp.keySet()){
13 //循环遍历Map的key值
14 System.out.println(key);
15 //循环遍历Map中key对应的value值
16 //System.out.println(hp.get(key));
17 }
18
19 Iterator<String> it = hp.keySet().iterator();
20 while(it.hasNext()){
21 //循环遍历Map的key值
22 //System.out.println(it.next());
23 //循环遍历Map中key对应的value值
24 System.out.println(hp.get(it.next()));
25 }
26 }
27 }