HashMap Hashtable LinkedHashMap 和TreeMap
java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMap Hashtable LinkedHashMap 和TreeMap
Map主要用于存储健值对,根据键得到值,因此不允许键重复,但允许值重复。
Hashmap 是一个 最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力.
Hashtable 与 HashMap类似,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtale在写入时会比较慢。
LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.在遍历的时候会比HashMap慢。
TreeMap能够把它保存的记录根据键排序,默认是按升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。
public class TestMap {
/**
* 初始化一个Map
* @param map
*/
public static void init(Map map){
if (map != null){
String key = null;
for (int i=5; i>0; i--){
key = new Integer(i).toString() + ".0";
map.put(key, key.toString());
//Map中的键是不重复的,如果插入两个键值一样的记录,
//那么后插入的记录会覆盖先插入的记录
map.put(key, key.toString() + "0"); }
}
}
/**
* 输出一个Map
* @param map
*/
public static void output(Map map){
if (map != null){
Object key = null;
Object value = null;
//使用迭代器遍历Map的键,根据键取值
Iterator it = map.keySet().iterator();
while (it.hasNext()){
key = it.next();
value = map.get(key);
System.out.println("key: " + key + "; value: " + value );
}
//或者使用迭代器遍历Map的记录Map.Entry
Map.Entry entry = null;
it = map.entrySet().iterator();
while (it.hasNext()){
//一个Map.Entry代表一条记录
entry = (Map.Entry)it.next();
//通过entry可以获得记录的键和值
//System.out.println("key: " + entry.getKey() + "; value: " + entry.getValue());
}
}
}
/**
* 判断map是否包含某个键
* @param map
* @param key
* @return
*/
public static boolean containsKey(Map map, Object key){
if (map != null){
return map.containsKey(key);
}
return false;
}
/**
* 判断map是否包含某个值
* @param map
* @param value
* @return
*/
public static boolean containsValue(Map map, Object value){
if (map != null){
return map.containsValue(value);
}
return false;
}
/**
* 演示HashMap
*/
public static void testHashMap(){
Map myMap = new HashMap();
init(myMap);
//HashMap的键可以为null
myMap.put(null,"ddd");
//HashMap的值可以为null
myMap.put("aaa", null);
output(myMap);
}
/**
* 演示Hashtable
*/
public static void testHashtable(){
Map myMap = new Hashtable();
init(myMap);
//Hashtable的键不能为null
//myMap.put(null,"ddd");
//Hashtable的值不能为null
//myMap.put("aaa", null);
output(myMap);
}
/**
* 演示LinkedHashMap
*/
public static void testLinkedHashMap(){
Map myMap = new LinkedHashMap();
init(myMap);
//LinkedHashMap的键可以为null
myMap.put(null,"ddd");
//LinkedHashMap的值可以为null
myMap.put("aaa", null);
output(myMap);
}
/**
* 演示TreeMap
*/
public static void testTreeMap(){
Map myMap = new TreeMap();
init(myMap);
//TreeMap的键不能为null
//myMap.put(null,"ddd");
//TreeMap的值不能为null
//myMap.put("aaa", null);
output(myMap);
}
public static void main(String[] args) {
System.out.println("采用HashMap");
TestMap.testHashMap();
System.out.println("采用Hashtable");
TestMap.testHashtable();
System.out.println("采用LinkedHashMap");
TestMap.testLinkedHashMap();
System.out.println("采用TreeMap");
TestMap.testTreeMap();
Map myMap = new HashMap();
TestMap.init(myMap);
System.out.println("新初始化一个Map: myMap");
TestMap.output(myMap);
//清空Map
myMap.clear();
System.out.println("将myMap clear后,myMap空了么? " + myMap.isEmpty());
TestMap.output(myMap);
myMap.put("aaa", "aaaa");
myMap.put("bbb", "bbbb");
//判断Map是否包含某键或者某值
System.out.println("myMap包含键aaa? "+ TestMap.containsKey(myMap, "aaa"));
System.out.println("myMap包含值aaaa? "+ TestMap.containsValue(myMap, "aaaa"));
//根据键删除Map中的记录
myMap.remove("aaa");
System.out.println("删除键aaa后,myMap包含键aaa? "+ TestMap.containsKey(myMap, "aaa"));
//获取Map的记录数
System.out.println("myMap包含的记录数: " + myMap.size());
HashMap和Hashtable之间有两个主要区别。第一,HashMap是非同步的(为了快速访问),第二,HashMap允许使用null关键字和null值,而Hashtable是不允许的。
TreeMap实现了Map接口,并把元素存储在树中。TreeMap在操作上需要比HashMap更多一些的开销,但是由于树的结构使然,它返回排序的关键字。如果没有按照关键字顺序提取Map的元素的需求,那么HashMap是更实用的结构。
HashMap和Hashtable之间有两个主要区别。第一,HashMap是非同步的(为了快速访问),第二,HashMap允许使用null关键字和null值,而Hashtable是不允许的。
TreeMap实现了Map接口,并把元素存储在树中。TreeMap在操作上需要比HashMap更多一些的开销,但是由于树的结构使然,它返回排序的关键字。如果没有按照关键字顺序提取Map的元素的需求,那么HashMap是更实用的结构。
分享到:
相关推荐
### Java中HashMap, LinkedHashMap, TreeMap,HashTable的区别 在Java编程语言中,`Map`接口是集合框架中的一个重要组成部分,用于存储键值对。本文将详细分析四种常用的`Map`实现类:`HashMap`, `LinkedHashMap`, ...
HashMap, HashTable, LinkedHashMap, TreeMap 的区别 在 Java 中,Map 是一个非常重要的集合类,用于存储键值对。其中,HashMap, HashTable, LinkedHashMap, TreeMap 是四种常用的 Map 实现类,每种类都有其特点和...
在Java编程语言中,`HashMap`、`TreeMap`和`LinkedHashMap`都是`java.util.Map`接口的实现,它们提供了不同的数据存储和访问策略。本文将深入探讨这三种数据结构的特点、工作原理以及适用场景。 1. **HashMap** `...
了解Map的整体结构也很重要,HashMap和其他Map实现如LinkedHashMap(保持插入顺序或访问顺序的HashMap)都是从AbstractMap继承,而Hashtable则直接继承Dictionary类,这反映了它们设计上的差异和适用场景的不同。...
Map接口用于保存具有key-value映射关系的数据,常见的Map实现包括HashMap、TreeMap、HashTable和LinkedHashMap等。Queue是Java提供的队列实现。 本文总结了HashMap和HashTable的源码学习和面试总结,涵盖了它们的...
HashMap是最常用的Map实现,它提供了快速的查找,但不保证元素的顺序,且允许null键和值。TreeMap则按Key的自然排序或自定义排序存储元素,适合需要排序的场景。HashTable是线程安全的,但效率相对较低,不推荐在单...
Map 的实现类有 Hashtable、HashMap、LinkedHashMap 和 TreeMap。Hashtable 是一种线程安全的哈希表,HashMap 是一种线程不安全的哈希表,LinkedHashMap 是一种链表哈希表,TreeMap 是一种树形哈希表。 在实际应用...
HashTable和HashMap的区别详解 LeetCode 27. 删除元素(Remove Element) 7月8号 7月5号 复习hashMap concurrentHashmap [LeetCode 70. 爬楼梯(Climbing Stairs).md](Java基础/数据结构与算法/LeetCode/LeetCode ...
Map接口是双列集合,存储键值对,例如Hashtable、HashMap、LinkedHashMap和TreeMap。Hashtable是线程安全的,HashMap非线程安全但性能较高,LinkedHashMap保持插入顺序,TreeMap则根据键进行排序。 在SQL中,事务...
4. Map接口存储键值对,其实现类包括HashMap、LinkedHashMap、TreeMap和Hashtable。HashMap是非同步的,允许null键和值,查找和插入速度快。LinkedHashMap保持了插入顺序或访问顺序,TreeMap按照键的自然排序或...
Map接口没有直接的实现类,但它有一些重要的实现,如HashMap、LinkedHashMap和TreeMap。HashMap是基于哈希表实现的,查找和插入速度较快,但不保证元素的顺序;LinkedHashMap则在HashMap基础上保持了插入顺序或访问...
本文将详细介绍HashMap的底层原理,包括其内部实现结构、关键字段的作用、以及JDK 1.7和JDK 1.8版本的主要区别。 首先,HashMap是基于哈希表的Map接口非同步实现,它允许使用null值和null键,这意味着HashMap在设计...
4. HashMap和TreeMap的区别: - TreeMap实现了SortedMap接口,基于红黑树,而HashMap基于哈希散列表实现。 - TreeMap插入、删除速度慢,因为需要维护树的平衡。 - TreeMap默认按键的升序排序,而HashMap是随机存储。...
在Java编程语言中,`HashMap`、`TreeMap`和`Hashtable`是三种常见的集合类,它们都实现了`Map`接口,用于存储键值对数据。理解这些类的区别和应用场景对于提升Java开发技能至关重要。 首先,`HashMap`是Java中最...
主要实现类有HashMap、LinkedHashMap、TreeMap和Hashtable。 - HashMap是基于哈希表的数据结构,JDK1.8以前是数组+链表,JDK1.8后引入了红黑树,当链表长度达到8时转换为红黑树,提高了查找效率。 - LinkedHashMap...
Map接口的实现包括HashMap、LinkedHashMap、TreeMap和Hashtable。HashMap是最常用的实现,它提供了快速的查找和插入,但不保证元素顺序。LinkedHashMap保持了插入顺序或访问顺序,而TreeMap按照键的自然排序或比较器...
6. HashMap、LinkedHashMap、TreeMap 的区别: - LinkedHashMap 保存了记录的插入顺序,遍历要比 HashMap 要慢。 - TreeMap 实现了 SortMap 接口,能够把保存的记录按照键排序。 7. Set 实现类比较: - HashSet...
主要实现类包括HashMap、Hashtable、LinkedHashMap和TreeMap。 1. HashMap:它利用键的hashCode值存储数据,根据键快速定位到值。由于使用了哈希表的存储方式,HashMap通常能够提供较快的读写性能。它的遍历顺序是...
- Map接口代表键值对容器,常见实现类有HashMap、Hashtable、LinkedHashMap和TreeMap。 - 自定义数据结构通常涉及实现以上接口或抽象类,以满足特定需求。 理解并熟练掌握这些基础概念,对于成为一名合格的Java...