Java 中HashTableHashMapTreeMap三者区别,以及自定义对象是否相同比较,自定义排序等
Posted smartsmile
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 中HashTableHashMapTreeMap三者区别,以及自定义对象是否相同比较,自定义排序等相关的知识,希望对你有一定的参考价值。
/* Map集合:该集合存储键值对。一对一对往里存。而且要保证键的唯一性。 Map |--Hashtable:底层是哈希表数据结构,不可以存入null键null值。该集合是线程同步的。效率低。基本已废弃 |--HashMap:底层是哈希表数据结构,允许使用 null 值和 null 键,该集合是不同步的。将hashtable替代,.效率高,不保证顺序。 |--TreeMap:底层是二叉树数据结构。线程不同步。可以用于给map集合中的键进行排序。保证顺序 */ import java.util.*; /** * 学生类实现Comparable可比较接口 */ class Student implements Comparable<Student> private String name; private int age; Student(String name, int age) this.name = name; this.age = age; /** * 覆写接口中的compareTo方法跟equals覆写组合判断对象是否相同 * * @param s * @return */ @Override public int compareTo(Student s) int num = Integer.valueOf(this.age).compareTo(s.age); if (num == 0) return this.name.compareTo(s.name); return num; /** * 覆写hashcode方法用于底层采用hash算法的容器 * * @return */ @Override public int hashCode() //用姓名和年龄组合值作为hashcode return name.hashCode() + age * 34; /** * 覆写equals方法实现自定义比较 * * @param obj * @return */ @Override public boolean equals(Object obj) if (!(obj instanceof Student)) throw new ClassCastException("类型不匹配"); //强制转换类 Student s = (Student) obj; //比较类中成员变量是否相同 return this.name.equals(s.name) && this.age == s.age; public String getName() return name; public int getAge() return age; public String toString() return name + "," + age; /** * 比较器 */ class StuNameComparator implements Comparator<Student> public int compare(Student s1, Student s2) int num = s1.getName().compareTo(s2.getName()); if (num == 0) return Integer.valueOf(s1.getAge()).compareTo(s2.getAge()); return num; class Test2 public static void main(String[] args) HashMap<Student, String> hm = new HashMap<Student, String>(); hm.put(new Student("lisi1", 21), "beijing"); hm.put(new Student("lisi1", 21), "beijing"); //与上面相同不存 hm.put(new Student("lisi1", 21), "tianjin"); hm.put(new Student("lisi2", 22), "shanghai"); hm.put(new Student("lisi3", 23), "nanjing"); hm.put(new Student("lisi4", 24), "wuhan"); hm.put(new Student("lisi4", 24), "wuhan"); //与上面相同不存 System.out.println("-----------------第第一种取出方式 keySet, 迭代器-------------------------"); //第一种取出方式 keySet, 迭代器 Set<Student> keySet = hm.keySet(); Iterator<Student> it = keySet.iterator(); while (it.hasNext()) Student stu = it.next(); String addr = hm.get(stu); System.out.println(stu + "___" + addr); System.out.println("-----------------第二种取出方式 entrySet, 迭代器-------------------------"); //第二种取出方式 entrySet, 迭代器 Set<Map.Entry<Student, String>> entrySet = hm.entrySet(); Iterator<Map.Entry<Student, String>> iter = entrySet.iterator(); while (iter.hasNext()) Map.Entry<Student, String> me = iter.next(); Student stu = me.getKey(); String addr = me.getValue(); System.out.println(stu + "___" + addr); System.out.println("---------------第三种取出方式 for循环方式---------------------------"); //第三种取出方式 for循环方式 for (Map.Entry<Student, String> entry : hm.entrySet()) System.out.println(entry.getKey() + "___" + entry.getValue()); System.out.println("----------------TreeMap自定义排序,使用比较器--------------------------"); //TreeMap自定义排序,使用比较器 TreeMap<Student,String> tm = new TreeMap<Student,String>(new StuNameComparator()); tm.put(new Student("lisi1", 21), "beijing"); tm.put(new Student("lisi1", 21), "beijing"); //与上面相同不存 tm.put(new Student("lisi1", 21), "tianjin"); tm.put(new Student("lisi2", 22), "shanghai"); tm.put(new Student("lisi3", 23), "nanjing"); tm.put(new Student("lisi4", 24), "wuhan"); tm.put(new Student("lisi4", 24), "wuhan"); //与上面相同不存 for (Map.Entry<Student, String> entry : tm.entrySet()) System.out.println(entry.getKey() + "___" + entry.getValue()); /** * -----------------第第一种取出方式 keySet, 迭代器------------------------- * lisi4,24___wuhan * lisi2,22___shanghai * lisi1,21___tianjin * lisi3,23___nanjing * -----------------第二种取出方式 entrySet, 迭代器------------------------- * lisi4,24___wuhan * lisi2,22___shanghai * lisi1,21___tianjin * lisi3,23___nanjing * ---------------第三种取出方式 for循环方式--------------------------- * lisi4,24___wuhan * lisi2,22___shanghai * lisi1,21___tianjin * lisi3,23___nanjing * ----------------TreeMap自定义排序,使用比较器-------------------------- * lisi1,21___tianjin * lisi2,22___shanghai * lisi3,23___nanjing * lisi4,24___wuhan */
以上是关于Java 中HashTableHashMapTreeMap三者区别,以及自定义对象是否相同比较,自定义排序等的主要内容,如果未能解决你的问题,请参考以下文章