欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

hashmap hashtable hashset和map的区别

程序员文章站 2022-03-08 22:49:16
...

面试可能会遇到,这里参考别人的回答总结一下:

概念:

map接口中,键和值一一对应,可以通过键来获取值。

  • 给定一个键和一个值,你可以将该值存储在一个Map对象. 之后,你可以通过键来访问对应的值。
  • 当访问的值不存在的时候,方法就会抛出一个NoSuchElementException异常.
  • 当对象的类型和Map里元素类型不兼容的时候,就会抛出一个 ClassCastException异常。
  • 当在不允许使用Null对象的Map中使用Null对象,会抛出一个NullPointerException 异常。
  • 当尝试修改一个只读的Map时,会抛出一个UnsupportedOperationException异常

clear()、containsKey(Object k)、containsValue(Object v)、entrySet()、equal()、 get()、hashCode()、isEmpty()、 keySet()、 put(Object k,Object k)、putAll(Map m)、remove(Object k)、size()、Collection values()

mport java.util.*;

public class CollectionsDemo {

   public static void main(String[] args) {
      Map m1 = new HashMap(); 
      m1.put("Zara", "8");
      m1.put("Mahnaz", "31");
      m1.put("Ayan", "12");
      m1.put("Daisy", "14");
      System.out.println();
      System.out.println(" Map Elements");
      System.out.print("\t" + m1);
   }
}

编译结果:
Map Elements
       {Mahnaz=31,Ayan=12,Daisy=14,Zara=8}

Hashtable在哈希表中存储键值对,当时用一个哈希表,要指定用作键的对象,以及要链接到该键的值,然后该键通过哈希处理,所得到的散列码被用作存储在该表中值得索引。有四种构造方法Hashtable()   Hashtable(int size)  Hashtable(int size,float fillRatio)   Hashtable(Map m)

clear()、clone()、containsKey(Object k)、containsValue(Object v)、Enumerationelements()、 get()、isEmpty()、 keys()、 put(Object k,Object value)、rehash()、remove(Object k)、size()、toString()

import java.util.*;

public class HashTableDemo {

   public static void main(String args[]) {
      // Create a hash map
      Hashtable balance = new Hashtable();
      Enumeration names;
      String str;
      double bal;

      balance.put("Zara", new Double(3434.34));
      balance.put("Mahnaz", new Double(123.22));
      balance.put("Ayan", new Double(1378.00));
      balance.put("Daisy", new Double(99.22));
      balance.put("Qadir", new Double(-19.08));

      // Show all balances in hash table.
      names = balance.keys();
      while(names.hasMoreElements()) {
         str = (String) names.nextElement();
         System.out.println(str + ": " +
         balance.get(str));
      }
      System.out.println();
      // Deposit 1,000 into Zara's account
      bal = ((Double)balance.get("Zara")).doubleValue();
      balance.put("Zara", new Double(bal+1000));
      System.out.println("Zara's new balance: " +
      balance.get("Zara"));
   }
}

编译结果:
Qadir:-19.08
Zara:3434.34
Mahnaz:123.22
Daisy:99.22
Ayan:1378.0

Zara's new balance:4434.34

hashMap是基于哈希表的Map接口的非同步实现,此实现提供所有可先的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是他不保证该顺序恒久不变。hashmap实际上是一个“链表散列”的数据结构、即数组和链表的结合体.

简单的来说,hashmap在底层将key-value当成一个整体来处理,这个整体就是一个entry对象,hashmap底层采用一个entry[]数组来保存所有的keu-value对,当需要存储一个entry对象时,会根据hash算法。来决定其在数组中的存储位置,在根据equals方法决定其在该数组位置上的链表中的存储位置;当需要取出一个entry时i,也会根据hash算法找到其在数组中的存储位置,再根据equals方法从该位置上的链表中取出entry。原文地址:http://wiki.jikexueyuan.com/project/java-collection/hashmap.html

hashmap hashtable hashset和map的区别

对于查找,添加等操作很快,仅需一次寻址即可,如果定位到的数组不含链表,对于添加查找操作操作很快,无序遍历。如果含有链表,需要先遍历链表,存在即覆盖,否则新增。对于查找操作,仍需遍历链表,然后通过key对象的equals方法逐一对比查找。所以,性能考虑,链表越少越好。 (这个hashmap有点麻烦啊)原文:https://www.cnblogs.com/chengxiao/p/6059914.html

