详解Java集合类之HashTable,Properties篇

目录
  • 1.基本介绍
  • 2.HashTable底层
  • 3.HashTable扩容机制
  • 4.HashMap和HashTable的对比
  • 5.Properties
  • 6.集合选型规则

1.基本介绍

HashTable的键和值都不能为空,否则会抛出一个异常

使用方法基本与HashMap一致

HashTable是线程安全的,HashMap是线程不安全的

2.HashTable底层

先上代码:

Hashtable hashtable = new Hashtable();
hashtable.put("john",100);
hashtable.put("tom",250);
hashtable.put("tom",1314);
System.out.println(hashtable);

输出:

{tom=1314, john=100}

先进入put方法,可以看到在put方法最前面先判断了value是否为空,如果为空直接抛出一个异常

if (value == null) {
    throw new NullPointerException();
}

同样的,HashTable也存在替换机制和扩容机制!

3.HashTable扩容机制

HashTable拥有自己的扩容机制,这不同于HashSet和HashMap

首先,我们要明白,在HashTable添加键值对时,真正起到添加作用的是如下方法:

addEntry(hash, key, value, index);

我们来看一下他的真面目:

private void addEntry(int hash, K key, V value, int index) {
    Entry<?,?> tab[] = table;
    if (count >= threshold) {
        // Rehash the table if the threshold is exceeded
        rehash();

        tab = table;
        hash = key.hashCode();
        index = (hash & 0x7FFFFFFF) % tab.length;
    }

    // Creates the new entry.
    @SuppressWarnings("unchecked")
    Entry<K,V> e = (Entry<K,V>) tab[index];
    tab[index] = new Entry<>(hash, key, value, e);
    count++;
    modCount++;
}

当添加的元素数量大于临界值时,执行rehash方法(这个方法就是真正的扩容方法)

if (count >= threshold) {
    // Rehash the table if the threshold is exceeded
    rehash();
    tab = table;
    hash = key.hashCode();
    index = (hash & 0x7FFFFFFF) % tab.length;
}

继续追进去到rehash方法:

protected void rehash() {
    int oldCapacity = table.length;
    Entry<?,?>[] oldMap = table;

    // overflow-conscious code
    int newCapacity = (oldCapacity << 1) + 1;
    if (newCapacity - MAX_ARRAY_SIZE > 0) {
        if (oldCapacity == MAX_ARRAY_SIZE)
            // Keep running with MAX_ARRAY_SIZE buckets
            return;
        newCapacity = MAX_ARRAY_SIZE;
    }
    Entry<?,?>[] newMap = new Entry<?,?>[newCapacity];

    modCount++;
    threshold = (int)Math.min(newCapacity * loadFactor, MAX_ARRAY_SIZE + 1);
    table = newMap;

    for (int i = oldCapacity ; i-- > 0 ;) {
        for (Entry<K,V> old = (Entry<K,V>)oldMap[i] ; old != null ; ) {
            Entry<K,V> e = old;
            old = old.next;

            int index = (e.hash & 0x7FFFFFFF) % newCapacity;
            e.next = (Entry<K,V>)newMap[index];
            newMap[index] = e;
        }
    }
}

不要慌,我们来分析一下这个扩容方法

首先,拿到老的容量:

int oldCapacity = table.length;

新的容量为老的容量 * 2 + 1:

int newCapacity = (oldCapacity << 1) + 1;

继续往下,到达真正扩容的代码:

Entry<?,?>[] newMap = new Entry<?,?>[newCapacity];

4.HashMap和HashTable的对比

5.Properties

Properties继承了HashTable

一般用于可操作的配置文件编写

使用实例:

import java.util.Properties;

/**
 * Properties演示
 */
public class PropertiesText {
    @SuppressWarnings({"all"})
    public static void main(String[] args) {
        Properties properties = new Properties();
        // 增加
        properties.put("john",521);
        properties.put("tom",1314);
        properties.put("tom",100);
        System.out.println(properties);
        // 通过key获取值
        System.out.println(properties.get("tom"));
        // 删除
        properties.remove("tom");
        System.out.println(properties);
    }
}

