Java集合08

15.HashTable

15.1HashTable的基本介绍

  1. 存放的元素是键值对:即K-V
  2. HashTable的键和值都不能为null
  3. HashTable的使用方法基本上和HashMap一样
  4. HashTable是线程安全的(synchronized),HashMap是线程不安全的
  5. HashTable是无序的

例子:

Hashtable的底层

  1. 底层有数组 HashTable$Entry [ ] 的初始化大小为 11

  2. 临界值 threshold 8=11*0.75

  3. 扩容:原来容量*2+1

package li.map.hashtable;

import java.util.Hashtable;

@SuppressWarnings("all")
public class HashTableExercise {
public static void main(String[] args) {
Hashtable table = new Hashtable();
table.put("john",100);//ok
//table.put(null,100);//异常
//table.put("john",null);//异常
table.put("likk",100);//ok
table.put("likk",99);//替换
System.out.println(table);//{likk=99, john=100} 无序
}
}

如下图:初始容量为11,临界值为8


如下图:当数组容量使用到8时,要添加下一个元素时,数组会先扩容到23,临界值变为17

15.2HashTable扩容

简单说一下HashTable的底层

  1. 底层有数组 HashTable$Entry[ ] 初始化大小为 11

  2. 临界值 threadhold 8 = 11 * 0.75

  3. 扩容:

    3.1 执行方法 addEntry(hash, key, value, index) 添加K-V对封装到Entry

    3.2 当if (count >= threshold) 满足时 ,就进行扩容

    3.3 按照int newCapacity = (oldCapacity << 1) + 1;的大小进行扩容


HashTable和HashMap的对比

版本 线程安全(同步) 效率 允许null键null值
HashMap 1.2 不安全 可以
HashTable 1.0 安全 较低 不可以

16.Properties

16.1Properties基本介绍

  1. Properties类继承自HashTable类,并实现了Map接口,也是使用键值对的形式来保存数据

  2. Properties使用特点和HashTable类似

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

  4. 说明:在工作后xxx.properties文件通常作为配置文件,这个知识点在IO举例。

    Java 读写Properties配置文件 - 旭东的博客 - 博客园 (cnblogs.com)

16.2基本使用

例子:

package li.map.properties;

import java.util.Properties;
@SuppressWarnings("all")
public class Properties_ {
public static void main(String[] args) {
Properties properties = new Properties(); // 因为 Properties 继承了 HashTable,因此 Key\Value 都不能为空
// 1.增加
// properties.put(null,100);//抛出空指针异常
// properties.put("join",null);//抛出空指针异常
properties.put("join",100);//k-v
properties.put("jack",100);
properties.put("lili",80);
properties.put("lili",123);//如果有相同的key,则value被替换
System.out.println(properties);//{jack=100, lili=123, join=100} 同样是无序的 // 2.删除
properties.remove("jack");
System.out.println(properties);//{lili=123, join=100} // 3.查找:通过 key 获取对应的value
System.out.println(properties.get("lili"));//123 // 4.修改(就是直接覆盖原来的值)
properties.put("join",999);
System.out.println(properties);//{lili=123, join=999} }
}

17.集合选型规则(开发中如何选择集合实现类)(记住)

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

  1. 先判断存储数据的类型[一组对象[单列]或者一组键值对[双列]]

  2. 一组对象[单列]:Collection接口

    ​ 允许重复:List

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

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

    ​ 不允许重复:Set

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

    ​ 有序:TreeSet

    ​ 插入顺序和取出顺序一致:LinkedHashSet [底层是LinkedHashMap 数组+双向链表]

  3. 一组键值对[双列]:Map

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

    ​ 键排序:TreeMap

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

    ​ 读取文件:Properties

day25--Java集合08的更多相关文章

  1. Java 集合系列08之 List总结(LinkedList, ArrayList等使用场景和性能分析)

