hashtable是什么

hashtable是什么,第1张

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怎样存储数据和读取数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9803776.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存