零基础学JAVA--Day34(Map接口+HashTable+HashMap+TreeSet+TreeMap+开发中如何选择集合实现类?(重要)) - 指南

news/2025/12/14 20:45:13/文章来源:https://www.cnblogs.com/yangykaifa/p/19349816

Map接口


Map接口实现类的特点

注意:这里讲的是JDK8的Map接口特点Map_java
1)Map与Collection并列存在。用于保存具有映射关系的数据:Key-Value
2)Map中的key和value可以是任何引l用类型的数据,会封装到HashMap$Node对象中
3)Map中的key不允许重复,原因和HashSet一样,前面分析过源码。
4) Map中的 value 可以重复
5) Map的key可以为 null,value也可以为null,注意key为null只能有一个,value为null,可以多个.
6)常用String类作为Map的 key
7)key和value之间存在单向一对一关系,即通过指定的key总能找到对应的value

package com.Map;
import java.util.Collection;
import java.util.HashMap;
import java.util.Set;
public class Map_ {@SuppressWarnings("all")public static void main(String[] args) {//1、放的是KEY-VALUEHashMap map = new HashMap();map.put("no1", "aaa");map.put("no2", "bbb");map.put("no3", "ccc");map.put("no4", "aaa");//VALUE是可以重复的map.put("no3", "ddd");//会直接替换KEY=no3的VALUEmap.put(null, "ddd");//KEY只能有一个空map.put("no5", null);//Value可以有很多空System.out.println("MAP" +map);//输出结果的顺序并不是输入的顺序System.out.println(map.get("no5"));//可以通过找KEY来找其对应的valueSet set = map.keySet();//返回所有的keySystem.out.println(set);Collection values = map.values();System.out.println(values);//返回所有value}
}

8)Map存放数据的key-value示意图,一对k-v是放在一个Node中的,有因为Node实。
现了Entry接口,有些书上也说一对k-v就是一个Entry(如图)

常用方法

1) put:添加
2)remove:根据键删除映射关系
3)get:根据键获取值
4)size:获取元素个数
5)isEmpty:判断个数是否为0
6) clear:清除
7)containskey:查找键是否存在

package com.Map;
import java.util.HashMap;
public class MapMethods {@SuppressWarnings("all")public static void main(String[] args) {//常用方法HashMap map = new HashMap();map.put("no1", "aaa");map.put("no2", "bbb");map.put("no3", "ccc");map.put("no4", "ddd");map.put("no5", "eee");map.put("no3", "fff");//removemap.remove("no2");//get 根据key获取元素map.get("no1");//size 获取元素map.size();//isEmpty 判空map.isEmpty();//containsKey 查找key是否存在map.containsValue("no4");//clear 清空mapmap.clear();}
}

几种遍历方式

package com.Map;
import java.util.*;
public class MapTraverse {@SuppressWarnings("all")public static void main(String[] args) {//常用方法HashMap map = new HashMap();map.put("no1", "aaa");map.put("no2", "bbb");map.put("no3", "ccc");map.put("no4", "ddd");map.put("no5", "eee");map.put("no3", "fff");//1、遍历所有的KEY,再通过KEY遍历所有的VALUESet keyset = map.keySet();//方法一:增强for循环(推荐)for (Object key :keyset) {System.out.println(key +"-"+map.get(key));}//方式二:迭代器Iterator iterator = keyset.iterator();while (iterator.hasNext()) {Object next =  iterator.next();//这个next就是keySystem.out.println(next +"-"+map.get(next));}//2、把所有的values取出Collection values = map.values();//方式一:增强forfor (Object value :values) {System.out.println(value);}//方式二:迭代器Iterator iterator1 = values.iterator();while (iterator1.hasNext()) {Object next =  iterator1.next();//这个next就是valueSystem.out.println(next);}//3、通过EntrySet取出 key-valueSet entryset = map.entrySet();//方式一:增强forfor (Object entry :entryset) {//把entry 转为map.entryMap.Entry a = (Map.Entry) entry;System.out.println(a.getKey()+"-"+a.getValue());}//方式二:迭代器Iterator iterator2 = entryset.iterator();while (iterator2.hasNext()) {Object next =  iterator2.next();//HashMap$Node-实现->Map.EntryMap.Entry next1 = (Map.Entry) next;//向下转型System.out.println(next1.getKey()+"-"+next1.getValue());}}
}

HashMap扩容机制

>扩容机制[和HashSet相同]
1)HashMap底层维护了Node类型的数组table,默认为null
2)当创建对象时,将加载因子(loadfactor)初始化为0.75.
3)当添加key-val时,通过key的哈希值得到在table的索引。然后判断该索引处是否有元素,如果没有元素直接添加。如果该索引处有元素,继续判断该元素的key和准备加入的key相是否等,如果相等,则直接替换val;如果不相等需要判断是树结构还是链表结构,做出相应处理。如果添加时发现容量不够,则需要扩容。
4)第1次添加,则需要扩容table容量为16,临界值(threshold)为12(16*0.75)
5)以后再扩容,则需要扩容table容量为原来的2倍(32),临界值为原来的2倍,即24,依次类推
6)在JaVa8中,如果一条链表的元素个数超过TREEIFYTHRESHOLD(默认是8),并且table的大小>=MINTREEIFYCAPACITY(默认64),就会进行树化(红黑树)