    概要 前面,我们学完了List的全部内容(ArrayList, LinkedList, Vector, Stack). Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例 Ja ...

  2. Java 集合系列 08 Map架构

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  3. 【转】Java 集合系列08之 List总结(LinkedList, ArrayList等使用场景和性能分析)

    概要 前面,我们学完了List的全部内容(ArrayList, LinkedList, Vector, Stack). Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例 Ja ...

  4. Java 集合系列04之 fail-fast总结(通过ArrayList来说明fail-fast的原理、解决办法)

    概要 前面,我们已经学习了ArrayList.接下来,我们以ArrayList为例,对Iterator的fail-fast机制进行了解.内容包括::1 fail-fast简介2 fail-fast示例 ...

  5. Java 集合系列目录(Category)

    下面是最近总结的Java集合(JDK1.6.0_45)相关文章的目录. 01. Java 集合系列01之 总体框架 02. Java 集合系列02之 Collection架构 03. Java 集合系 ...

  6. Java 集合系列05之 LinkedList详细介绍(源码解析)和使用示例

    概要  前面,我们已经学习了ArrayList,并了解了fail-fast机制.这一章我们接着学习List的实现类——LinkedList.和学习ArrayList一样,接下来呢,我们先对Linked ...

  7. Java 集合系列 09 HashMap详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  8. Java 集合系列 10 Hashtable详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  9. Java 集合系列 17 TreeSet

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

随机推荐

  1. Vmware虚拟机安装及相关配置流程

    1.Vmware虚拟软件安装 1.1下载地址 vmware 12 pro 的版本稳定性较好,所有我们最好选择该版本 下载地址:https://www.onlinedown.net/soft/10053 ...

  2. 【clickhouse专栏】单机版的安装与验证

    <clickhouse专栏>第三节内容,先安装一个单机版的clickhouse,是后续学习多副本或者分布式集群安装的基础内容.但基本的clickhouse是不依赖于zookeeper的,只 ...

  3. Chrome自带功能实现网页截图

    更新记录 本文迁移自Panda666原博客,原发布时间:2021年6月28日. 很简单,按下Ctrl+Shift+P,打开命令行窗口,如下图所示. 输入命令. Capture full size sc ...

  4. Bika LIMS 开源LIMS集——ERD实体关系定义(数据库设计)

    系统数据分类 数据分为四类: template 模板,基础静态数据 static 静态数据,核心静态数据,检测方法等 dynamic 动态数据,样品检测流程数据 organisation 组织机构数据 ...

  5. 《Java笔记——基础语法》

    Java笔记--基础语法       一.字符串的拼接: 例如: System.out.println(""+"");     二.换行语句: 例如: Syst ...

  6. Android multiple back stacks导航的几种实现

    Android multiple back stacks导航 谈谈android中多栈导航的几种实现. 什么是multiple stacks 当用户在app里切换页面时, 会需要向后回退到上一个页面, ...

  7. C# · 委托语句简化演变

    1.委托基础语句形式 namespace QLVision { delegate void dHelp();//定义委托 static class Program { /// <summary& ...

  8. js--js实现基础排序算法

    前言 文本来总结常见的排序算法,通过 JvavScript  来实现 正文 1.冒泡排序 算法思想:比较相邻两个元素的大小,如果第一个比第二个大,就交换它们.从头遍历到尾部,当一轮遍历完后,数组最后一 ...

  9. 活动报名 | 如何基于开源项目 Tapdata PDK,快速完成数据源和目标的开发?

      近日,Tapdata 启动 PDK 插件生态共建计划,宣布开源插件开发框架 Tapdata PDK,将自身的数据接口能力开放出来,帮助开发者根据实际需求,自助接入数据源和目标,快速开启「Data ...

  10. 事务@Transactional注解的属性

    事务的传播行为 当事务方法被另一个事务方法调用时,必须指定事务应该如何传播.例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行.事务的传播行为可以由传播属性指定.Sprin ...