Map集合_HashMap_TreeMap_等_小记
Map是一种依照键值对数据存储元素的容器。
Map中的元素是两个对象,一个对象作为键,一个对象作为值。一个键(key)和它对应的值构成map集合中的一个元素。Map集合的数据结构只跟键有关,键不可以重复,但是值可以重复。
—|Hashtable:
底层是哈希表数据结构,线程是同步的,不可以存入null键,null值。
效率较低,被HashMap 替代。
—|HashMap:
底层是哈希表数据结构,线程是不同步的,可以存入null键,null值。
要保证键的唯一性,需要覆盖hashCode方法,和equals方法。哈希表的数据结构保证了元素的唯一性,内在是因为重写了equal和HashCode方法。
—| LinkedHashMap:
该子类基于哈希表又融入了链表。可以Map集合进行增删提高效率。
—|TreeMap:
底层是二叉树数据结构。可以对map集合中的键进行排序。需要使用Comparable或者Comparator 进行比较排序。return 0,来判断键的唯一性。
Map
常用方法:
V put(K key, V value)添加键值对,第一次用put存储数据,返回null,第二次放置键相同的数据,返回第一次放置的值。
remove(K) 输入键值,移除键对应的值,并返回该值
clear() 清空集合对象
value get(key); 可以用于判断键是否存在的情况。当指定的键不存在的时候,返 回的是null。
boolean isEmpty() 判断是否为空,长度为0返回true否则false
boolean containsKey(Object key) 判断集合中是否包含指定的key
boolean containsValue(Object value) 判断集合中是否包含指定的value
Int size()
package Day16_HashMap;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set;
/**
* @author Aoman_Hao
*/
public class HashMapTest {
public static void main(String[] args) {
HashMap<Integer, String> Ha = new HashMap<Integer,String>();
String s1 = Ha.put(1, "刘诗诗");
String s2 = Ha.put(2, "诗诗");
String s3 = Ha.put(3, "涵");
String s4 = Ha.put(4, "TZRRY");
Ha.put(8, "TZRRY");
String s5 = Ha.put(5, "刘诗5");
Ha.put(5, "刘诗6");
//集中健的集合 keySet
Set<Integer> keySet = Ha.keySet();
for(Integer key:keySet){
System.out.println("编号:"+key+"\t"+"姓名:"+Ha.get(key));
}
System.out.println("--------------------------------");
//返回键值对的集合entrySet
Set<Entry<Integer, String>> entry = Ha.entrySet();
for(Entry<Integer, String> key2:entry ){
System.out.println("号="+key2.getKey()+"\t"+"名="+key2.getValue());
}
System.out.println("--------------------------------");
//判断是否包含键 containsKey
System.out.println("是否包含键2,"+Ha.containsKey(2));
System.out.println("是否包含键10,"+Ha.containsKey(10));
//判断是否包含值 containsValue
System.out.println("是否包含值‘刘诗诗’,"+Ha.containsValue("刘诗诗"));
System.out.println("是否包含值‘Aoman’,"+Ha.containsValue("Aoman"));
System.out.println("-----------------------");
//暴力清空
Ha.clear();
System.out.println(Ha);
}
}
输出:
编号:1 姓名:刘诗诗
编号:2 姓名:诗诗
编号:3 姓名:涵
编号:4 姓名:TZRRY
编号:5 姓名:刘诗6
编号:8 姓名:TZRRY
--------------------------------
号=1 名=刘诗诗
号=2 名=诗诗
号=3 名=涵
号=4 名=TZRRY
号=5 名=刘诗6
号=8 名=TZRRY
--------------------------------
是否包含键2,true
是否包含键10,false
是否包含值‘刘诗诗’,true
是否包含值‘Aoman’,false
-----------------------
{}
总:键相同,值覆盖,map集合的数据结构只跟键有关,如要存储不一样的数据,必须保证键值是不一样的,否则会导致存储数据跟预想的不一样,会丢失数据。map集合重写了tostring语句,所以可以有默认格式的输出,hash表的结构的特点是输出无序的,即存数据跟取数据的顺序是不一致的。
测试类
package Day16_HashMap;
import java.util.HashMap;
import java.util.Set;
/**
* @author Aoman_Hao
*/
public class HashMapTest2 {
public static void main(String[] args) {
//创建
HashMap<Star, Integer> StHa = new HashMap<Star,Integer>();
StHa.put(new Star("刘诗诗", 23, "女"), 01);
StHa.put(new Star("TZRRY", 24, "男"), 02);
StHa.put(new Star("涵", 25, "女"), 03);
StHa.put(new Star("刘六", 28, "男"), 04);
//打印成字符串
//键集合,转为数组类型,
Object[] array = StHa.keySet().toArray();
StringBuffer Sb = new StringBuffer();
for(Object key: array){
//强转star类型
Star s_Key=(Star)key;
//append拼接
Sb.append("个人信息:").append("姓名:").append(s_Key.getName()).append("\t")
.append("年龄:").append(s_Key.getAge()).append("\t")
.append("性别").append(s_Key.getGender()).append("\t")
.append("编号:").append(StHa.get(key)).append("\r\n");
}
System.out.println(Sb);
}
}
输出:
个人信息:姓名:TZRRY 年龄:24 性别男 编号:2
个人信息:姓名:刘六 年龄:28 性别男 编号:4
个人信息:姓名:涵 年龄:25 性别女 编号:3
个人信息:姓名:刘诗诗 年龄:23 性别女 编号:1
注:star是简单的姓名年龄性别的类。
LinkedHashMap的特点是元素有序,元素唯一。
有序性即存取数据的顺序是一致的,是靠链表完成的。
唯一性是靠哈希表完成的。
package Day16_HashMap;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Set;
/**
* @author Aoman_Hao
*/
public class HashMapTest2 {
public static void main(String[] args) {
//创建
HashMap<Star, Integer> StHa = new LinkedHashMap<Star,Integer>();
StHa.put(new Star("刘诗诗", 23, "女"), 01);
StHa.put(new Star("TZRRY", 24, "男"), 02);
StHa.put(new Star("涵", 25, "女"), 03);
StHa.put(new Star("刘六", 28, "男"), 04);
//打印成字符串
//键集合,转为数组类型,
Object[] array = StHa.keySet().toArray();
StringBuffer Sb = new StringBuffer();
if(StHa!=null){
for(Object key: array){
//强转star类型
Star s_Key=(Star)key;
//append拼接
Sb.append("个人信息:").append("姓名:").append(s_Key.getName()).append("\t")
.append("年龄:").append(s_Key.getAge()).append("\t")
.append("性别").append(s_Key.getGender()).append("\t")
.append("编号:").append(StHa.get(key)).append("\r\n");
}
System.out.println(Sb);
}
}
}
输出:
个人信息:姓名:刘诗诗 年龄:23 性别女 编号:1
个人信息:姓名:TZRRY 年龄:24 性别男 编号:2
个人信息:姓名:涵 年龄:25 性别女 编号:3
个人信息:姓名:刘六 年龄:28 性别男 编号:4
注:增强for循环前定要对集合进行非空判断,否则会出现空指针异常。
HashMap嵌套串用,可与ArrayList搭配使用
package Day16_HashMap;
import java.util.HashMap;
import java.util.Set;
/**
*
*
* 集合嵌套之HashMap嵌套HashMap
偶像派(没演技)
杨幂 30 女
杨颖 30 女
实力派
刘诗诗 27 女
胡歌 30 男
* @author Aoman_Hao
*/
public class HashMapQT {
public static void main(String[] args) {
//创建小集合
HashMap<Star, String> Idol = new HashMap<Star,String>();
HashMap<Star, String> Actor = new HashMap<Star,String>();
//创建大集合
HashMap<String, HashMap<Star, String>> Hash = new HashMap<String,HashMap<Star, String>>();
//添加元素
Idol.put(new Star("杨幂", 30, "女"), "i1");
Idol.put(new Star("杨颖", 30, "女"), "i2");
Actor.put(new Star("刘诗诗", 27, "女"), "a1");
Actor.put(new Star("胡歌", 30, "男"), "a1");
Hash.put("偶像", Idol);
Hash.put("实力派", Actor);
Set<String> Hash_keyset = Hash.keySet();
//遍历大集合
for(String fen:Hash_keyset){
//得到大集合中元素,求的其键
HashMap<Star, String> Hash_son = Hash.get(fen);
Set<Star> Hash_son_keySet = Hash_son.keySet();
//格式打印
System.out.println("分类:"+fen);
System.out.println("\t"+"姓名:"+"\t"+"年龄:"+"\t"+"性别:"+"\t"+"编号:");
//建立缓冲区,append拼接
StringBuffer Sb = new StringBuffer();
//遍历小集合
for(Star key:Hash_son_keySet){
Sb.append("\t").append(key.getName()).append("\t")
.append(key.getAge()).append("\t")
.append(key.getGender()).append("\t")
.append(Hash_son.get(key)).append("\r\n");
}
System.out.println(Sb);
}
}
}
输出:
分类:实力派
姓名: 年龄: 性别: 编号:
胡歌 30 男 a1
刘诗诗 27 女 a1
分类:偶像
姓名: 年龄: 性别: 编号:
杨幂 30 女 i1
杨颖 30 女 i2
Collections常用法
public static void sort(List list): 排序,默认按照自然顺序
public static int binarySearch(List<> list,T key): 二分查找
public static T max(Collection<> coll): 获取最大值
public static void reverse(List<> list): 反转
public static void shuffle(List<> list): 随机置换
Map集合_HashMap_TreeMap_等_小记的更多相关文章
- 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_08 Map集合_10_练习_计算一个字符串中每个字符出现的次数
- EL_获取域中存储的值_ List 集合&Map集合值和EL _ empty 运算符&隐式对象 pageContext
3.获取对線. List 集合. Map 集合的值 1.对線:${域名称,键名.属性名}本质上会去调用对線的 getter 方法 2. List 集合:${域名称.键名[索引]} List list ...
- ES6中的Set和Map集合
前面的话 在ES6标准制定以前,由于可选的集合类型有限,数组使用的又是数值型索引,因而经常被用于创建队列和栈.如果需要使用非数值型索引,就会用非数组对象创建所需的数据结构,而这就是Set集合与Map集 ...
- 详解Map集合体系及方法entrySet、keySet、values
简单回顾Map集合: Map表示映射关系,以键值对的方式来保存数据.key和value一一对应.key是唯一的,不可重复,而value是可重复的,可以被多个key关联.虽然Map是放入两个数据,但是却 ...
- ES6中的Map集合(与java里类似)
Set类型可以用来处理列表中的值,但是不适用于处理键值对这样的信息结构.ES6也添加了Map集合来解决类似的问题 一.Map集合 JS的对象(Object),本质上是键值对的集合(Hash结构),但是 ...
- Java基础(二十三)集合(6)Map集合
Map接口作为Java集合框架中的第二类接口,其子接口为SortedMap接口,SortedMap接口的子接口为NavigableMap接口. 实现了Map接口具体类有:HashMap(子类Linke ...
- 第1节 Scala基础语法:13、list集合的定义和操作;16、set集合;17、map集合
list.+:5 , list.::5: 在list集合头部添加单个元素5 : li1.:+(5):在list集合尾部添加单个元素5: li1++li2,li1:::li2:在li1集合尾部添加il2 ...
- HashTable集合和练习题_计算一个字符串中每一个字符出现的次数
HashTable集合 /** * java.util.Hashtable<K,V>集合 implement Map<K,V>接口 * Hashtable:底层也是一个哈希表, ...
- Java版本:识别Json字符串并分隔成Map集合
前言: 最近又看了点Java的知识,于是想着把CYQ.Data V5迁移到Java版本. 过程发现坑很多,理论上看大部分很相似,实践上代码写起来发现大部分都要重新思考方案. 遇到的C#转Java的一些 ...
- Java常用的几种集合, Map集合,Set集合,List集合
Java中 Object是所有类的根 Java集合常用的集合List集合.Set集合.Map集合 Map接口常用的一些方法 size() 获取集合中名值对的数量 put(key k, value v ...
随机推荐
- 【Python爬虫(一)】XPath
解析方式:XPath XPath的基本使用 1 安装lxml库 conda install lxml 下载慢的话可以试一下热点或切换下载源 2 导入etree from lxml import etr ...
- [Asp.Net Core] 网站中的XSS跨站脚本攻击和防范
漏洞说明: 跨站脚本攻击(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS.恶意攻击者往 ...
- odoo 开发入门教程系列-QWeb简史
QWeb简史 到目前为止,我们的房地产模块的界面设计相当有限.构建列表视图很简单,因为只需要字段列表.表单视图也是如此:尽管使用了一些标记,如<group>或<page>,但在 ...
- 关于linux下Qt5.7.0安装中文输入法无法显示的问题
关于linux下Qt5.7.0安装中文输入法无法显示的问题 本文是以我自己系统ubuntu-x64 + fcitx + Qt5.7.0为例: sudo apt-get install fcitx-fr ...
- Python 列表的修改、添加和删除元素
列表修改.添加和删除元素 大多数创建的列表都是动态的,随程序的运行增删元素 修改列表元素 指定列表名和要修改的元素的索引,再指定要修改元素的新值 # 修改列表元素案例 motorcycles = [' ...
- spring事务传播的Propagation.REQUIRES_NEW以及NEVER MANDATORY验证,及其失效的诡异问题
NEVER 不使用事务,如果当前事务存在,则抛出异常 验证: @Service public class PrService { @Autowired PrDao dao; @Transactiona ...
- 2022-10-21:你将得到一个整数数组 matchsticks ,其中 matchsticks[i] 是第 i 个火柴棒的长度。 你要用 所有的火柴棍 拼成一个正方形。 你 不能折断 任何一根火柴
2022-10-21:你将得到一个整数数组 matchsticks ,其中 matchsticks[i] 是第 i 个火柴棒的长度. 你要用 所有的火柴棍 拼成一个正方形. 你 不能折断 任何一根火柴 ...
- vue全家桶进阶之路43:Vue3 Element Plus el-form表单组件
在 Element Plus 中,el-form 是一个表单组件,用于创建表单以便用户填写和提交数据.它提供了许多内置的验证规则和验证方法,使表单验证更加容易. 使用 el-form 组件,您可以将表 ...
- < Python全景系列-5 > 解锁Python并发编程:多线程和多进程的神秘面纱揭晓
欢迎来到我们的系列博客<Python全景系列>!在这个系列中,我们将带领你从Python的基础知识开始,一步步深入到高级话题,帮助你掌握这门强大而灵活的编程语法.无论你是编程新手,还是有一 ...
- 【从0开始编写webserver·基础篇#02】服务器的核心---I/O处理单元和任务类
I/O处理单元和任务类 前面写了线程池,那么现在要考虑如何去使用该线程池了 注意,到目前为止,我们还是在解决web服务器的I/O处理单元 即负责处理客户连接,读写网络数据的部分 线程池属于 Web 服 ...