HashTable

1)存放的元素是键值对:即K-V
2)hashtable的键和值都不能为null
3)hashTable使用方法基本上和HashMap一样
4)hashTable是线程安全的,hashMap是线程不安全
5)底层有数组Hashtable$Entry[ ],初始化大小为11

扩容机制

1。底层有数组Hashtable$Entry[]初始化大小为11
2。临界值 threshold 8=11 *0.75
3。扩容:按照自己的扩容机制来进行即可。
4。执行方法addEntry(hashkey,value,index);添加K-V封装到Entry
5。当if(count>=threshold)满足时,就进行扩容
5。按照int  newCapacity=(oldCapacity<<1)+1 的大小扩容。(乘2+1)

Hashtable 和 HashMap对比

Properties类

1.Properties类继承自Hashtable类并且实现了Map接口,也是使用一种键值对的形式来保存数据。
2.他的使用特点和Hashtable类似
3.Properties主要用于从xxx.properties文件中,加载数据到Properties类对象,并进行读取和修改
4.说明:工作后xxx.properties文件通常作为配置文件,这个知识点在lo流举例

properties常用方法

package com.Map;
import java.util.Properties;
public class Properties_ {@SuppressWarnings("all")public static void main(String[] args) {//1、继承自HashMap//2、key和value不能为null//增加Properties properties= new Properties(;properties.put("john",100);//k-vproperties.put("lucy",100);properties.put("lic",100);properties.put("lic",88);//替换,修改//获取valueproperties.get("lic");//删除properties.remove("lic");}
}

TreeSet

排序输出

package com.Map;
import java.util.Comparator;
import java.util.TreeSet;
public class TreeSet_ {@SuppressWarnings("all")public static void main(String[] args) {TreeSet treeSet = new TreeSet(new Comparator() {@Overridepublic int compare(Object o1, Object o2) {//调用String的compareTo方法,按照字符串首个字母的大小进行比较return ((String)o1).compareTo((String)o2);//按照长度大小排序//return ((String)o1).length - ((String)o2).length;}});//添加数据。treeSet.add("jack");treeSet.add("tom");treeSet.add("sp");treeSet.add("a");//按照无参构造器,实际是无序的,还是需要处理System.out.println(treeSet);//使用TreeSet提供的一个构造器,可以传入一个比较器(匿名内部类)//并指定排序规则//上面写了匿名内部类//按照匿名内部类的规则,比如上面的是按照字符串首个字母的大小进行比较,则如果同时add(a)和add(abc),则后面的abc加不进去,因为底层源码中得到了key=0,就不能再加了//同理,如果是按照长度大小排序,则add(abc)和add(aaa)只会保留前面的}
}

TreeMap

package com.Map;
import java.util.Comparator;
import java.util.TreeMap;
public class TreeMap_ {@SuppressWarnings({"all"})public static void main(String[] args) {
//        TreeMap treeMap = new TreeMap();//使用默认的构造器,创建TreeMap,是无序的
//        TreeMap treeMap = new TreeMap(new Comparator() {
//            @Override
//            public int compare(Object o1, Object o2) {
//                return ((String)o1).compareTo((String)o2);
//            }
//        });//编写排序方法:按照key的字符大小进行排序TreeMap treeMap = new TreeMap(new Comparator() {@Overridepublic int compare(Object o1, Object o2) {return ((String)o1).length()-((String)o2).length();}});//编写排序方法:按照key的长度大小进行排序treeMap.put("jack","杰克");treeMap.put("tom","汤姆");treeMap.put("kristina","克瑞斯提诺");treeMap.put("smith","斯密斯");treeMap.put("abc","斯密斯");//加不进去,因为按照现在的比较方法此时abc和上面的tom的长度一样,底层认为这两个key一样,所以加不进去System.out.println(treeMap);}
}

开发中如何选择集合实现类?(重要)

在开发中,选择什么集合实现类,主要取决于业务操作特点,然后根据集合实现类特性进行
选择,分析如下:
1)先判断存储的类型(组对象或一组键值对)
2)一组对象:Collection接口
        允许重复:List
增删多:LinkedList[底层维护了一个双向链表]
改查多:ArrayList[底层维护Object类型的可变数组]
        不允许重复:Set
                无序:HashSet[底层是HashMap,维护了一个哈希表即(数组+链表+红黑树)
                排序:TreeSet
                插入和取出顺序一致:LinkedHashSet,维护数组+双向链表
3)一组键值对:Map
        键无序:HashMap[底层是:哈希表jdk7:数组+链表,jdk8:数组+链表+红黑树]
        键排序:TreeMap
        键插入和取出顺序一致:LinkedHashMap
        读取文件 Properties

——————————————————————————————————

Day34 End

今天晚上有课,这周周末两个考试,好累啊

离回家还有54天,看12月初能不能去一趟南京

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1014890.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电影院购票|基于springboot 电影院购票系统(源码+数据库+文档)

电影院购票 目录 基于springboot vue电影院购票系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于springboot vue电影院购票系统 一、前言 博主介绍&#xff1a…

C#+VisionMaster联合开发(二)_操作流程

1、获取方案中的流程列表 // 加载流程列表 ProcessInfoList processInfoList = VmSolutionMain.GetAllProcedureList(); if (processInfoList.nNum > 0) {var processNames = processInfoList.astProcessInfo.ToLis…

本地部署DeepSeek

ollama终端的方式部署参考&#xff1a;ollama本地部署 智谱API Key获取 LM Studio 它是模型的托管平台&#xff0c;可以把模型加载后&#xff0c;作为服务器向外提供服务器&#xff0c;本身也具有简单的对话框可以聊天。 &#xff1a;https://lmstudio.ai/ 在左下角改为开发者…

AI驱动的手动测试变革:赋能而非替代

随着大语言模型和智能自动化技术的飞速发展&#xff0c;软件测试领域正迎来前所未有的变革浪潮。传统手动测试作为软件质量保障的基石&#xff0c;面临着效率提升与价值重塑的双重挑战。 AI时代手动测试的困境与机遇 传统手动测试的局限性 手动测试长期面临着测试覆盖率低、…

航空机票预定系统|基于springboot 航空机票预定系统(源码+数据库+文档)

航空机票预定 目录 基于springboot vue航空机票预定系统 一、前言 二、系统功能演示 ​三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于springboot vue航空机票预定系统 一、前言 博主介绍&am…

[Windows] 剪映自动预合成v1.0

[Windows] 剪映自动预合成v1.0 链接&#xff1a;https://pan.xunlei.com/s/VOgRWgF_QfvslGjXSYwZaeDXA1?pwdrd56# 从零散的元素 【进入】预合成状态&#xff0c;一键完成。 配合47kb的【剪映草稿助手】还是不错的。

低代码平台的测试挑战:测试从业者的新战场

随着低代码开发平台在企业数字化转型中的广泛应用&#xff0c;软件测试领域正面临前所未有的范式转变。据Gartner预测&#xff0c;到2025年&#xff0c;70%的新应用将由低代码平台开发&#xff0c;这一趋势正在重新定义测试工程师的角色定位和方法体系。作为测试从业者&#xf…

Go项目发布到Go官方仓库完整指南

Go项目发布到Go官方仓库完整指南 在Go语言生态系统中&#xff0c;发布自己的开源包是贡献社区和提高代码复用性的重要方式。本文将详细介绍如何将Go项目发布到Go官方仓库&#xff08;通过Go Module Proxy&#xff09;&#xff0c;让全球开发者能够轻松使用你的包。 一、准备工…

智能测试用例生成技术探秘

1 技术演进&#xff1a;从手动到智能的范式转移 传统测试用例设计严重依赖测试人员的经验判断&#xff0c;存在覆盖盲区与效率瓶颈。随着DevOps和持续测试的普及&#xff0c;智能测试用例生成技术通过机器学习、自然语言处理与代码静态分析等技术的融合&#xff0c;实现了测试…

瞬行PRO_9.9.9_高级版

瞬行PRO_9.9.9_高级版 链接&#xff1a;https://pan.xunlei.com/s/VOgRYhSSLjN4Y34iBXDOmA5qA1?pwddks7# 一款定位修改工具依托调试API与百度地图&#xff0c;能精准模拟全球任意地点&#xff0c;无需Root权限&#xff0c;只需在开发者模式中&#xff0c;将模拟位置信息应用…

初识结构体(新手友好)

今天写排结构体的顺序的函数时&#xff0c;发现对结构体的理解似乎有些遗忘&#xff0c;所以我赶紧冲进CSDN写一篇复习类博客&#xff0c;复习的同时也是进一步加深理解&#xff0c;希望也对你有帮助。我将讨论一下问题&#xff1a;①为什么要定义结构体这种变量类型&#xff1…

学习测评|基于springboot学习测评系统(源码+数据库+文档)

学习测评 目录 基于springboot vue学习测评系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于springboot vue学习测评系统 一、前言 博主介绍&#xff1a;✌️大…

免费AI写论文神器来袭!6款工具一键生成初稿,写论文效率提升300%! - 麟书学长

本文深度测评6款免费/高性价比AI论文神器,助力解决论文写作难题。使用AI工具可提升效率、突破瓶颈,如生成提纲、自动化流程、降重等。巨鲸写作能高效产出高质量论文;WriteSonic适合找灵感;知学空间有免费范文;AI论…

leetcode 困难题 745.Prefix and Suffix Search 前缀和后缀搜索

Problem: 745. Prefix and Suffix Search 前缀和后缀搜索 解题过程 ASCII内&#xff0c;"{"刚好在"z"后面&#xff0c;所以算是特殊字符&#xff0c;按照提示拼起来&#xff0c;然后放入到字典树当中去&#xff0c;并且在{后面的前缀需要求出最大的索引 查…

列车售票|基于springboot 列车售票系统(源码+数据库+文档)

列车售票目录 基于springboot vue列车售票系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于springboot vue列车售票系统 一、前言 博主介绍&#xff1a;✌️大厂…

EtherCAT 逐帧报文解析:配置SM/FMMU

1、APWR 写 0x10 寄存器&#xff1a;设定从站地址发&#xff1a;回&#xff1a;2、APRD读0x130&#xff1a;读取AL状态发&#xff1a;回&#xff1a;3、FPWR 写 0x910、0x990、0x981、0x930、0x934 寄存器&#xff1a;清空DC配置发&#xff1a;回&#xff1a;4、APWR 写 0x120 …

如何使用SendMessageW或PostMessageW发送换行?

最近在更新这个软件https://github.com/DarkKandaoMaster/QuickSay,有一个功能需要使用SendMessageW或PostMessageW发送换行,故在此列出尝试过的方法:我尝试过的方法有: 1.使用PostMessageW发送换行: 直接使用Pos…

拒绝“面条代码”!Flutter 校园项目的“三层架构”实战

拒绝“面条代码”&#xff01;Flutter 校园项目的“三层架构”实战 作为一名计算机专业的学生&#xff0c;你是否遇到过这种情况&#xff1a; 为了赶课程设计或hackathon&#xff0c;在 StatefulWidget 的 build 方法里直接写 Dio.get &#xff0c;把网络请求、JSON解析、UI更…

2025.12 北京集训 数学专题

A. [ARC147D] Sets Scores 较为简单的(因为除他以外,非黑即紫)。 考虑我们可以显然可以用一个长为 \(m\) 的 \(bool\) 数组 \(c\) 和一个长为 \(n-1\) 的 \(int\) 数组 \(p\) 唯一表示一种情况。考虑用 \(c\) 数组表…

力扣1965-丢失信息的雇员

表: Employees---------------------- | Column Name | Type | ---------------------- | employee_id | int | | name | varchar | ---------------------- employee_id 是该表中具有唯一值的列。 每一行表示雇员的 id 和他的姓名。表: Salaries---------------…