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. C++ 获取指定的重载函数地址

    刚刚看到一篇博客,说 std::bind 无法绑定正确的重载函数.这里的问题并不是 std::bind 能力不足,而是将函数名传递给 std::bind 时编译器无法取到这个函数的地址(也就是符号,编 ...

  2. python基础学习7

    python基础学习7 内容概要 字符串的内置方法 字符串的内置方法(补充) 列表的内置方法 可变类型与不可变类型 队列与堆栈 内容详情 字符串的内置方法 # 1.strip 移除字符串首尾的指定字符 ...

  3. 浅析Kubernetes架构之workqueue

    通用队列 在kubernetes中,使用go的channel无法满足kubernetes的应用场景,如延迟.限速等:在kubernetes中存在三种队列通用队列 common queue ,延迟队列 ...

  4. 【Redis】事件驱动框架源码分析

    aeEventLoop初始化 在server.c文件的initServer函数中,对aeEventLoop进行了初始化: 调用aeCreateEventLoop函数创建aeEventLoop结构体,对 ...

  5. Bika LIMS 开源LIMS集—— SENAITE的安装

    安装环境 操作系统 Ubuntu 18.04 LTS Python 2.x. Plone 4 安装步骤 Ubuntu等Linux.Mac系统一般安装有Python的环境,但由于需要安装Python扩展 ...

  6. 《ECMAScript 6 入门》【二、变量的解构赋值】(持续更新中……)

    前言: 让我们看下es6的新语法解构,跟模式匹配类似.一.数组的解构赋值 举个例子给多个变量赋值的写法: var a =1;var b =2;var c =3; 需要写多个变量特别麻烦,我们先使用以前 ...

  7. Spring jdbctemplate和事务管理器 全注解配置 不使用xml

    /** * spring的配置类,相当于bean.xml */@Configuration//@Configuration标注在类上,相当于把该类作为spring的xml配置文件中的<beans ...

  8. RPA 快手自动上传机器人

    1.打开账号Cookie预存表格 2.机器人自动登录账号 3.机器人开始按照预设视频位置开始自动上传视频 4.机器人开始自动填写视频相关信息内容 5.完成后,可自动切换下一个账号继续上传

  9. jenkins安装配置及发布

    1. yum install -y lrzsz vim net-tools 2. 下载jdk-8u131-linux-x64.tar.gz http://www.oracle.com/technetw ...

  10. 一文看完vue3的变化之处

    在通读了vue的官网文档后,我记录下了如下这些相对于2.x的变化之处. 1.创建应用实例的变化 之前一般是这样: let app = new Vue({ // ...一些选项 template: '' ...