黑马程序员----集合框架(二)

本文深入讲解Java中的Map集合,包括其基本概念、HashMap与TreeMap的特点及使用方式,并通过实例展示了Map集合与Collection集合的区别。

------- android培训java培训、期待与您交流! ----------

一、Map

Map集合独立于Collection,不继承Collection接口。Map集合一次存储键值对,也就是两个对象,键保证了唯一性,值可以重复。集合中每个键只能对应一个值。Map<k,v> 中 K作为键的对象的泛型 Key。V作为值的对象的泛型 Value。

1、Map接口中的方法

V put(K,V) 将键值对存储到集合,当存储了重复的键的时候,方法返回被覆盖之前的值,除了这个情况外,方法返回null

V get(K,V) 获取,根据键获取值。返回映射的值,集合中没有这个键返回null。

boolean containsKey(k  key) 判断集合中有没有这个键,有返回true。

boolean containsValue(V  value) 判断集合中有没有这个值,有返回true。

boolean isEmpty()  判断集合有没有键值对,没有键值对返回true。

V remove(K,Key)  根据键,删除这组键值对,返回删除前的值。

2、Map集合的迭代方法

1)keySet方法。实现步骤:Map中的所有键,存储到Set集合,迭代Set集合获取到的元素为Map中的键,调用Map集合中的get方法获取键对应的值。

Map<String,Integer> map = new HashMap<String, Integer>();
map.put("a", 1);
map.put("b", 2);
map.put("c", 3);

//调用Map集合方法keySet获取一个Set集合,Set中存储的是Map中的键
Set<String> set = map.keySet();
//迭代Set集合
Iterator<String> it = set.iterator();
while(it.hasNext()){
//it.next获取到的是Set元素,正好是Map中的键
String key = it.next();
//调用Map集合方法 get 获取值
Integer value = map.get(key);

System.out.println(key+"..."+value);

2)entrySet方法。实现步骤:entrySet()方法获取键值对关系对象,存储到Set集合,迭代Set集合使用返回的Map.Entry对象方法 getKey。

Map<String,Integer> map = new HashMap<String, Integer>();
map.put("a", 1);
map.put("b", 2);
map.put("c", 3);

//1. 集合方法entrySet()获取Map.Entry对象,存储到Set集合
Set<Map.Entry<String, Integer>> set =   map.entrySet();
//2.迭代Set集合
Iterator<Map.Entry<String, Integer>> it = set.iterator();
while(it.hasNext()){
//3. it.next()是Map.Entry接口的实现类对象
Map.Entry<String, Integer> entry = it.next();
//4 .通过内部接口Entry方法 getKey  getValue
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key+"..."+value);

3、增强for循环。增强for循环不能直接遍历Map集合,但是可以间接遍历。

Map<String, Integer> map = new HashMap<String, Integer>();
map.put("a", 1);
map.put("b", 2);
map.put("c", 3);

Set<Map.Entry<String, Integer>> set = map.entrySet();
for(Map.Entry<String, Integer> entry : map.entrySet()){
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key+"..."+value);
}

二、HashMap

HashMap子类自身特性:底层数据结构就是哈希表,允许存储null值,null键,是线程不安全的结合,运行速度快。存储到HashMap集合中,用于建的对象,必须实现hashCode和equals方法,保证唯一性。迭代方法也依靠KeySet或entrySet。

//创建HashMap集合,键存储Student对象,值存储String
HashMap<Student,String> hm = new HashMap<Student, String>();

hm.put(new Student("a",19), "华北地区");
hm.put(new Student("b",22), "华南地区");
hm.put(new Student("c",21), "西南地区");
hm.put(new Student("d",18), "东北地区");
hm.put(new Student("a",19), "西北地区");
keySet(hm);
entrySet(hm);

public static void entrySet(HashMap<Student,String> hm){
//entrySet方法,获取Map.Entry对象,存储到Set集合
Set<Map.Entry<Student, String>> set = hm.entrySet();
//迭代Set集合
Iterator<Map.Entry<Student, String>> it = set.iterator();
while(it.hasNext()){
//next方法获取出的是 Map.Entry对象
Map.Entry<Student, String> entry = it.next();
//Map.Entry接口方法 getKet  getValue
Student key = entry.getKey();
String value = entry.getValue();
System.out.println(key+"..."+value);
}
}

public static void keySet(HashMap<Student,String> hm){
//keySet方法,获取所有键,存储到Set集合
Set<Student> set = hm.keySet();
//迭代Set集合
Iterator<Student> it = set.iterator();
while(it.hasNext()){
//next方法获取出来的是Set中的元素,Map中的键 Student对象
Student key = it.next();
//Map集合方法get获取值
String value = hm.get(key);

System.out.println(key+".."+value);
}
}

三、TreeMap

TreeMap自身特点:对存储到集合中的键进行排序,不理会值。要求是存储的键对象必须拥有自然顺序,或者指定的计较器。线程不安全,运行速度快。

TreeMap<Student,String> tree = new TreeMap<Student, String>(new StudentAgeComprator());
tree.put(new Student("pakuiao",30), "菲律宾");
tree.put(new Student("meiweise",32), "美国");
tree.put(new Student("jackson",58),"美国");
tree.put(new Student("bushi",60), "美国");
for(Student key : tree.keySet()){
String value = tree.get(key);
System.out.println(key+"..."+value);
}

四、Map集合与Collection集合的区别

1、Map中一次存储的是键值对。

      Collection中一次存储的是单个元素。

2、Map的存储使用的是put方法。

      Collection存储使用的是add方法。

3、Map的取出时将Map转成Set,再使用迭代器取出。

      Collection取出,直接使用迭代器。

4、如果对象很多,必须使用容器存储。

     如果元素存在着映射关系,可以优先考虑使用Map存储。

     如果没有映射关系,可以使用Collection存储。

