Map接口实现类-Hashtable和Properties,还有开发中如何选择集合实现类

举报
荞慧子 发表于 2022/12/31 19:42:25 2022/12/31
【摘要】 Map接口实现类-Hashtable基本介绍(1)存放的元素是键值对:即key-value(2)Hashtable的键和值都不能为null,否则会抛出NullPointerException(3)Hashtable使用方法基本上和HashMap一致(4)Hashtable是线程安全的(synchronized),HashMap是线程不安全的Hashtable和HashMap比较(1)Hash...

Map接口实现类-Hashtable

基本介绍

(1)存放的元素是键值对:即key-value

(2)Hashtable的键和值都不能为null,否则会抛出NullPointerException

(3)Hashtable使用方法基本上和HashMap一致

(4)Hashtable是线程安全的(synchronized),HashMap是线程不安全的

Hashtable和HashMap比较

(1)HashMap是线程不安全的,效率高,并且允许null键和null值

(2)Hashtable是线程安全的,效率较低,而且不允许null键和null值

Map接口实现类-Properties

基本介绍

(1)Properties类继承自Hashtable类并且实现了Map接口,也是使用一种键值对的形式来保存数据

(2)他的使用特点和Hashtable类似

(3)Properties还可以同于从xxx.properties文件中,加载数据到Properties类对象,并进行读取和修改

基本使用


import java.util.Properties;
@SuppressWarnings({"all"})
public class Properties_ {
    public static void main(String[] args) {

        //1. Properties 继承 Hashtable
        //2. 可以通过 k-v 存放数据,当然 key 和 value 不能为 null
        //增加
        Properties properties = new Properties();
        //properties.put(null, "abc");//抛出 空指针异常
        //properties.put("abc", null); //抛出 空指针异常
        properties.put("john", 100);//k-v
        properties.put("lucy", 100);
        properties.put("lic", 100);
        properties.put("lic", 88);//如果有相同的 key , value 被替换
        System.out.println("properties=" + properties);
        
        //通过 k 获取对应值
        System.out.println(properties.get("lic"));//88
        
        //删除
        properties.remove("lic");
        System.out.println("properties=" + properties);
        
        //修改
        properties.put("john", "约翰");
        System.out.println("properties=" + properties);
    }
}

开发中如何选择集合实现类

在开发中,选择什么集合实现类,主要取决于业务操作特点,然后根据集合实现类特性进行选择

分析:

先判断存储的类型(一组对象[单列]或一对键值对[双列])

1)一组对象[单列]:Collection接口

允许重复:List

增删多:LinkedList[底层维护了一个双向链表]

改查多:ArrayList[底层维护Object类型的可变数组]

不允许重复:Set

无序:HashSet[底层是HashMap,维护了一个哈希表,即(数组+链表+红黑树)]

排序:TreeSet

插入和取出顺序一致:LinkedHashSet,维护数组 + 双向链表

2)一对键值对[双列]:Map

键无序:HashMap[底层是哈希表 jdk7:数组+链表 jdk8:数组+链表+红黑树]

键排序:TreeMap

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

读取文件:Properties

TreeSet案例

import java.util.Comparator;
import java.util.TreeSet;
@SuppressWarnings({"all"})
public class TreeSet_ {
    public static void main(String[] args) {

        //1. 当我们使用无参构造器,创建 TreeSet 时,仍然是无序的
        //2. 希望添加的元素,按照字符串大小来排序
        //3. 使用 TreeSet 提供的一个构造器,可以传入一个比较器(匿名内部类)
        // 并指定排序规则
        //4. 简单看看源码

        /*
            1. 构造器把传入的比较器对象,赋给了 TreeSet 的底层的 TreeMap 的属性 this.comparator
            public TreeMap(Comparator<? super K> comparator) {
                this.comparator = comparator;
            }
            2. 在 调用 treeSet.add("tom"), 在底层会执行到
            if (cpr != null) {//cpr 就是我们的匿名内部类(对象)
                do {
                    parent = t;
                    //动态绑定到我们的匿名内部类(对象)compare
                    cmp = cpr.compare(key, t.key);
                    if (cmp < 0)
                        t = t.left;
                    else if (cmp > 0)
                        t = t.right;
                    else //如果相等,即返回 0,这个 Key 就没有加入
                        return t.setValue(value);
                } while (t != null);
            }
        */
        
        // TreeSet treeSet = new TreeSet();
        TreeSet treeSet = new TreeSet(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                //下面 调用 String 的 compareTo 方法进行字符串大小比较
                //如果要求加入的元素,按照长度大小排序
                //return ((String) o2).compareTo((String) o1);
                return ((String) o1).length() - ((String) o2).length();
            }
        });
        //添加数据. 
        treeSet.add("jack");
        treeSet.add("tom");//3
        treeSet.add("sp");
        treeSet.add("a");
        treeSet.add("abc");//3
        System.out.println("treeSet=" + treeSet);
    }
}

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。