输出:

{tom=100, john=521}
100
{john=521}

6.集合选型规则

存储一组对象:Collection

允许重复,增删多选LinkedList,改查多选ArrayList

不允许重复,无序选HashSet,排序选TreeSet,插入和取出顺序一致选择LinkedHashSet

存储键值对:Map

键无序:HashMap

键排序:TreeMap

键插入和取出顺序一致:LinkedHashMap

读取文件:Properties

到此这篇关于详解Java集合类之HashTable,Properties篇的文章就介绍到这了,更多相关Java集合类HashTable Properties内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解Java中的HashTable

    概论 HashTable是遗留类,很多映射的常用功能与HashMap类似,不同的是它承自Dictionary类,并且是线程安全的,并发性不如ConcurrentHashMap,因为ConcurrentHashMap引入了分段锁. Hashtable不建议在新代码中使用,不需要线程安全的场合可以用HashMap替换,需要线程安全的场合可以用ConcurrentHashMap替换. 对比HashMap 的初始容量 默认11 的初始容量 需要注意的是Hashtable的默认初始容量大小是11,而Has

  • 浅谈Java中Properties类的详细使用

    目录 一.Properties 类 二.打印JVM参数 三.打印自定义.properties文件中的值 3.1.list输出到控制台用绝对路径加载 3.2.propertyNames输出getClass()加载 3.3.stringPropertyNames输出getClassLoader加载(推荐) 四.获取值getProperties 五.写入到Properties文件 5.1.普通写入,中文时乱码 5.2.解决乱码写入的问题 六.加载和导出到xml配置文件 6.1.导出到.xml配置文件s

  • 浅谈java Properties类的使用基础

    Properties类继承自HashTable,通常和io流结合使用.它最突出的特点是将key/value作为配置属性写入到配置文件中以实现配置持久化,或从配置文件中读取这些属性.它的这些配置文件的规范后缀名为".properties".表示了一个持久的属性集. 需要注意几点: 无论是key还是value,都必须是String数据类型. 虽然继承自HashTable,但它却没有使用泛型. 虽然可以使用HashTable的put方法,但不建议使用它,而是应该使用setProperty()

  • 全面解析java中的hashtable

    Hashtables提供了一个很有用的方法可以使应用程序的性能达到最佳. Hashtables(哈希表)在计算机领域中已不 是一个新概念了.它们是用来加快计算机的处理速度的,用当今的标准来处理,速度非常慢,而它们可以让你在查询许多数据条目时,很快地找到一个特殊的条目. 尽管现代的机器速度已快了几千倍,但是为了得到应用程序的最佳性能,hashtables仍然是个很有用的方法. 设想一下,你有一个包含约一千条记录的数据文件??比如一个小企业的客户记录还有一个程序,它把记录读到内存中进行处理.每个记录

  • java hashtable实现代码

    复制代码 代码如下: public class HashTable{   private String[] name;    //关键字   private int sum;    //容量   public static void main(String[] args){    //测试        HashTable ht = new HashTable();        ht.add("chenhaitao");        ht.add("zhongcheng&

  • Java中Hashtable集合的常用方法详解

    目录 public Object clone() public Enumeration<V> elements() 总结 public Object clone() 返回Hashtable的副本 public Enumeration<V> elements() 返回此哈希表中的值的枚举 其他的方法都是实现Map集合的方法 //www.jb51.net/article/227296.htm 总结 本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

  • 详解Java集合类之HashTable,Properties篇

    目录 1.基本介绍 2.HashTable底层 3.HashTable扩容机制 4.HashMap和HashTable的对比 5.Properties 6.集合选型规则 1.基本介绍 HashTable的键和值都不能为空,否则会抛出一个异常 使用方法基本与HashMap一致 HashTable是线程安全的,HashMap是线程不安全的 2.HashTable底层 先上代码: Hashtable hashtable = new Hashtable(); hashtable.put("john&qu

  • 详解Java集合类之HashSet篇

    目录 1.Set接口方法 2.HashSet 3.HashSet的扩容机制 - 初次添加数据 4.HashSet的扩容机制 - 继续添加数据 5.HashSet的扩容机制 - 添加重复元素 1.Set接口方法 Set接口对象存放的数据是没有重复,且数据是无序存放的(添加顺序和存放顺序不一致,但是这个存放的顺序是固定的,不会随机变化) 代码示例: import java.util.HashSet; import java.util.Iterator; import java.util.Set; /

  • 详解Java集合类之List篇

    目录 1.集合框架体系 2.Collection接口 3.迭代器 4.List接口 5.ArrayList ArrayList扩容机制 ArrayList使用实例 6.Vector 7.LinkedList 增加元素源码分析 删除元素源码分析 LinkedList使用Demo 8.ArrayList和LinkedList的选择 1.集合框架体系 集合框架被设计成要满足以下几个目标. 该框架必须是高性能的.基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的. 该框架允许不同类型的集合,以类

  • 详解Java集合类之Map篇

    目录 1.Map接口介绍 2.Map接口分析 3.Map接口方法 4.Map遍历方式 1.Map接口介绍 Map用于保存具有映射关系的数据:Key - Value 对于Set,底层其实依然是一个Map,但是Set选择不使用Value,也就是Set的Value值始终是一个常量 Map中的Key和Value可以是任何类型的数据,会封装到HashMap$Node对象中 Map中的Key不能重复,但是Value可以重复,当有相同的Key时,等价与替换操作 2.Map接口分析 存放Map键值对是在Hash

  • 详解Java 集合类 List 的那些坑

    现在的一些高级编程语言都会提供各种开箱即用的数据结构的实现,像 Java 编程语言的集合框架中就提供了各种实现,集合类包含 Map 和 Collection 两个大类,其中 Collection 下面的 List 列表是我们经常使用的集合类之一,很多的业务代码都离不开它,今天就来看看 List 列表的一些坑. 第一个坑:Arrays.asList 方法返回的 List 不支持增加.删除操作 例如我们执行以下代码: List<String> strings = Arrays.asList(&qu

  • 详解Java项目中读取properties文件

    下面1-4的内容是网上收集的相关知识,总结来说,就是如下几个知识点: 1.最常用读取properties文件的方法InputStream in = getClass().getResourceAsStream("资源Name");这种方式要求properties文件和当前类在同一文件夹下面.如果在不同的包中,必须使用: InputStream ins = this.getClass().getResourceAsStream("/cn/zhao/properties/test

  • 详解Java 包扫描实现和应用(Jar篇)

    如果你曾经使用过 Spring, 那你已经配过 包扫描路径吧,那包扫描是怎么实现的呢?让我们自己写个包扫描 上篇文章中介绍了使用 File 遍历的方式去进行包扫描,这篇主要补充一下jar包的扫描方式,在我们的项目中一般都会去依赖一些其他jar 包, 比如添加 guava 依赖 <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <ve

  • 详解java调用python的几种用法(看这篇就够了)

    java调用python的几种用法如下: 在java类中直接执行python语句 在java类中直接调用本地python脚本 使用Runtime.getRuntime()执行python脚本文件(推荐) 调用python脚本中的函数 准备工作: 创建maven工程,结构如下: 到官网https://www.jython.org/download.html下载Jython的jar包或者在maven的pom.xml文件中加入如下代码: <dependency> <groupId>org

  • 一文详解Java线程中的安全策略

    目录 一.不可变对象 二.线程封闭 三.线程不安全类与写法 四.线程安全-同步容器 1. ArrayList -> Vector, Stack 2. HashMap -> HashTable(Key, Value都不能为null) 3. Collections.synchronizedXXX(List.Set.Map) 五.线程安全-并发容器J.U.C 1. ArrayList -> CopyOnWriteArrayList 2.HashSet.TreeSet -> CopyOnW

随机推荐