java集合之Hashtable

硅谷探秘者 397 0 0

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

 

猜你喜欢
java基础 1303 1.linkedList的实现linkedlist的实现是基于数据结构:双向链表。模型图如对于linkedList没有像arrayList一样有扩容的概念。也不需要移动数据。所以对于新增和删除操作add和remove,LinkedList比较占优势。2.双向链表的实现参考:简单双向链表的增删改查3.linkedList的继承关系从继承图中可以看出LinkList实现了List接口,实现了list接
java基础 1740 ArrayList的实现是一个动态数组,从源码中也可以看出。这就决定了他的查找效率高,可以直接通过下标访问。但是对于删除和增加元素,需要大量的移动元素,所以插入和删除的效率就很低。ArrayList不是线程安全的,只能用在单线程环境下,多线程环境下可以考虑用Collections.synchronizedList(Listl)函数返回一个线程安全的ArrayList类。构造方法:ArrayList
java基础 346 一、HashSet底层实现从HashSet的源码中可以发现,它的底层维护了一个HashMap,在newHashSet的时候,构造方法中其实是new了一个HashMap。privatetransientHashMapE,Objectmap;publicHashSet(){map=newHashMap();}publicHashSet(Collection?extendsEc){map=newHash
java基础 581 javaTreeMap实现原理TreeMap的实现其实说简单也简单说复杂也复杂,说简单是因为TreeMap底层实现完全依靠红黑树这个数据结构,相比与HashMap来说TreeMap不用考虑
java基础 304 1.HashMap的构造函数1.publicHashMap()publicHashMap(){this.loadFactor=DEFAULT_LOAD_FACTOR;//allotherfieldsdefaulted}构造一个空的HashMap,初始容量为16,负载因子为0.75,负载因子和它的作用将会在下方解释。2.publicHashMap(intinitialCapacity)publicH
java基础 1418 Java框架数据结构是以某种形式将数据组织在一起的,它不仅存储数据,还支持访问和处理数据的操作。Java提供了几个能有效地组织和操作数据的数据结构,这些数据结构通常称为Java框架。在平
java基础 2550 有Student类,一个List中有若干Student对象,对此按分数排序Studentpackagecom.example.demo.entity;@SuppressWarnings
算法基础 171 Java中遍历的方式以list为例,有三种遍历方式。ListStringlist=newArrayList(); list.add("2"); list.add("2"); list.add
归档
2018年11月  12 2018年12月  33 2019年01月  28 2019年02月  28 2019年03月  32 2019年04月  27 2019年05月  33 2019年06月  6 2019年07月  12 2019年08月  12 2019年09月  21 2019年10月  8 2019年11月  15 2019年12月  25 2020年01月  9 2020年02月  5 2020年03月  16 2020年04月  4 2020年06月  1 2020年07月  7 2020年08月  13 2020年09月  9 2020年10月  5 2020年12月  3 2021年01月  1 2021年02月  5 2021年03月  7
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo
目录