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. 运筹学笔记12 大M法

    引入M,其中M是一个充分大的正数.由此,目标函数也改变为zM. 如此构造的线性规划问题我们记作LPM,称之为辅助线性规划问题,也即在原来的线性规划问题的基础上,改造了其等式约束条件,然后有对目标函数施 ...

  2. Python装饰器Decorators

    def hi(name="yasoob"): return "hi " + name print(hi()) # 我们甚至可以将一个函数赋值给一个变量,比如 g ...

  3. 技术分享 | 一步一步学测试平台开发-Vue restful请求

    本文节选自霍格沃兹测试学院内部教材 一般在构建应用时需要访问后端的 API 接口获取后端数据并展示.做这件事的方法有很多种(比如 axios,vue-resource,fetch-jsonp),使用 ...

  4. 某CMS后台通杀getshell

    此CMS是基于thinkphp框架二次开发的,目前有thinkphp5,以及thinkphp6两种版本.这些漏洞挖掘出来的时候已经在cnvd被提交过了.但是网上并没有漏洞文章.避免风险这里只分享思路. ...

  5. SAP Web Dynpro-消息

    在ABAP Workbench中,您还可以创建和显示包含Dynpro应用程序最终用户信息的消息. 这些消息显示在屏幕上. 这些是用户交互消息,显示有关Web Dynpro应用程序的重要信息. 为了向用 ...

  6. 【react】什么是fiber?fiber解决了什么问题?从源码角度深入了解fiber运行机制与diff执行

    壹 ❀ 引 我在[react] 什么是虚拟dom?虚拟dom比操作原生dom要快吗?虚拟dom是如何转变成真实dom并渲染到页面的?一文中,介绍了虚拟dom的概念,以及react中虚拟dom的使用场景 ...

  7. jenkins+k8s部署

    1. jenkins配置部署,从git或者svn等拉取代码,编制打包,在博客的jenkins那块有具体的讲解 2. 将打好的包war/java包拷贝到k8s-Master,或者在jenkins上也行, ...

  8. SQL优化常用的几种方法

    为什么要对SQL优化: 1.执行性能低 2.等待时间过长 3.SQL写的太差 4.索引失效 ·····等等 SQL优化的一些方法: 1.EXPLAIN 做MySQL优化,我们要善用EXPLAIN查看S ...

  9. NC204859 组队

    NC204859 组队 题目 题目描述 你的团队中有 \(n\) 个人,每个人有一个能力值 \(a_i\),现在需要选择若干个人组成一个团队去参加比赛,由于比赛的规则限制,一个团队里面任意两个人能力的 ...

  10. CesiumJS 2022^ 源码解读[7] - 3DTiles 的请求、加载处理流程解析

    目录 1. 3DTiles 数据集的类型 2. 创建瓦片树 2.1. 请求入口文件 2.2. 创建树结构 2.3. 瓦片缓存机制带来的能力 3. 瓦片树的遍历更新 3.1. 三个大步骤 3.2. 遍历 ...