首页 > 代码库 > Map--HashMap TreeMap
Map--HashMap TreeMap
Map:
a) 是一个单独的接口,不属于Collection,属于集合,存放的是键值对
b) 键不能重复,如果重复,后面添加的会覆盖前面添加的
c) Map.put(k, v)返回的是上一次添加的相同键的值(即被覆盖的值)
1 Map遍历:
a) Set<K> keyset()
得到所有键的集合存储到一个Set中,并返回一个Set集合,因为Set有迭代器,所以使用迭代器迭代,每次迭代出一个键,再根据键获取值
Set<String> keys = map.keySet(); Iterator<String> ite = keys.iterator(); while(ite.hasNext()) { String key = ite.next(); String value = map.get(key); System.out.println(key + "=" + value); }
b) Set<Map.Entry<K, V>> entrySet()
i. Map.Entry<K, V>映射关系类型
ii. Entry是定义在Map中的一个静态接口,有了集合中的键值对,才会存在映射关系,所以映射关系是对集合内部事物的描述,所以定义在Map内部
iii. 得到每个键值对对应的映射关系类型的值,存到Set集合汇总,并返回该集合,因为Set有迭代器,每次迭代出来的是一个映射类型的值,从这个映射关系类型的值中,即可以得到键,也可以得到值
Set<Map.Entry<String, String>> entry = map.entrySet(); Iterator<Map.Entry<String, String>> ite = keys.iterator(); while(ite.hasNext()) { Map.Entry<String, String> en = ite.next(); String key = en.getKey(); String value = en.getValue(); System.out.println(key + "=" + value); }
2 HashMap:
a) 底层使用的数据结构是hash结构
b) 线程不安全
c) 如何保证键不能重复(和HashSet相同)
i. int hashCode()
ii. Boolean equals(Object obj)
public int hashCode() { return name.hashCode()+age*33; } public boolean equals(Object obj) { if(!obj instanceof Student) throw new ClassCastException("类型转换异常"); Student stu = (Student)obj; return this.name.equals(stu.name) && this.age==stu.age; }
3 TreeMap:
a) 底层使用的数据结构是二叉树,可以排序
b) 线程不安全
c) 根据什么排序?(和TreeSetSet相同)
i. 根据键排序
ii. 实现Comparable的compareTo()方法
public int compareTo(Student stu) { int num = this.name.compareTo(stu.name); return num==0 ? this.age-stu.age : num; }
i. 自定义一个排序方式
class ComByAge implements Compartor<Student> { int num = s1.getAge() - s2.getAge(); return num==0 ? s1.getName().compareTo(s2.getName()) : num; }
Map--HashMap TreeMap