精华内容
下载资源
问答
  • HashMap不能保证元素的顺序,HashMap能够将设为null,也可以将设为null。 与之对应的是Hashtable,(注意大小写:不是HashTable),Hashtable不能将键和值设为null,否则运行时会报空指针异常错误; HashMap线程不...

    HashMap不能保证元素的顺序,HashMap能够将键设为null,也可以将值设为null

    与之对应的是Hashtable,(注意大小写:不是HashTable),Hashtable不能将键和值设为null,否则运行时会报空指针异常错误;

    HashMap线程不安全,Hashtable线程安全

    转载于:https://www.cnblogs.com/wwb0811/p/9602157.html

    展开全文
  • 先说结论:hashmap允许多个null值和一个null键,hashtable不允许有任何null值和null键 基于jdk1.8源码分析: 我们都知道Map作为集合中比较重要的键值对集合,key不能重复,所以可以初步判断hashmaphashtable都不...

    项目场景:

    即使不跳槽也要多去看看面试题,学习底层源码
    先说结论:hashmap允许多个null值和一个null键,hashtable不允许有任何null值和null键


    基于jdk1.8源码分析:

    我们都知道Map作为集合中比较重要的键值对集合,key不能重复,所以可以初步判断hashmap和hashtable都不能同时拥有多个null键。
    先看hashmap

     public V put(K key, V value) {
            return putVal(hash(key), key, value, false, true);
        }
        //使用本类的putVal方法去执行底层操作(这个底层等在hashmap源码中再研究,此次研究hash(key)这个方法)
        //如果key为null,则默认为0,顺便说下这个异或运算。
        //当去获取一个hash值时,要去和hash的高位去做一个异或运算是为了保证散列的均匀性。
        //其中hash值底层实现是用了一个质数31去获取。
        //第一是质数能减少hash冲突,第二是31可以被jvm优化,底层有个公式31 * i = (i << 5) - i
     static final int hash(Object key) {
            int h;
            return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
        }
        
    

    get操作同样用到hash()
    所以hashmap允许一个null键,和多个NULL值


    再看hashtable

     public synchronized V put(K key, V value) {
            // Make sure the value is not null
            if (value == null) {
                throw new NullPointerException();
            }
    
            // Makes sure the key is not already in the hashtable.
            Entry<?,?> tab[] = table;
            //此处是不为null键的原因
            int hash = key.hashCode();
            int index = (hash & 0x7FFFFFFF) % tab.length;
            @SuppressWarnings("unchecked")
            Entry<K,V> entry = (Entry<K,V>)tab[index];
            for(; entry != null ; entry = entry.next) {
                if ((entry.hash == hash) && entry.key.equals(key)) {
                    V old = entry.value;
                    entry.value = value;
                    return old;
                }
            }
    
            addEntry(hash, key, value, index);
            return null;
        }
    

    这里先看一半,在put操作时,首先判断值是否为null,如果是null则跑出空指针异常,所以hashtable不允许null值。
    再往下来
    int hash = key.hashCode();此处如果key为null也会报空指针异常
    所以总结hashtable不允许任何null值和null建

    展开全文
  • 1.HashMap支持null键和nullJSE6.0描述:基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)...

    1.HashMap支持null键和null值

    JSE6.0描述:基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 

    import java.util.HashMap;
    
    public class testHashMap {
    	public static void main(String[] args) {
    		HashMap<String, Integer> hs = new HashMap<String, Integer>();
    		hs.put("一", 1);
    		hs.put("二", 2);
    		hs.put("三", null);
    		hs.put(null, null);
    
    		// 都可以存取null,所以不可以通过ge()返回值来判断键是否为null
    		System.out.println(hs.get("三"));
    		System.out.println(hs.get(null));
    	}
    }

    结果:

    null
    null

    为什么可以:HashMap不需要排序,get()方法不依赖于键

    public V get(Object key) {
            Iterator<Entry<K,V>> i = entrySet().iterator();
            if (key==null) {
                while (i.hasNext()) {
                    Entry<K,V> e = i.next();
                    if (e.getKey()==null)
                        return e.getValue();
                }
            } else {
                while (i.hasNext()) {
                    Entry<K,V> e = i.next();
                    if (key.equals(e.getKey()))
                        return e.getValue();
                }
            }
            return null;
        }

    2.TreeMap不支持null键,但是支持null值

    import java.util.TreeMap;
    
    public class testTreeMap {
    	public static void main(String[] args) {
    		Map<String, Integer> ts = new TreeMap<>();
    		ts.put("一", 1);
    		ts.put("二", 2);
    		ts.put("三", null);
    		// ts.put(null, 4);
    		System.out.println(ts.get("三"));
    		// System.out.println(ts.get(null));
    	}
    }
    结果:
    null

    去掉注释结果:

    Exception in thread "main" java.lang.NullPointerException
    	at java.util.TreeMap.put(TreeMap.java:563)
    	at shangjizuoye.testTreeMap.main(testTreeMap.java:11)

    虽然可以通过自己构建比较器来实现存入null键但是get()方法不可用

    import java.util.Comparator;
    import java.util.Map;
    import java.util.TreeMap;
    
    public class testTreeMap {
    	public static void main(String[] args) {
    	       Map<String, Integer> ts = new TreeMap<>(new Comparator<String>() {
    	            public int compare(String s1, String s2) {      // 这里明确s1是要拿进来存的数据 s2是已经存进来的数据
    	                if (s1 == null){
    	                    return 1;
    	            }
    	                else {
    	                    return s2.charAt(0) - s1.charAt(0);
    	                }
    	            }
    	        });
    	        ts.put("一", 1);
    	        ts.put("二", 2);
    	        ts.put(null, 3);
    	        
    	        System.out.println(ts.get("一"));
    	        System.out.println(ts.get(null));
    	}
    }
    结果:
    1
    null

    用了我们自己的构造器

    public TreeMap(Comparator<? super K> comparator) {
            this.comparator = comparator;
        }
        final Entry<K,V> getEntry(Object key) {
            // Offload comparator-based version for sake of performance
            if (comparator != null)
                return getEntryUsingComparator(key);
            if (key == null)
                throw new NullPointerException();
            @SuppressWarnings("unchecked")
                Comparable<? super K> k = (Comparable<? super K>) key;
            Entry<K,V> p = root;
            while (p != null) {
                int cmp = k.compareTo(p.key);
                if (cmp < 0)
                    p = p.left;
                else if (cmp > 0)
                    p = p.right;
                else
                    return p;
            }
            return null;
        }
    取得时候还是调用了我传入的
    Comparable

    相等的时候传出来值,但是这个设置的比较null结果为1不可能为0,所以就找不到返回空。

    所以还是不要用TreeMap存null键的元素





    展开全文
  • //HahpMap:映射,允许null值和null键,方法是不同步的 public class hanjia{ public static void main(String[] args){ Map map=new HashMap(); Scanner sn=new Scanner(System.in); S...
    package hanjia;
    import java.util.*;
    //HahpMap:映射,允许null值和null键,方法是不同步的
    public class hanjia{
    	public static void main(String[] args){ 
    		Map map=new HashMap();
    		Scanner sn=new Scanner(System.in);
    		String word=null;
    		System.out.println("输入一年四季的英文单词:");
    		for(int i=0;i<4;++i) {
    			System.out.print("输入第"+(i+1)+"个单词:");
    			word=sn.next();
    			map.put(new Integer(i), word);//向map中添加元素
    		}
    		System.out.println("HashMap的容量:"+map.size());	//返回map的大小
    		System.out.println(map);
    		System.out.println("得到指定键所对应的值(1):"+map.get(1));
    		System.out.println("删除指定键对应的值(元素)(1):"+map.remove(1));
    		System.out.println("判断map是否包含指定的键(0):"+map.containsKey(0));
    		System.out.println("判断map是否包含指定的值(1):"+map.containsValue(1));
    		System.out.println(map);
    		System.out.println("判断map是否为空:"+map.isEmpty());
    		System.out.println("得到键集:"+map.keySet());
    		System.out.println("得到值集:"+map.values());
    		System.out.println("得到包含映射关系的set图:"+map.entrySet());
    		map.clear();
    		System.out.println("清除map里面的内容后:"+map);
    	}
    }
    
    

    在这里插入图片描述
    个人理解及资料参考,若有不足或者需要扩展请指点。
    若有雷同,纯属巧合。

    展开全文
  • hashmap允许键和空值

    千次阅读 2020-08-20 15:49:52
  • HashMap在put的时候会调用hash()方法来计算key的hashcode,可以从hash算法中看出当key==null时返回的为0。因此key为null时,hash算法返回值为0,不会调用key的hashcode方法。 HashTable源码 上面可以看出当...
  • Map主要用于存储健对,根据得到,因此不允许键重复(重复会覆盖),但允许值重复。 Hashmap是一个最常用的Map,它根据的HashCode存储数据,根据可以直接获取它的,具有很快的访问速度。遍历时,...
  • private fun hashtable() { //key value 都不能为null val hashtable = Hashtable<String?, String?>() // hashtable.put(null, null) // hashtable.put(null, "") // hashtable.put("", null)...
  • HashMap允许一个 null键,多个 null,而 Hashtable不允许键和值为null。 从下图可以看到 HashMap 对 null 做了特殊处理: 但是 Hashtable 会在我们 put 空值的时候直接抛出空指针异常,如下图: 不过更详细的...
  • HashMap 允许插入null 的键值对。但是因为无法调用 null 的 hashCode() 方法,也就无法确定该键值对的桶下标,只能通过强制指定一个桶下标来存放。HashMap 使用第 0 个桶存放null 的键值对。 1.6版本 : ...
  • Hashtable 是线程安全的,ConcurrentHashMap Hashtable 是不允许 null 作为键和值的,HashMap允许null做为键值
  • HashMap按键排序排序

    热门讨论 2018-03-25 21:25:28
    走进Map map是键值对的集合接口,他的实现...最常用的map,他根据key的hashcode来存储数据,根据key可以直接获取他的value,同时它具有很快的访问速度..HashMap最多只允许一条记录的keynull,允许多条记录的value...
  • 其中有一点就是 HashMap 是支持null键和null,而 ConcurrentHashMap 是不支持的; 后来查看了一下jdk源码,证明了确实是这样的。 HashMap.java 部分源码 static final int hash(Object key) ...
  • 因为hashtable,concurrenthashmap它们是用于多线程的,并发的 ,如果map.get(key)得到了null,不能判断到底是映射的value是null,还是因为没有找到对应的key而为空,而用于单线程状态的hashmap却可以用containKey...
  • 首先我们先运行一个例子来分析 从例子中可以发现,hashmap...从分析中我们可以看到,hashtable,对于null会抛出异常,而对于null键,则会调用null.hashCode(),而导致空指针异常,而concurrenthashmap则对于null键值对,.
  • 1 实验 1.1 HashMap public static void main(String[] args) { HashMap<String, Object> map = new HashMap<...map.put(null, null); System.out.println(map); } 1.2 ConcurrentHashMap public stati...
  • 我们查看两个类的put方法的源码。 Hashtable: ... // Make sure the value is not null if (value == null) { throw new NullPointerException(); } // Makes sure the key is not already in the ha
  • 这几天用到TreeMap集合 ,...问题描述:我们都知道 HashMap是可以存储null值null键的。那么TreeMap可以么? 首先我们看是否可以存储null,代码如下: TreeMap, Integer> ts = new TreeMap(); ts.put("一", 1); ts
  • 7.允许null键的map你知道哪些 集合类 Key Value Super 说明 Hashtable 不允许为 null 不允许为 null Dictionary ...
  • hashMap实现原理

    万次阅读 多人点赞 2019-07-31 18:35:50
    此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 2. HashMap的数据结构:  在java编程语言中,最基本的结构就是两种,一...
  • 我们知道,HashMap允许null 的 key null 的 value,但是当加入多个null key时,后面的数据会覆盖前面的数据。实验如下: 源码 public static void main(String[] args) { HashMap<Integer,String> ...
  • 其中有一点就是 HashMap 是支持null键和null,而 ConcurrentHashMap 是不支持的; 后来查看了一下jdk源码,证明了确实是这样的。 HashMap.java 部分源码 static final int hash(Object key) { int h; ...
  • HashMap和Hashtable的区别

    2017-01-01 23:05:03
    导读:1 HashMap不是线程安全的 hastmap是一个接口 是map...HashMap允许null keynull value,而hashtable不允许。 2 HashTable是线程安全的一个Collection。HashMap是Hashtable的轻量级实现(非线程安全的实现),
  • HashMap可以存放一个null,多个null 的对象,而Hashtable则不可以存放null,或者是null的对象 第二:hashMap比hashtable出现的要迟第三: HashMap是线程不安全的,即不可以让多个线程同时访问,...
  • * 今天整理以下关于HashMap键的唯一null规则; * 目标:认识HashMap只能有一个key为null值的键值对的原理; * * 那接下来还是以往一样创建一个自己的测试类; * @author Administrator * */ public class ...
  • HashMap

    2017-08-10 18:41:24
    HashMap(HashTable,LinkedHashMap)HashMap集合是哈希表组成,并且他们的键允许null,也可以允许null,该类与Hasbtable(不允许有null键和null,)类似,该类不能保证被元素的顺序恒久不变.ArrayList集合嵌套HashMap集合...
  • HashMap最多只允许一个Null(多条会覆盖),但允许多个Null 影响HashMap性能的重要参数 初试容量:创建哈希表时桶的数量,默认为16 负载因子:哈希表在其通量自动增加之前可以达到多满的一种尺度,默认为...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 53,134
精华内容 21,253
关键字:

hashmap允许null键和值吗