**Map:顶层接口,该集合存储的是键值对,而且键是唯一的,Map和Set很像,Set集合底层就是使用了Map集合。 Map集合没有迭代器,要取出元素必须先将Map集合转换成Set集合才能遍历元素 |--->HashTable(JDK1.0): 底层是哈希表数据结构; 不可以使用null键和null值; 用作键的对象必须实现hashCode和equals方法来保证键的唯一性 线程同步,效率低 |--->HashMap(JDK1.2): 底层是哈希表数据结构; 允许使用null键和null值; 线程不同步,效率高; 保证元素唯一性的: 原理:先判断元素的hashCode值是否相同,再判断两元素的equals方法是否为true (往HashSet里面存的自定义元素要复写hashCode和equals方法, 以保证元素的唯一性!) class Student { private String name; private int age; public Student(String name, int age) { super(); this.name = name; this.age = age; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public int hashCode(){ return name.hashCode()+age*34; } @Override public boolean equals(Object obj){ if(!(obj instanceof Student)) return false; Student stu = (Student)obj; return this.name.equals(stu.name)&&this.age==stu.age; } public class HashMapDemo1 { public static void main(String[] args) { Map<Student , String> hmap = new HashMap<Student , String>(); hmap.put(new Student("001",20), "beijing"); hmap.put(new Student("002",25), "hebei"); hmap.put(new Student("003",50), "hainan"); hmap.put(new Student("001",20), "beijing"); System.out.println(hmap.size()); Set<Student> keySet = hmap.keySet(); Iterator<Student> it = keySet.iterator(); while(it.hasNext()){ Student stu = it.next(); String addr = hmap.get(stu); System.out.println(stu.getName()+".."+stu.getAge()+"::"+addr); } } } |--->TreeMap(JDK1.0): 底层是二叉树结构; 允许使用null键和null值; 线程不同步; 可以给Map集合中的键进行排序. TreeMap排序的第一种方式:让元素自身具备比较性,比如八种基本数据类型或则字符串, 实现Compareble接口,覆盖compareTo方法, 此方式是元素的自然顺序 TreeMap排序的第一种方式:当元素自身不具备比较性(比如存储学生对象时)或者具备的 比较性不是我们所需要的比较性时(比如想字符串的长度排序), 此时就需要让集合自身具备自定义的比较性。 那如何让集合自身具备比较性呢?可在集合初始化时, 就让集合具备比较方式。即定义一个类, 实现Comparator接口,覆盖compare方法。 class Student implements Comparable<Student>{ private String name; private int age; public Student(String name, int age) { super(); this.name = name; this.age = age; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public int compareTo(Student stu) { int num = new Integer(this.age).compareTo(new Integer(stu.age)); if(num==0) return this.name.compareTo(stu.name); return num; } } public class HashMapDemo1 { public static void main(String[] args) { Map<Student , String> tmap = new TreeMap<Student , String>(); tmap.put(new Student("001",20), "beijing"); tmap.put(new Student("002",25), "hebei"); tmap.put(new Student("003",50), "hainan"); tmap.put(new Student("001",20), "beijing"); System.out.println(tmap.size()); Set<Student> keySet1 = tmap.keySet(); Iterator<Student> it1 = keySet1.iterator(); while(it1.hasNext()){ Student stu = it1.next(); String addr = tmap.get(stu); System.out.println(stu.getName()+".."+stu.getAge()+"::"+addr); } } } |