day25--Java集合08
2022/8/25 14:23:29
本文主要是介绍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举例。
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.集合选型规则(开发中如何选择集合实现类)(记住)
在开发中,选择什么集合实现类,主要取决于业务操作特点,然后根据集合实现类特性进行选择,分析如下:
-
先判断存储数据的类型[一组对象[单列]或者一组键值对[双列]]
-
一组对象[单列]:Collection接口
允许重复:List
增删多:LinkedList [底层维护了一个双向链表]
改查多:ArrayList [底层维护了Object类型的可变数组]
不允许重复:Set
无序:HashSet [底层是HshMap,维护了一个哈希表,即:数组+链表+红黑树]
有序:TreeSet
插入顺序和取出顺序一致:LinkedHashSet [底层是LinkedHashMap 数组+双向链表]
-
一组键值对[双列]:Map
键无序:HashMap [底层是:哈希表-->jdk7:数组+链表 jdk8:数组+链表+红黑树]
键排序:TreeMap
键插入和取出顺序一致:LinkedHashMap
读取文件:Properties
这篇关于day25--Java集合08的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-26Mybatis官方生成器资料详解与应用教程
- 2024-11-26Mybatis一级缓存资料详解与实战教程
- 2024-11-26Mybatis一级缓存资料详解:新手快速入门
- 2024-11-26SpringBoot3+JDK17搭建后端资料详尽教程
- 2024-11-26Springboot单体架构搭建资料:新手入门教程
- 2024-11-26Springboot单体架构搭建资料详解与实战教程
- 2024-11-26Springboot框架资料:新手入门教程
- 2024-11-26Springboot企业级开发资料入门教程
- 2024-11-26SpringBoot企业级开发资料详解与实战教程
- 2024-11-26Springboot微服务资料:新手入门全攻略