【JAVA基础】关于Hashtable,真别觉得它没用

在实际业务开发中可能很少会用到,也确实不如HashMapConcurrentHashMap普遍,但在一些场景中还是经常可以看到它的身影:

  1. 向后兼容性:在一些遗留系统或旧框架中,Hashtable可能是唯一可用的线程安全的Map实现。由于向后兼容性的要求,即使有更现代的替代品,也不得不继续使用Hashtable

  2. 简单场景:在一些简单的、对性能要求不高的场景下,使用Hashtable可能更为简便,因为它本身就提供了线程安全的保证,不需要额外的同步机制。

  3. 配置管理Properties类,如前所述,是基于Hashtable的,用于处理配置文件。在框架中,Properties经常用于读取和管理配置信息,而Properties类的线程安全特性间接来源于Hashtable

  4. 特定API需求:某些Java API或第三方库可能要求使用Hashtable作为参数类型,特别是在老版本的API中。在这种情况下,使用Hashtable是遵循API规范的必要条件。

总之,虽然在现代的业务开发中,HashMapConcurrentHashMap由于更好的性能和更丰富的功能而更受欢迎,但在特定的场景和历史遗留系统中,Hashtable仍然发挥着其独特的作用。在设计系统时,选择合适的集合类型需要根据具体的应用场景和性能需求来决定。

java.util包下的Properties就继承了Hashtable

public class Properties extends Hashtable<Object,Object> {

}
public class Hashtable<K,V>
    extends Dictionary<K,V>
    implements Map<K,V>, Cloneable, java.io.Serializable {


    public synchronized int size() {
        return count;
    }

  
    public synchronized boolean isEmpty() {
        return count == 0;
    }

   
    public synchronized Enumeration<K> keys() {
        return this.<K>getEnumeration(KEYS);
    }

......
}

本质还是HashMap,无非加了同步锁保证了线程安全

Properties类在Java中是一个非常常用的类,尤其在处理配置文件或需要键值对存储的场景下。Properties类实际上继承自Hashtable类,这背后的设计决策有几个关键的原因和作用:

  1. 键值对存储Hashtable是一个键值对的集合,它提供了一个简单的方式来进行数据的存储和检索。Properties继承自Hashtable,意味着它也具备了键值对存储的能力,可以存储配置信息,其中键通常是配置项的名称,值是对应的配置值。

  2. 线程安全Hashtable是线程安全的,这意味着多个线程可以安全地共享一个Hashtable实例,而不需要额外的同步措施。由于配置文件往往在多线程环境中被读取和修改,Properties继承自Hashtable,也就继承了它的线程安全特性,使得Properties在多线程环境中使用更加安全。

  3. 持久化支持Properties类添加了对持久化的支持,即可以将Properties对象保存到文件中,也可以从文件中加载Properties对象。这是Hashtable本身不具备的功能,通过继承HashtableProperties在保留键值对存储的基础上,增加了配置文件的读写能力。

  4. 默认值处理Properties类提供了一些方法来处理默认值,比如getProperty(String key, String defaultValue),当没有找到指定键时,可以返回一个默认值。这对于配置文件的读取非常有用,可以避免因配置缺失而导致的程序错误。

  5. 类型转换:虽然PropertiesHashtable的键值类型都是Object,但实际上Properties期望键和值都是String类型。Properties类提供了一些便利的方法,如setPropertygetProperty,这些方法在内部做了类型转换,使得使用Properties类更加直观和方便。

简单来说,Properties继承自Hashtable,是为了利用Hashtable的键值对存储和线程安全特性,同时添加了对配置文件读写的支持,以及对配置数据的默认值和类型转换的处理,使其成为一个专门用于处理配置信息的类。这使得Properties类成为了Java中处理配置文件的首选工具之一。

在Quartz核心源码中的调度器QuartzScheduler类中有关于Properties的使用


    static {
        Properties props = new Properties();
        InputStream is = null;
        try {
            is = QuartzScheduler.class.getResourceAsStream("quartz-build.properties");
            if(is != null) {
                props.load(is);
                String version = props.getProperty("version");
        //后面省略......

    }

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值