java集合之Hashtable

2019 精帖
0 133

java集合之Hashtable

一、构造方法

1.public Hashtable()

public Hashtable() {
        this(11, 0.75f);
}

无参构造,初始化一个容量为11,负载因子为0.75的Hashtable

2.public Hashtable(int initialCapacity)

    public Hashtable(int initialCapacity) {
        this(initialCapacity, 0.75f);
    }

初始化一个容量为initialCapacity,负载因子为0.75的Hashtable

3.public Hashtable(int initialCapacity, float loadFactor)

    public Hashtable(int initialCapacity, float loadFactor) {
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        if (loadFactor <= 0 || Float.isNaN(loadFactor))
            throw new IllegalArgumentException("Illegal Load: "+loadFactor);

        if (initialCapacity==0)
            initialCapacity = 1;
        this.loadFactor = loadFactor;
        table = new Entry<?,?>[initialCapacity];
        threshold = (int)Math.min(initialCapacity * loadFactor, MAX_ARRAY_SIZE + 1);
    }

初始化一个容量为initialCapacity,负载因子为loadFactor的Hashtable

4.public Hashtable(Map<? extends K, ? extends V> t)

    public Hashtable(Map<? extends K, ? extends V> t) {
        this(Math.max(2*t.size(), 11), 0.75f);
        putAll(t);
    }

初始化一个和参数Map有相同mappings的Hashtable,并将对象t中的所有键值对象拷贝到Hashtable。

二、Hashtable中的数据结构

        Hashtable中的数据组的织结构为:hash表+链表,采用拉链法处理hash冲突。

大致呢是这个样子

三、Hashtable中的负载因子

        如果没有指定集合的大小,那么Hashtable将默认容量为11,如果指定容量大小,那么集合的大小就是指定的大小(从第三个有参构造中也可以看出),这个和HashMap有很大区别,HashMap的容量必须是2的次幂。而Hashtable中的默认的负载因子和HashMap相同都是0.75。

四、Hashtable为什么是线程安全的

        从源码中可以看出,无论是get方法,还是put方法,或是remove方法等,方法上都加了synchronized关键字,所以它能保证多线程下的安全性,但是它的性能和效率也是非常底下的,所以Hashtable基本上被弃用了,因为有同样线程安全,并且高效的ConcurrentHashMap将其代替。

        Hashtable还有一个特点就是key和value都不能为null这一点再源码中可以得到体现

    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;
        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;
    }

 

留言(0)
加载更多
猜你喜欢
  • blog equals()与hashCode()方法总结

    1.hashCode方法的作用: 对于包含容器类型的程序设计语言来说,基本上都会涉及到hashCode,hashCode方法的主要作用是为了配基于散列的一起正常运行,这样的散列包括HashSet、HashMap以及H
  • blog 线程间的通讯

    1.什么是线程通信 线程间通信的两个基本问题是互斥和同步。 线程同步是指线程间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。2.syn
  • blog 插入排序(双向链表实现) - 数据结构与算法

    算法思想 把所有需要排序的数据分成两个,一个是待排序,一个是已排序的,算法每次从未排序顺序或随机拿取一个数据,把它加入到已排序使其有序,直到未排序中的数据被取走完,算法结束 案例代码: 数组a是未排序,已排
  • blog 快速排序 - 数据结构与算法

    算法思想 将待排序以该中随机的一个数为分界点分成左右两个,一次排序使其右边的的数据全部大于左边的,然后再分别递归式的对左右两个执行上述排序操作,直到递归没有数据,递归结束完成排序。 算法描述 现有待排序
  • blog springmvc成websocket

    springmvc成websocket环境:spring+springmvc+tomcat8注意:本测试项目 运行环境不能低于tomcat81.websocket配置package club.jiajiajia.connom.servic
  • blog java短信验证码接口(阿里云/聚数据)

    阿里云pom文件 <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</artifactId>
  • blog jvm内存模型分析-垃圾收器和内存分配策略(1)

    jvm内存模型分析-垃圾收器和内存分配策略(1)         说起垃圾收( Garbagc Collcction,GC),大部分人都把这项技术当做java语言的伴生产物。事实上,GC的历史比
  • ofc springboot整activemq ( mq )

    springboot整activemq ( mq )
  • blog 并发编程-java线程内存模型(JMM)和volatile关键字理解

    硬件的效率与一致性         在正式讲解Java虚拟机并发相关的知识前,我们先花费一点时间去了解一下物理计算机中的并发问题,物理机遇到的并发问题与虚拟机中的情况有不少相似处,物理机对并发的
  • file java项目-数据库间定时进行数据交换服务(数据同步)

    <h3 style="text-align: center;">java项目-数据库间定时进行数据交换服务(右上方下载)</h3> <p>压缩包内附sql脚本,本项目为springboot+myba