五、集合练习之斗地主发牌,并排序。

import java.util.*;
public class DouDiZhuSort {
public static void main(String[] args) {
//创建Map集合,HashMap,键是牌序号,值是点数+花色
//序号利用变量 从0开始 51
//创建List,ArrayList存储编号
HashMap<Integer,String> map = new HashMap<Integer, String>();
ArrayList<Integer> array = new ArrayList<Integer>();
int index = 0;
//定义数组,2个,保存花色和点数
String[] colors = {"♦","♣","♥","♠"};
String[] numbers = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
for(String number:numbers){
 for(String color : colors){
//map 存储序号+点数花色
map.put(index, color+number);
array.add(index);
index++;
}
}

//将王存储到集合
map.put(index, "小王");
array.add(index);
index++;
map.put(index, "大王");
array.add(index);
//System.out.println(map);//存储的键是序号,值是点数+花色
//System.out.println(array);//存储是序号

//洗牌
Collections.shuffle(array);
//System.out.println(array);查看随机排列效果。

//创建4个集合接收发牌
//接收到的是牌的序号,对序号进行排序 TreeSet
TreeSet<Integer> player1 = new TreeSet<Integer>();
TreeSet<Integer> player2 = new TreeSet<Integer>();
TreeSet<Integer> player3 = new TreeSet<Integer>();
TreeSet<Integer> dipai = new TreeSet<Integer>();

for(int x = 0 ; x < array.size() ;x++){
if(x>=array.size()-3){
dipai.add(array.get(x));
}else if(x%3==0){
player1.add(array.get(x));
}else if(x%3==1){
player2.add(array.get(x));
}else if(x%3==2){
player3.add(array.get(x));
}
}
lookPoker("player1", player1, map);
lookPoker("player2", player2, map);
lookPoker("player3", player3, map);
lookPoker("底牌", dipai, map);
}
//调用看牌的方法,手上的牌是个序号,使用需要到Map中查点数花色
public static void lookPoker(String name,TreeSet<Integer> tree,HashMap<Integer,String> map){
System.out.print(name+" ");
//遍历集合是TreeSet,获取到的牌的序号
for(Integer key : tree){
//根据序号,当作键,到Map中找值
String value = map.get(key);
System.out.print(value+"  ");
}
System.out.println();
}
}


内容概要:文章以“智能网页数据标注工具”为例,深入探讨了谷歌浏览器扩展在毕业设计中的实战应用。通过开发具备实体识别、情感分类等功能的浏览器扩展,学生能够融合前端开发、自然语言处理(NLP)、本地存储与模型推理等技术,实现高效的网页数据标注系统。文中详细解析了扩展的技术架构,涵盖Manifest V3配置、内容脚本与Service Worker协作、TensorFlow.js模型在浏览器端的轻量化部署与推理流程,并提供了核心代码实现,包括文本选择、标注工具栏动态生成、高亮显示及模型预测功能。同时展望了多模态标注、主动学习与边缘计算协同等未来发展方向。; 适合人群:具备前端开发基础、熟悉JavaScript和浏览器机制,有一定AI模型应用经验的计算机相关专业本科生或研究生,尤其适合将浏览器扩展与人工智能结合进行毕业设计的学生。; 使用场景及目标:①掌握浏览器扩展开发全流程,理解内容脚本、Service Worker与弹出页的通信机制;②实现在浏览器端运行轻量级AI模型(如NER、情感分析)的技术方案;③构建可用于真实场景的数据标注工具,提升标注效率并探索主动学习、协同标注等智能化功能。; 阅读建议:建议结合代码实例搭建开发环境,逐步实现标注功能并集成本地模型推理。重点关注模型轻量化、内存管理与DOM操作的稳定性,在实践中理解浏览器扩展的安全机制与性能优化策略。
基于Gin+GORM+Casbin+Vue.js的权限管理系统是一个采用前后端分离架构的企业级权限管理解决方案,专为软件工程和计算机科学专业的毕业设计项目开发。该系统基于Go语言构建后端服务,结合Vue.js前端框架,实现了完整的权限控制和管理功能,适用于各类需要精细化权限管理的应用场景。 系统后端采用Gin作为Web框架,提供高性能的HTTP服务;使用GORM作为ORM框架,简化数据库操作;集成Casbin实现灵活的权限控制模型。前端基于vue-element-admin模板开发,提供现代化的用户界面和交互体验。系统采用分层架构和模块化设计,确保代码的可维护性和可扩展性。 主要功能包括用户管理、角色管理、权限管理、菜单管理、操作日志等核心模块。用户管理模块支持用户信息的增删改查和状态管理;角色管理模块允许定义不同角色并分配相应权限;权限管理模块基于Casbin实现细粒度的访问控制;菜单管理模块动态生成前端导航菜单;操作日志模块记录系统关键操作,便于审计和追踪。 技术栈方面,后端使用Go语言开发,结合Gin、GORM、Casbin等成熟框架;前端使用Vue.js、Element UI等现代前端技术;数据库支持MySQL、PostgreSQL等主流关系型数据库;采用RESTful API设计规范,确保前后端通信的标准化。系统还应用了单例模式、工厂模式、依赖注入等设计模式,提升代码质量和可测试性。 该权限管理系统适用于企业管理系统、内部办公平台、多租户SaaS应用等需要复杂权限控制的场景。作为毕业设计项目,它提供了完整的源码和论文文档,帮助学生深入理解前后端分离架构、权限控制原理、现代Web开发技术等关键知识点。系统设计规范,代码结构清晰,注释完整,非常适合作为计算机相关专业的毕业设计参考或实际项目开发的基础框架。 资源包含完整的系统源码、数据库设计文档、部署说明和毕
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值