Hashtable 类基于 IDictionary 接口,因此该集合中的每一元素是键和值对。
Hashtable 由包含集合元素的存储桶组成。存储桶是 Hashtable 中各元素的虚拟子组,与大多数集合中进行的搜索和检索相比,它可令搜索和检索更简单、更快速。每一存储桶都与一个哈希代码关联,该哈希代码是使用哈希函数生成的并基于该元素的键。
哈希函数是基于键返回数值哈希代码的算法。键是正被存储的对象的某一属性的值。哈希函数必须始终为相同的键返回相同的哈希代码。一个哈希函数能够为两个不同的键生成相同的哈希代码,但从哈希表检索元素时,为每一唯一键生成唯一哈希代码的哈希函数将令性能更佳。
在 Hashtable 中用作元素的每一对象必须能够使用 ObjectGetHashCode 方法的实现为其自身生成哈希代码。但是,还可以通过使用 Hashtable 构造函数(该构造函数将 IHashCodeProvider 实现作为其参数之一接受),为 Hashtable 中的所有元素指定一个哈希函数。
在将一个对象添加到 Hashtable 时,它被存储在存储桶中,该存储桶与匹配该对象的哈希代码的哈希代码关联。当在 Hashtable 内搜索一个值时,为该值生成哈希代码,并且搜索与该哈希代码关联的存储桶。
例如,一个字符串的哈希函数可以采用该字符串中每一字符的 ASCII 代码并它们添加到一起来生成一个哈希代码。字符串“picnic”将具有与字符串“basket”的哈希代码不同的哈希代码;因此,字符串“picnic”和“basket”将处于不同的存储桶中。与之相比,“stressed”和“desserts”将具有相同的哈希代码并将处于相同的存储桶中。
using System;
using SystemCollections;
public class SamplesHashtable
{
public static void Main()
{
// Creates and initializes a new Hashtable
Hashtable myHT = new Hashtable();
myHTAdd( "First ", "3 ");
myHTAdd( "Second ", "2 ");
myHTAdd( "Third ", "1 ");
// Displays the properties and values of the Hashtable
ConsoleWriteLine( "myHT " );
ConsoleWriteLine( " Count: {0} ", myHTCount );
ConsoleWriteLine(myHT[ "First "]);//也可以这它!
ConsoleWriteLine( " Keys and Values: " );
PrintKeysAndValues( myHT );
}
public static void PrintKeysAndValues( Hashtable myList )
{
IDictionaryEnumerator myEnumerator = myListGetEnumerator();
ConsoleWriteLine( "\t-KEY-\t-VALUE- " );
while ( myEnumeratorMoveNext() )
ConsoleWriteLine( "\t{0}:\t{1} ", myEnumeratorKey, myEnumeratorValue);
}
}
一、Map
map接口,集合类的接口,声明了map的常用方法。所有的map都继承自改接口
二、javaioSerializable接口,
接口里没有声明任何方法,该接口用来实现对象的序列化反序列化功能
三、javalangCloneable
接口里没有声明任何方法,该接口实现对象复制功能
四 AbstractMap
重要的类:AbstractMap<K,V>
AbstractMap抽象类实现了一些简单且通用的方法,
在这个抽象类中有两个方法非常值得关注,keySet和values方法源码的实现可以说是教科书式的典范。
抽象类通常作为一种骨架实现,为各自子类实现公共的方法。
Java中Map类型的数据结构有相当多,AbstractMap作为它们的骨架实现实现了Map接口部分方法,也就是说为它的子类各种Map提供了公共的方法,没有实现的方法各种Map可能有所不同。
抽象类不能通过new关键字直接创建抽象类的实例,但它可以有构造方法。AbstractMap提供了一个protected修饰的无参构造方法,意味着只有它的子类才能访问(当然它本身就是一个抽象类,其他类也不能直接对其实例化),也就是说只有它的子类才能调用这个无参的构造方法。
在Map接口中其内部定义了一个Entry接口,这个接口是Map映射的内部实现用于维护一个key-value键值对,key-value存储在这个MapEntry中。AbstractMap对这个内部接口进行了实现,一共有两个:一个是可变的SimpleEntry和一个是不可变的SimpleImmutableEntry。
1 SimpleEntry
11 定义
实现了MapEntry<K, V>接口,并且实现了Serializable(可被序列化)。它的方法比较简单都是取值存值的 *** 作,对于key值的定义是一个final修饰意味着是一个不可变的引用。
12 setValue
ll另外其setValue方法稍微特殊,存入value值返回的并不是存入的值,而是返回的以前的旧值。
源码:
13 equals和hashCode
需要重点学习的是它重写的equals和hashCode方法。
eq方法
要想正确重写equals方法并能正确使用,通常还需要重写hashCode方法。因为集合中的元素,判断是否一样时,先hash再equals,这也是个知识点,详细的,学习一下原理。
hashcode源码:可以看成求hashcode值时,即返回的int数据,是keyhashCode() ^ valuehashCode(),即key、value的hashcode值异或
2 SimpleImmutableEntry
21 定义
源码:
它相比于SimpleEntry其key和value成员变量都被定义为了final类型。即定义为不可变的Entry,不提供setValue方法,不能通过setValue方法进行修改。
22 setValue
调用setValue方法将会抛出UnsupportedOperationException异常。即定义为不可变的Entry,不提供setValue方法,不能通过setValue方法进行修改。
它的equals和hashCode方法和SimpleEntry一致。
3 实现的Map接口方法
接下来查看AbstractMap抽象类实现了哪些Map接口中的方法。
31 public int size()
Map中定义了一个entrySet方法,返回的是MapEntry的Set集合,直接调用Set集合的size方法即是Map的大小。
32 public boolean isEmpty()
调用size方法,等于0即为空。
33 public boolean containsValue(Object value)
这个方法的实现较为简单,通过调用entrySet方法获取Set集合的迭代器遍历MapEntry,获取对应的value与参数value比较。Map可以存储为null的value值,由于value=null在Map中存储比较特殊(不能计算hashCode值),所以在这里也做了判断参数value是否为空。
public boolean containsKey(Object key)
这个方法实现和containsValue一致。
34 public V get(Object key)
这个方法实现和containsValue类似,不同的是上面相等返回boolean,这个方法返回value值。
35 public V put(K key, V value)
向Map中存入key-value键值对的方法并没有具体实现,会直接抛出一个UnsupportedOperationException异常。
6 public V remove(Object key)
通过参数key删除Map中指定的key-value键值对。这个方法也很简单,也是通过迭代器遍历MapEntry的Set集合,找到对应key值,通过调用 Iteratorremove() 方法删除MapEntry。
7 public void putAll(Map< extends K, extends V> m)
这个方法也很简单遍历传入的Map,调用put方法存入就可以了。
public void clear()
调用entrySet方法获取Set集合再调用Set#clear()方法清空。
keyset
返回Map key值的Set集合。AbstractMap中定义了一个成员变量“transient Set<K> keySet”,在JDK7中keySet变量是由volatile修饰的,但在JDK8中并没有使用volatile修饰。在对keySet变量的注释中解释道,访问这些字段的方法本身就没有同步,加上volatile也不能保证线程安全。关于keySet方法的实现就有点意思了。
首先思考该方法是返回key值的Set集合,很自然的能想到一个简单的实现方式,遍历Entry数组取出key值放到Set集合中,类似下面代码:
这就意味着每次调用keySet方法都会遍历Entry数组,数据量大时效率会大大降低。不得不说JDK源码是写得非常好,它并没有采取遍历的方式。如果不遍历Entry,那又如何知道此时Map新增了一个key-value键值对呢?
答案就是在keySet方法内部重新实现了一个新的自定义Set集合,在这个自定义Set集合中又重写了iterator方法,这里是关键,iterator方法返回Iterator接口,而在这里又重新实现了Iterator迭代器,通过调用entrySet方法再调用它的iterator方法。下面结合代码来分析:
五、 Dictionary
Dictionary 类是一个抽象类,用来存储键/值对,作用和Map类相似。
给出键和值,你就可以将值存储在Dictionary对象中。一旦该值被存储,就可以通过它的键来获取它。所以和Map一样, Dictionary 也可以作为一个键/值对列表。Dictionary类已经过时了。在实际开发中,你可以实现Map接口来获取键/值的存储功能。
打开CSDN,阅读体验更佳
HashMap、TreeMap、Hashable和LinkedHashMap_kgduu的博客
HashMap、TreeMap、Hashable和LinkedHashMap Map是最重要的数据结构之一。开始会告诉怎么用HashMap、TreeMap、Hashtable和LinkedHashMap 1、Map概述 在Java SE中有4种Map的实现:HashMap、TreeMap、Hashtable和LinkedHashMap HashMap:用哈
继续访问
Python 接口:从协议到抽象基类_weixin_30492047的博客
首先,基本的事实是,Python语言没有 interface 关键字,而且除了抽象基类,每个类都有接口:类实现或继承的公开属性(方法或数据属性),包括特殊方法,如__getitem__ 或 __add__。 按照定义,受保护的属性和私有属性不在接口中:即便“受保护
继续访问
最新发布 Java集合(九)HashMap接口
HashMap小结:(1)Map接口的常用实现类:HashMap、Hashtable和Properties(2)HashMap是Map接口使用频率最高的实现类(3)HashMap是以key-val对的方式来存储数据(HashMap$Node类型)(4)key不能重复,但是值可以重复,允许使用null键和null值(5)如果添加相同的key,则会覆盖原来的key-val,等同于修改(key不会替换,val会替换)我们来把断点放在mapput("no1","张三丰“);
继续访问
Hashtable和HashMap的异同
Hashtable和HashMap两者的原理相同,功能相同,很多情况下可以互用。 Hashtable和HashMap的主要区别如下: 1、Hashtable继承自Dictionary类,而HashMap实现了Map接口 2、Hashtable线程安全,HashMap重速度、轻安全,是线程非安全的,所以当运行到线程环境中时,需要程序员自己管理线程的同步问题。 3、Hashtable不允许null值(key和value都不允许),HashMap允许null值(key和value都允许) 其他异同点可参照博客:
继续访问
Hashable / Hasher_weixin_33909059的博客
哈希函数的选择应该作为实现细节,而不是设计中的固定部分;因此,使用者不应该依赖于编译器自动生成的 Hashable 函数的具体特征。最可能的实现是在每个成员的哈希值上调用标准库中的_mixInt函数,然后将他们逻辑异或(^),如同目前Collection类
继续访问
php的数据结构_PHP 的数据结构扩展_myh991235的博客
Sequence 是类数组数据结构的基础接口,定义了很多重要且方便的方法,比如 contains, map, filter, reduce, find, first, last 等。从图中可知,Vector, Deque, Stack, Queue 都直接或者间接的实现了这个接口。 Hashable 在图中看起来比
继续访问
33Java之Map接口实现类(HashMap、HashTable、Properties、TreeSet 和 TreeMap基本介绍,HashMap 底层机制)
Map 接口的常用实现类:HashMap、Hashtable 和 Properties 331 HashMap 基本介绍 是 Map 接口使用频率最高的实现类 是以 Key-value 的方式来存储数据(HashMap$Node类型) Key 不能重复,但是值可以重复,允许使用 Null 键和 Null 值 如果添加相同的 Key,则会覆盖原来的 Key-value,等同于修改(Key不会替换,value会替换) 与 HashSet 一样,不保证映射的顺序(即添加顺序与输出顺序不一样),因为底层是以
继续访问
Map接口:HashMap与HashTable的区别
1)HashMap和Hashtable都实现了Map接口,但是继承的父类不同: public class Hashtable extends Dictionary implements Map public class HashMap extends AbstractMap implements Map2)HashMap是非synchronized,执行速度快,而HashTab
继续访问
php7 唯一数字_PHP7中高效的数据结构_王雷Neo的博客
实现Hashable接口的数据结构是Map和Set。 Map 一个Map 是一个键值对的连续集合,和数组几乎一致。键可以是任何类型,但是必须唯一。 强项: 性能和内存效率和数组几乎一致 当长度降低的时候自动释放内存
继续访问
java常见笔试_Java 常见笔试题(2)_weixin_39998462的博客
javautilHashtable实现了哪个接口 A javautilMap B javautilList C javautilHashable D javautilCollection 9 1 class A implements Runnable{ 2 int i; 3
继续访问
实现原理_HashTable实现原理
概要前一章,我们学习了HashMap。这一章,我们对Hashtable进行学习。我们先对Hashtable有个整体认识,然后再学习它的源码,最后再通过实例来学会使用Hashtable。第1部分 Hashtable介绍第2部分 Hashtable数据结构第3部分 Hashtable源码解析(基于JDK160_45)第4部分 Hashtable遍历方式第5部分 Hashtable示例转载请注明出处
继续访问
Hashtable源码分析
前言:Hashtable线程安全的集合类,虽然它线程安全,然而在日常开发中使用的频率很低,毕竟锁的颗粒度太大了。但是这并不妨碍我们对其内部原理进行了解。 注:本文jdk源码版本为jdk180_172。 1Hashtable基本概念 Hashtable与HashMap一样,都是以键值对的形式存储数据。但是Hashtable的键值不能为null,而HashMap的键值是可以为
继续访问
Swift自定义Class实现Hashable_weixin_30273763的博客
增加代码后,发现编译器依然报错"Type 'Bit' does not conform to protocol 'Equatable'"-没有实现Equatable协议。 2实现Equatable Commend+click点击Hashable定义,进入后再点击Equatable协议定义,可以看到如下定义:
继续访问
Array,Vertor,Arraylist,Hashable,Hashmap等几个易混淆的概念_tjjhz
1历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java12引进的Map接口的一个实现 2同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的
继续访问
Hashtable简述
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
继续访问
Map接口与实现类HashTable
Map接口与实现类HashTable 源码位置 rtjar/javautil包下 源码类 public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, javaioSerializable 特点 1、集合中key不能重复,若put时集合已含有此key,那新值会替换旧值;key,value不能为null 2、HashTable/Map中存放数
继续访问
Java面试知识整理_加温的啤酒的博客_java面试知识整理
都实现了list接口,都是有序的 vector线程是安全的,arraylist线程是不安全的 vector数据增长是原来的一倍,arraylist是数据增长是原来的05倍 hashmap和hashable的区别 hashmap是hashable的轻量级实现,hashmap允许空键值,hashable不允许
继续访问
javase基础知识总结_id_1314520的博客
interface接口: 默认所有方法都是抽象的,并且public修饰的 属性: 默认为public修饰的常量(public final修饰的) abstract抽象类: 类名被abstract修饰的类; 里面可以有抽象方法, 也可以没有抽象方法; 实现接口类,可以重写也可以不重写接口
继续访问
集合—Map接口实现类-Hashtable
本次博客带领大家学习集合中的Map接口实现类-Hashtable。
继续访问
Hashtable 和 HashMap
HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别。主要的区别有:线程安全性,同步(synchronization),以及速度。 1HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行)。 2
继续访问
hashMap和hashTable的区别以及HashMap的底层原理?
hashMap和hashTable的区别? 1、继承的父类不同 HashTable继承Dictionary类,而hashMap继承了AbstractMap类,但是二者都实现了map接口。 2、线程安全性不同 Hashtable 线程安全,因为它每个方法中都加入了Synchronize。HashMap是线程不安全的。 HashMap底层是一个Entry数组,当发生hash冲突的时候,ha
继续访问
java---Map接口的实现类HashMap和Hashtable
package LyfPractice;import javautil;/ Created by fangjiejie on 2016/12/19 / /Hashmap和Hashtable的区别 1相同:都实现了Map接口,实现了key和value的保存与映射,有很多相同的方法 2不同: Hashmap:是map接口的实现类 ,非同步,线程不安全 ,速度快,可以有
继续访问
Map 接口实现类-Hashtable
Map 接口实现类-Hashtable
继续访问
29 Map接口继承关系 / Map接口概述 / HashMap底层实现原理及相关知识 / Map常用方法 / TreeMap、Properties
Map接口继承关系 Map接口概述 Map与Collection并列存在。用于保存具有映射关系的数据:key-value Map 中的 key 和 value 都可以是任何引用类型的数据 Map 中的 key 用Set来存放, 不允许重复,即同一个 Map 对象所对应 的类,须重写hashCode()和equals()方法 常用String类作为Map的“键” key 和 value 之间存在单向一对一关系,即通过指定的 key 总能找到 唯一的、确定的 value Map接口的常用实现类: HashM
继续访问
Map接口的实现类----HashMap
Map接口的实现类----HashMap。
继续访问
JAVA基础 接口与继承 HashMap使用
>
Hashtable-哈希表类\x0d\\x0d\以哈希表的形式存储数据,数据的形式是键值对\x0d\特点:\x0d\查找速度快,遍历相对慢\x0d\键值不能有空指针和重复数据\x0d\\x0d\创建\x0d\Hashtable ht=new \x0d\Hashtable();\x0d\\x0d\添值\x0d\\x0d\htput(1,"Andy");\x0d\htput(2,"Bill");\x0d\htput(3,"Cindy");\x0d\htput(4,"Dell");\x0d\htput(5,"Felex");\x0d\htput(6,"Edinburg");\x0d\htput(7,"Green");\x0d\\x0d\取值\x0d\\x0d\String str=htget(1);\x0d\Systemoutprintln(str);// Andy\x0d\\x0d\对键进行遍历\x0d\\x0d\Iterator it = htkeySet()iterator();\x0d\\x0d\while (ithasNext()) {\x0d\ Integer key = (Integer)itnext();\x0d\ \x0d\Systemoutprintln(key);\x0d\}\x0d\\x0d\对值进行遍历\x0d\\x0d\Iterator it = htvalues()iterator();\x0d\\x0d\while (ithasNext()) {\x0d\ String value =(String) itnext();\x0d\ \x0d\Systemoutprintln(value);\x0d\}\x0d\\x0d\取Hashtable记录数\x0d\\x0d\Hashtable ht=new Hashtable();\x0d\\x0d\htput(1,"Andy");\x0d\htput(2,"Bill");\x0d\htput(3,"Cindy");\x0d\htput(4,"Dell");\x0d\htput(5,"Felex");\x0d\htput(6,"Edinburg");\x0d\htput(7,"Green");\x0d\\x0d\int i=htsize();// 7\x0d\\x0d\删除元素\x0d\\x0d\Hashtable ht=new Hashtable();\x0d\\x0d\htput(1,"Andy");\x0d\htput(2,"Bill");\x0d\htput(3,"Cindy");\x0d\htput(4,"Dell");\x0d\htput(5,"Felex");\x0d\htput(6,"Edinburg");\x0d\htput(7,"Green");\x0d\\x0d\htremove(1);\x0d\htremove(2);\x0d\htremove(3);\x0d\htremove(4);\x0d\\x0d\Systemoutprintln(htsize());// 3\x0d\\x0d\Iterator it = htvalues()iterator();\x0d\\x0d\while (ithasNext()) {\x0d\ // Get value\x0d\ String value =(String) \x0d\itnext();\x0d\ Systemoutprintln(value);\x0d\}
Java为数据结构中的映射定义了一个接口javautilMap,
它有四个实现类,分别是HashMap、HashTable、LinkedHashMap和TreeMap。
这里介绍这4中实例的用法和区别。
关键技术剖析:
Map用于存储键值对,根据键得到值,因此不允许键重复,值可以重复。
l (1)HashMap是一个最常用的Map,它根据键的hashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为null,不允许多条记录的值为null。HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致。如果需要同步,可以用CollectionssynchronizedMap(HashMap map)方法使HashMap具有同步的能力。
l (2)Hashtable与HashMap类似,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,然而,这也导致了Hashtable在写入时会比较慢。
l (3)LinkedHashMap保存了记录的插入顺序,在用Iteraor遍历LinkedHashMap时,先得到的记录肯定是先插入的。在遍历的时候会比HashMap慢。有HashMap的全部特性。
l (4)TreeMap能够把它保存的记录根据键排序,默认是按升序排序,也可以指定排序的比较器。当用Iteraor遍历TreeMap时,得到的记录是排过序的。TreeMap的键和值都不能为空。
import javautilHashMap;
import javautilHashtable;
import javautilIterator;
import javautilLinkedHashMap;
import javautilMap;
import javautilTreeMap;
public class TestMap {
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";
mapput(key, keytoString());
//Map中的键是不重复的,如果插入两个键值一样的记录,
//那么后插入的记录会覆盖先插入的记录
mapput(key, keytoString() + "0"); }
}
}
public static void output(Map map){
if (map != null){
Object key = null;
Object value = null;
//使用迭代器遍历Map的键,根据键取值
Iterator it = mapkeySet()iterator();
while (ithasNext()){
key = itnext();
value = mapget(key);
Systemoutprintln("key: " + key + "; value: " + value );
}
//或者使用迭代器遍历Map的记录MapEntry
MapEntry entry = null;
it = mapentrySet()iterator();
while (ithasNext()){
//一个MapEntry代表一条记录
entry = (MapEntry)itnext();
//通过entry可以获得记录的键和值
//Systemoutprintln("key: " + entrygetKey() + "; value: " + entrygetValue());
}
}
}
public static boolean containsKey(Map map, Object key){
if (map != null){
return mapcontainsKey(key);
}
return false;
}
public static boolean containsValue(Map map, Object value){
if (map != null){
return mapcontainsValue(value);
}
return false;
}
public static void testHashMap(){
Map myMap = new HashMap();
init(myMap);
//HashMap的键可以为null
myMapput(null,"ddd");
//HashMap的值可以为null
myMapput("aaa", null);
output(myMap);
}
public static void testHashtable(){
Map myMap = new Hashtable();
init(myMap);
//Hashtable的键不能为null
//myMapput(null,"ddd");
//Hashtable的值不能为null
//myMapput("aaa", null);
output(myMap);
}
public static void testLinkedHashMap(){
Map myMap = new LinkedHashMap();
init(myMap);
//LinkedHashMap的键可以为null
myMapput(null,"ddd");
myMapput(null,"aaa");
//LinkedHashMap的值可以为null
myMapput("aaa", null);
output(myMap);
}
public static void testTreeMap(){
Map myMap = new TreeMap();
init(myMap);
//TreeMap的键不能为null
//myMapput(null,"ddd");
//TreeMap的值不能为null
//myMapput("aaa", null);
output(myMap);
}
public static void main(String[] args) {
Systemoutprintln("采用HashMap");
TestMaptestHashMap();
Systemoutprintln("采用Hashtable");
TestMaptestHashtable();
Systemoutprintln("采用LinkedHashMap");
TestMaptestLinkedHashMap();
Systemoutprintln("采用TreeMap");
TestMaptestTreeMap();
Map myMap = new HashMap();
TestMapinit(myMap);
Systemoutprintln("新初始化一个Map: myMap");
TestMapoutput(myMap);
//清空Map
myMapclear();
Systemoutprintln("将myMap clear后,myMap空了么 " + myMapisEmpty());
TestMapoutput(myMap);
myMapput("aaa", "aaaa");
myMapput("bbb", "bbbb");
//判断Map是否包含某键或者某值
Systemoutprintln("myMap包含键aaa "+ TestMapcontainsKey(myMap, "aaa"));
Systemoutprintln("myMap包含值aaaa "+ TestMapcontainsValue(myMap, "aaaa"));
//根据键删除Map中的记录
myMapremove("aaa");
Systemoutprintln("删除键aaa后,myMap包含键aaa "+ TestMapcontainsKey(myMap, "aaa"));
//获取Map的记录数
Systemoutprintln("myMap包含的记录数: " + myMapsize());
}
}
输出结果:
采用HashMap
key: null; value: ddd
key: 30; value: 300
key: aaa; value: null
key: 40; value: 400
key: 10; value: 100
key: 50; value: 500
key: 20; value: 200
采用Hashtable
key: 40; value: 400
key: 10; value: 100
key: 30; value: 300
key: 50; value: 500
key: 20; value: 200
采用LinkedHashMap
key: 50; value: 500
key: 40; value: 400
key: 30; value: 300
key: 20; value: 200
key: 10; value: 100
key: null; value: aaa
key: aaa; value: null
采用TreeMap
key: 10; value: 100
key: 20; value: 200
key: 30; value: 300
key: 40; value: 400
key: 50; value: 500
新初始化一个Map: myMap
key: 30; value: 300
key: 40; value: 400
key: 10; value: 100
key: 50; value: 500
key: 20; value: 200
将myMap clear后,myMap空了么 true
myMap包含键aaa true
myMap包含值aaaa true
删除键aaa后,myMap包含键aaa false
myMap包含的记录数: 1
源码分析:
遍历Map有两种方法:
(1)map的keySet()方法获得键的集合,再调用键集合的iterator方法获得键的迭代器,以此迭代地取出Map中的键,用get方法获得键对应的值,便完成了Map的遍历。代码如下所示:
//使用迭代器遍历Map的键,根据键取值
Iterator it = mapkeySet()iterator();
while (ithasNext()){
key = itnext();
value = mapget(key);
Systemoutprintln("key: " + key + "; value: " + value );
}
(2)使用Map的entrySet方法获得Map中记录的集合,每条对象都是一个MapEntry对象,使用其getKey方法获得记录的键,使用其getValue方法获得记录的值。代码如下所示:
//或者使用迭代器遍历Map的记录MapEntry
MapEntry entry = null;
it = mapentrySet()iterator();
while (ithasNext()){
//一个MapEntry代表一条记录
entry = (MapEntry)itnext();
//通过entry可以获得记录的键和值
//Systemoutprintln("key: " + entrygetKey() + "; value: " + entrygetValue());
以上就是关于hashtable是什么全部的内容,包括:hashtable是什么、java.util.hashtable实现了哪个interface、java中hashtable怎样存储数据和读取数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)