黑马程序员技术交流社区
标题:
HashMap和TreeMap的一点区别?
[打印本页]
作者:
李哲
时间:
2012-3-20 09:00
标题:
HashMap和TreeMap的一点区别?
是不是将元素存入HashMap,即使复写了元素的hashCode()和equals()方法,也无法进行排序?如果没有复写,又会是什么顺序?还是不管怎样,都是无序?无序是由随机指定的哈希值决定的?但是不是复写了元素的hashCode()和equals()方法吗?怎么还是无法排序?
将元素存入TreeMap,如果复写了元素的hashCode()和equals()方法,会按照自己定义的方法排序?如果没有复写,按照什么方法排序?
作者:
魏昂
时间:
2012-3-20 09:54
HashMap,LinkedHashMap,TreeMap都属于Map
Map 主要用于存储键(key)值(value)对,根据键得到值,因此键不允许键重复,但允许值重复。
HashMap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为Null;允许多条记录的值为Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力。
LinkedHashMap LinkedHashMap也是一个HashMap,但是内部维持了一个双向链表,可以保持顺序
TreeMap 不仅可以保持顺序,而且可以用于排序
HashMap例子:
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("a3", "aa");
map.put("a2", "bb");
map.put("b1", "cc");
for (Iterator iterator = map.values().iterator();
iterator.hasNext();) {
String name = (String) iterator.next();
System.out.println(name);
} }
复制代码
LinkedHashMap例子:
public static void main(String[] args) {
Map<String, String> map = new LinkedHashMap<String, String>();
map.put("a3", "aa");
map.put("a2", "bb");
map.put("b1", "cc");
for (Iterator iterator = map.values().iterator();
iterator.hasNext();) {
String name = (String) iterator.next();
System.out.println(name);
} }
复制代码
TreeMap例子:
public static void main(String[] args) {
Map<String, String> map = new TreeMap<String, String>(new Comparator<Object>(){
Collator collator = Collator.getInstance();
public int compare(Object o1, Object o2) {
CollationKey key1 = collator.getCollationKey(o1.toString());
CollationKey key2 = collator.getCollationKey(o2.toString());
return key1.compareTo(key2); //return collator.compare(o1, o2);
}});
map.put("a3", "aa");
map.put("a2", "bb");
map.put("b1", "cc");
for (Iterator iterator = map.values().iterator();
iterator.hasNext();) {
String name = (String) iterator.next();
System.out.println(name);
} }
复制代码
运行这三个例子,体会一下它们之间的区别。
作者:
尹震
时间:
2012-3-20 10:03
HashMap 是无序的,而重写hashCode()和equals()方法,是判断集合里的对象Hash值是否相同,若相同则不会往集合里添加了。
而且,HashMap遍历出来的顺序也不是固定的。
TreeMap却是有序的,是通过“键”来自动进行排序,如若想根据自己的要求进行排序,可以使用"比较器"。
作者:
李飞
时间:
2012-3-20 17:45
HashMap:底层哈希表,不同步,线程不安全,运行null作为键,null作为值
LinkedHashMap:有序,存入和取出的顺序一致
TreeMap:可以对集合的键进行排序,根据比较方法返回值,负数,放左边,整数放右边,零就代表重复 ,具体的可以看看哈弗曼树
作者:
a504079589
时间:
2012-3-20 18:32
HashMap是使用哈希算法去元素重复的, 要重写hashCode()和equals()方法, 在存储键值对的时候, 对键对象取哈希值, 然后查找是否有相同的哈希值对象, 如果没有就直接存入, 如果有哈希值相同的键对象, 就和哈希值相同的键对象进行equals()比较, 结果为fals就存入, 结果为true就覆盖; 是无序的;
TreeMap即可去重复又可排序, 是通过键来获取值的, 同时也是通货键来进行排序, 因为值有可能相同, 无法进行比较, 如果不指定顺序就按照键对象的自认顺序排序, 也可以指定一个比较器顺序;
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2