day25--Java集合08
Java集合08
15.HashTable
15.1HashTable的基本介绍
- 存放的元素是键值对:即K-V
- HashTable的键和值都不能为null
- HashTable的使用方法基本上和HashMap一样
- HashTable是线程安全的(synchronized),HashMap是线程不安全的
- HashTable是无序的

例子:
Hashtable的底层
底层有数组 HashTable$Entry [ ] 的初始化大小为 11
临界值 threshold 8=11*0.75
扩容:原来容量*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的底层
底层有数组 HashTable$Entry[ ] 初始化大小为 11
临界值 threadhold 8 = 11 * 0.75
扩容:
3.1 执行方法
addEntry(hash, key, value, index)添加K-V对封装到Entry3.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基本介绍
Properties类继承自HashTable类,并实现了Map接口,也是使用键值对的形式来保存数据
Properties使用特点和HashTable类似
Properties还可以用于 从xxx.properties文件中,加载数据到Properties类对象并进行读取和修改
说明:在工作后xxx.properties文件通常作为配置文件,这个知识点在IO举例。
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.集合选型规则(开发中如何选择集合实现类)(记住)
在开发中,选择什么集合实现类,主要取决于业务操作特点,然后根据集合实现类特性进行选择,分析如下:
先判断存储数据的类型[一组对象[单列]或者一组键值对[双列]]
一组对象[单列]:Collection接口
允许重复:List
增删多:LinkedList [底层维护了一个双向链表]
改查多:ArrayList [底层维护了Object类型的可变数组]
不允许重复:Set
无序:HashSet [底层是HshMap,维护了一个哈希表,即:数组+链表+红黑树]
有序:TreeSet
插入顺序和取出顺序一致:LinkedHashSet [底层是LinkedHashMap 数组+双向链表]
一组键值对[双列]:Map
键无序:HashMap [底层是:哈希表-->jdk7:数组+链表 jdk8:数组+链表+红黑树]
键排序:TreeMap
键插入和取出顺序一致:LinkedHashMap
读取文件:Properties

day25--Java集合08的更多相关文章
- Java 集合系列08之 List总结(LinkedList, ArrayList等使用场景和性能分析)
概要 前面,我们学完了List的全部内容(ArrayList, LinkedList, Vector, Stack). Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例 Ja ...
- Java 集合系列 08 Map架构
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
- 【转】Java 集合系列08之 List总结(LinkedList, ArrayList等使用场景和性能分析)
概要 前面,我们学完了List的全部内容(ArrayList, LinkedList, Vector, Stack). Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例 Ja ...
- Java 集合系列04之 fail-fast总结(通过ArrayList来说明fail-fast的原理、解决办法)
概要 前面,我们已经学习了ArrayList.接下来,我们以ArrayList为例,对Iterator的fail-fast机制进行了解.内容包括::1 fail-fast简介2 fail-fast示例 ...
- Java 集合系列目录(Category)
下面是最近总结的Java集合(JDK1.6.0_45)相关文章的目录. 01. Java 集合系列01之 总体框架 02. Java 集合系列02之 Collection架构 03. Java 集合系 ...
- Java 集合系列05之 LinkedList详细介绍(源码解析)和使用示例
概要 前面,我们已经学习了ArrayList,并了解了fail-fast机制.这一章我们接着学习List的实现类——LinkedList.和学习ArrayList一样,接下来呢,我们先对Linked ...
- Java 集合系列 09 HashMap详细介绍(源码解析)和使用示例
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
- Java 集合系列 10 Hashtable详细介绍(源码解析)和使用示例
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
- Java 集合系列 17 TreeSet
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
随机推荐
- 技术分享 | app自动化测试(Android)--App 控件交互
原文链接 常用操作 点击操作 通常获取到元素之后,可以调用 click() 方法来实现对这个元素的点击操作.示例代码如下: python 版本 driver.find_element_by_id(&q ...
- .NET 6.0.6 和 .NET Core 3.1.26、Visual Studio 2022 17.2 和 17.3 Preview 2 和 .NET 7.0 Preview 5 同时发布
Microsoft 昨天发布了适用于 .NET 6.0.6 和 .NET Core 3.1.26.NuGet.Visual Studio 2019 和 Visual Studio 2022 17.2 ...
- 掘地三尺搞定 Redis 与 MySQL 数据一致性问题
Redis 拥有高性能的数据读写功能,被我们广泛用在缓存场景,一是能提高业务系统的性能,二是为数据库抵挡了高并发的流量请求,点我 -> 解密 Redis 为什么这么快的秘密. 把 Redis 作 ...
- 使用 Dapr JS SDK 让 Nest.js 集成 Dapr
Dapr 是一个可移植的.事件驱动的运行时,它使任何开发人员能够轻松构建出弹性的.无状态和有状态的应用程序,并可运行在云平台或边缘计算中,它同时也支持多种编程语言和开发框架. Dapr 中文手册:ht ...
- 记一次APP渗透登录验证绕过思路
前言: 起初是抓包时候查看返回状态码不一致,所以觉得是否可以通过修改状态码来达到绕过的目的,但是拦截响应包再替换手速不够,技术大哥就去搜了下,找到了一个方法,可以自动替换响应包内容. 在偏下方一点的地 ...
- 用python随随便便做一个二维码叭~~~
Python是目前最好的编程语言之一.由于其可读性和对初学者的友好性,已被广泛使用. 那么要想学会并掌握Python,可以实战的练习项目是必不可少的. 接下来,我将给大家介绍非常实用的Python项目 ...
- 【docker专栏1】docker解决的实际问题及应用场景
Docker是一个开源的容器引擎,它轻巧,且易移植,"build once, configure once and run anywhere".使用go语言开发,并遵从apache ...
- C#《原CSharp》第三回 万文疑谋生思绪 璃月港口见清玉
第三回 万文疑谋生思绪 璃月港口见清玉 ===================================================================== 云溪愣了下,在他的认 ...
- Identity Server 4客户端认证控制访问API
项目源码: 链接:https://pan.baidu.com/s/1H3Y0ct8xgfVkgq4XsniqFA 提取码:nzl3 一.说明 我们将定义一个api和要访问它的客户端,客户端将在iden ...
- 运行Flutter时连接超时
这个墙不知道浪费了开发者多少的时间!!!!!!!!!!!!!!!!!!! 1.修改仓库地址为阿里仓库: 编辑android/build.gradle,把文件中的两处: google() jcenter ...