hashset主要用来设计高性能及运算的,例如对两个集合求交集、并集、差集等。集合中包含一组不重复出现切勿特性顺兴的元素。原文http://www.cnblogs.com/kissdodog/archive/2013/02/02/2889887.html

1. hashset中的值不能重复且没有顺序
2. 容量会按需自动添加

 static void Main(string[] args)
        {
            HashSet<string> hs = new HashSet<string>();
            hs.Add("你");
            hs.Add("好");
            hs.Add("吗");
            HashSet<string> hs1 = new HashSet<string>();
            hs1.Add("你");
            hs1.Add("好");

            bool b = hs1.IsProperSubsetOf(hs);  //确定hs1是否是hs的真子集
            Console.WriteLine(b);       //输出True


            HashSet<string> hs2 = new HashSet<string>();
            hs2.Add("爱你");
            IEnumerable<string> list = hs.Union(hs2);   //返回并集
            foreach (string str in list)
            {
                Console.WriteLine(str);     //输出 你 好 吗 爱你
            }

            Console.ReadKey();
        }

区别:

继承的父类不同:

hashtable继承dictionary类,hashmap继承abstractmap类,但两者都实现了map接口

public class HashTable<K,V> extends Dictionary<K,V>
implement Map<K,V>,Cloneable, Serializable

public class HashMap<K,V> extends AbstractMap<K,V>
implement Map<K,V>,Cloneable,Serializable

线程安全性不同:

hashTable中的方法是synchronized的,而hashmap中的方法在缺省情况下是非synchronized的。

是否提供contains方法:

hashmap去掉了contains方法,改成了containsKey方法和containsValue方法,hashtable保留了contains,containsValue和containsKey方法,其中contains和containsValue功能相同。

key和value是否允许null值:

hashtable中都不允许出现null值,hashmap中,null可以作为主键;可以有一个或多个键所对应的值为null。当get()返回null时,可能是没有这个主键,也有可能是对应的值为null,所以只能用containsKey()来判断是否存在某个键。(这个面试官喜欢问)

哈希值的计算方法不同,hashtable直接使用的是对象的hashcode,而hashmap则是在hashcode的基础上进行了一些变化。

//Hashtable中可以看出的是直接采用关键字的hashcode作为哈希值
    int hash = key.hashCode();
    //然后进行模运算,求出所在哗然表的位置 
    int index = (hash & 0x7FFFFFFF) % tab.length;
//HashMap中的实现
   //这两行代码的意思是先计算hashcode,然后再求其在哈希表的相应位置      
    int hash = hash(key.hashCode());
    int i = indexFor(hash, table.length);
    static int hash(int h) {
     // This function ensures that hashCodes that differ only by
     // constant multiples at each bit position have a bounded
     // number of collisions (approximately 8 at default load factor).
        h ^= (h >>> 20) ^ (h >>> 12);
        return h ^ (h >>> 7) ^ (h >>> 4);
    }
   //求位于哈希表中的位置
    static int indexFor(int h, int length) {
        return h & (length-1);
    }

内部实现使用的数组初始化和扩容方式不同,内存初始化大小不同。hashtable的初始大小是11,hashmao初始大小是16

hashmap和hashset的区别

hashmao是map的一个实现类,hashset是set的一个实现类,同时,hahsmao是hashset的一个替代品,

hashset以对象为元素,hashmap以一组对象(key-value)为元素,前者拒绝接受重复的对象,后者可以看错三个视图。key的set,value的collection,entry的set,这里hashset就是hashmap的一个视图。

hashset就是使用hashmap实现的,和hashmap不同的是它不需要key和value两个值,往hashset里面插入对象其实就是

public boolean add(object o){
       return map.put(o,PRESENT)==null;
}
java中的集合 有序 允许元素重复
collection
list    
set abstractSet
hashSet
treeSet
map abstractMap 使用key-value来映射和存储数据,key必须唯一,value可以重复
hashMap
TreeMap

 

  父类 线程安全性 是否提供contains方法

是否允许null值

遍历方式 初始大小
hashtable distionary synchronized 否(containKey和containValue) Iterator、Enumeration

11、old

*2+1

hashmap abstractmap 非synchronized 是(containsKey、containsValue、contains) Iterator 16、2的指数
hashSet set的实现类          

hashMap

map的实现类

         

https://blog.csdn.net/wulunbi/article/details/51105028

相关标签: java面试题