Java类集框架(二)

news2024/11/18 3:49:50

目录

1.Map(常用子类 HashMap,LinkedHashMap,HashTable,TreeMap)

2.Map的输出(Map.Entry,iterator,foreach)

3.数据结构 - 栈(Stack)

4.数据结构 - 队列(Queue)

5.属性类Properties

5.Collections工具类


1.Map(常用子类 HashMap,LinkedHashMap,HashTable,TreeMap)

Map最大的特点就是二元偶对象(存储的结构是 key = value),比如说存放的可以是学生+成绩,如:黄小龙 = 60 。并且Map与Collection集合在操作上的不同是,Map中文是地图,最大的作用是用以查找数据,而Collection最主要用以输出数据

方法描述
public void put(K key, V value)将指定的键值对添加到Map中
public V get(Object key)返回与指定键关联的值
public Set<Map.Entry<K, V>> entrySet()返回Map中包含的所有键值对的Set集合
public V remove(Object key)从Map中移除指定键及其关联的值
public boolean containsKey(Object key)如果Map中包含指定键,则返回true;否则返回false

1.HashMap(散列Map)子类

案例代码HashMap的创建:

package Example1813;

import java.util.HashMap;
import java.util.Map;

public class javaDemo {
    public static void main(String[] args) {
        Map<String,Integer> map = new HashMap<String,Integer>();
        map.put("王",12);
        map.put("张",6);
        map.put("黄",2);
        map.put("何",8);
//        输入存在null的数据
        map.put("只有key",null);
        map.put(null,2);
        map.put(null,null);
        System.out.println(map);
    }
}

  1. 由于是Hash散列,所以存储的数据是混乱无序的,如果按照顺序输入数据可能会被打乱,所以为了解决这个问题如同Set的HashSet一样引入了LinkedHashMap
  2. HashMap允许放入的数据存在空值(NULL)

2.LinkedHashMap子类

有序型Map,通过放入的顺序保证输出的顺序

案例代码:成绩查询系统

package Ecample1814;

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Scanner;

public class javaDemo {
    public static void main(String[] args) {
        Map<String,Integer> map = new LinkedHashMap<>();
        map.put("黄小龙",60);
        map.put("张春蛋",62);
        map.put("王二",73);
        map.put("王包",77);
        map.put("陈色",78);

        System.out.println("欢迎使用成绩查询系统,请输入想要查询的成绩姓名");
        Scanner scan = new Scanner(System.in);
        String temp = scan.next();

        if (map.containsKey(temp)){
            System.out.println(temp+"同学成绩为:"+ map.get(temp));
        }else System.out.println("无查询对象");
    }
}

3.HashTable子类

HashTable,也是无序的存放,但是其中不能存放空值否则会报错

案例代码:

package Example1816;

import java.util.Hashtable;
import java.util.Map;

public class javaDemo {
    public static void main(String[] args) {
        Map<String,String> hashtable= new Hashtable<>();
        hashtable.put("科目1","驾驶知识考试");
        hashtable.put("科目2","道路模拟项目");
        hashtable.put("科目3","道路模拟驾驶");
        try {
//            放入空值
            hashtable.put(null,null);
        }catch (Exception e){
//            提示异常
            e.printStackTrace();
        }
        System.out.println(hashtable);
    }
}

 

HashTable与HashMap的区别

HashTable属于同步操作(线程安全),并且其中的key和value不允许存放null,否则会抛出异常NullPointerException

HashMap属于异步操作(非线程安全),其中的key或者value可以存放null

4.TreeMap 子类

TreeMap的子类属于是有序的集合类型,它可以根据key进行排序,所以再key一定要有实现Comparable的接口的才能进行排序

String类就实现了Comparable接口

案例代码:按照运动员号数输出所有运动员的比赛时间

package Example1817;

import java.util.Hashtable;
import java.util.Map;
import java.util.TreeMap;

public class javaDemo {
    public static void main(String[] args) {
        Map<String,String> map = new TreeMap<>();
        map.put("运动员2号","6.32秒");
        map.put("运动员1号","6.54秒");
        map.put("运动员4号","6.72秒");
        map.put("运动员3号","7.02秒");
        System.out.println(map);
    }
}


2.Map的输出(Map.Entry与iterator,foreach)

虽然Map主要用于数据的查找,但是有些时候也是需要其中数据的输出。但是在Map的方法中可以发现并不像Collection一样有iterator方法,所以目标放在方法转换方法entrySet(),先将数据转为Set集合类型再通过iterator迭代器进行输出,这就是Map的标准输出

首先介绍Map.Entry内部接口

由于Map中所有保存的对象都是二元偶对象,所以针对此对象的数据标准建立了一个Map.Entry内部接口,该接口可以接收二元偶对象并存在两个方法,getkey()与getvalue();分别获取一个对象的key与value

通过Map.Entry搭配Iterator实现Map的输出案例:

package Example1818;

import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class javaDemo {
    public static void main(String[] args) {
        Map<String, String> map = new Hashtable<>();
        map.put("王小的爱好", "篮球");
        map.put("王小爱吃的美食", "凉拌猪头肉");
        map.put("王小的性别", "男");
        map.put("王小的家产", "几乎没有");
//    map转为集合Set
        Set<Map.Entry<String, String>> entrySet = map.entrySet();
//    调用集合Set的iterator方法
        Iterator<Map.Entry<String, String>> entryIterator = entrySet.iterator();
        while (entryIterator.hasNext()) {
            Map.Entry<String,String> temp =entryIterator.next();
            System.out.println(temp.getKey()+"是"+temp.getValue());
        }
    }
}

 

问1:为什么迭代器的泛型是Iterator<Map.Entry<String,String>>而不是Iterator<String,String>

迭代器的泛型类型应为Iterator<Map.Entry<String, String>>而不是Iterator<String, String>,因为在遍历Map键值对时,每个键值对都表示一个Map.Entry对象。

在Java中,Map接口的键值对由Map.Entry表示,其在内部定义了两个相关的方法:getKey()getValue()。因此,当使用迭代器来遍历Map时,需要使用Map.Entry作为泛型参数,并且迭代器的类型应该是Iterator<Map.Entry<String, String>>

通过这种方式,迭代器可以迭代返回Map.Entry对象(包含键和值),然后可以使用getKey()getValue()方法分别获取键和值。


3.数据结构 - 栈(Stack)

栈作为一种数据结构其最主要的特点就是"先进后出"

举个最简单例子理解,在古代如果一个人有大量的钱财需要自己存放,那么他可能会挖一个坑,这个坑就理解为栈,首先他先放财物在坑底,然后放石头块,最后放沙子。那有一天他要用到财务的时候,就需要按挖沙子,挖石头块,得到财物的流程,这里可以发现最开始放的财物反而最后才能得到,这就是先进后出

Stack常用的方法:

修饰符返回值类型方法名描述
publicvoidpush()将元素推入栈顶。
publicEpop()移除并返回栈顶元素。
publicEpeek()返回栈顶元素但不移除。
publicintsearch()返回元素在栈中的位置,如果不存在则返回 -1。
publicbooleanempty()检查栈是否为空,为空则返回 true,否则返回 false

案例Stack的创建以及操作方法:

package Example1819;

import java.util.Stack;

public class javaDemo {
    public static void main(String[] args) {
        Stack<String> land = new Stack<>();
//        埋藏财物
        land.push("财物");
        land.push("石头");
        land.push("泥土");
        System.out.println("有小偷,但是小偷在埋藏地只看到"+land.peek());

        System.out.println("当需要用到财物时候");
//        开始挖财物
        while (!land.empty()){
            String temp;
            temp = land.pop();
            if (temp.equals("财物")){
                System.out.println("找到财物啦!!");
            }else System.out.println("挖出来了"+temp);
        }
    }
}


4.数据结构 - 队列(Queue,Deque)

队列作为一种数据结构其最主要的特点就是“先进先出”

就跟名字的队列一样,就像抢票一样,先到先得

由于在jdk1.6以后为了方便队列的操作将Queue定义为了Deque,此次的变更扩充了许多的方法,以下是Deque的常用方法

修饰符返回值类型方法名描述
booleanvoidaddFirst(E e)将指定元素插入到双端队列的开头位置,如果成功则返回 true,如果队列已满则抛出异常。
booleanvoidaddLast(E e)将指定元素插入到双端队列的末尾位置,如果成功则返回 true,如果队列已满则抛出异常。
booleanbooleanofferFirst(E e)将指定元素插入到双端队列的开头位置,如果成功则返回 true,如果队列已满则返回 false
booleanbooleanofferLast(E e)将指定元素插入到双端队列的末尾位置,如果成功则返回 true,如果队列已满则返回 false
EEremoveFirst()移除并返回双端队列的开头元素,如果队列为空则抛出异常。
EEremoveLast()移除并返回双端队列的末尾元素,如果队列为空则抛出异常。
EEpollFirst()移除并返回双端队列的开头元素,如果队列为空则返回 null
EEpollLast()移除并返回双端队列的末尾元素,如果队列为空则返回 null
EEpeekFirst()返回双端队列的开头元素但不移除,如果队列为空则返回 null
EEpeekLast()返回双端队列的末尾元素但不移除,如果队列为空则返回 null

 案例代码:

package Example1820;

import java.util.Deque;
import java.util.LinkedList;

public class javaDemo {
    public static void main(String[] args) {
//        通过链表接收对象
        Deque<String> deque = new LinkedList<>();
        System.out.println("欢迎参加男生女生向前冲");
//        从队尾进行插入,每一位到前一位的后面
        deque.addLast("一号");
        deque.addLast("二号");
        deque.addLast("三号");
        deque.addLast("四号");
        System.out.println("今天的参赛选手的号数第一位是"+deque.peekFirst()+"最后一位选手的号数是"+ deque.peekLast());
        System.out.println("比赛开始");
        while (!deque.isEmpty()){
            System.out.println("选手"+deque.pollFirst()+"进行比赛");
            System.out.println("比赛结束");
        }
        System.out.println("今天的活动到此结束");
    }
}


5.属性类Properties

属性类是专门用以处理字符串的一个类并且是HashTable的子类,但是注意只能对字符串进行操作,同时可以通过输入/输出流进行数据的保存

以下是属性类的常用方法:

getProperties(String key)返回指定键对应的属性值。
getProperties(String key, defaultValue)返回指定键对应的属性值,如果键不存在则返回默认值。
setProperties(Properties props)将指定的属性集合设置为当前属性集合。
store(OutputStream out, String comments)将当前属性集合保存到输出流中。
load(InputStream in)从输入流中加载属性集合。

 设置属性的案例:

package Example1821;

import java.util.Properties;

public class javaDemo {
    public static void main(String[] args) {
        Properties properties = new Properties();
//        创建属性
        properties.setProperty("属性的key","属性的value");
        properties.setProperty("黄小龙","土木工程");
        properties.setProperty("张小芳","计算机科学技术");
        properties.setProperty("王洪","道桥设计");
        properties.setProperty("黄键化","石油开采");
//        获取属性
        System.out.println("该同学选择了"+properties.getProperty("黄小龙"));
        System.out.println(properties.getProperty("王孟","没有找到"));
    }
}

2.通过输入输出流进行文件保存

package Example1822;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Properties;

public class javaDemo {
    public static void main(String[] args)throws Exception {
        File file = new File("E:"+File.separator+"jiawa"+File.separator+"information.properties");
        Properties properties = new Properties();
//        填入信息
        properties.setProperty("www.baidu.com","78");
        properties.setProperty("www.csdn.com","80");
        properties.setProperty("www.4399.com","90");
        properties.setProperty("ww.7k7k","68");
//        通过输出流将信息输出到对应文件中
        if (file.exists()){
            properties.store(new FileOutputStream(file),"website and it gets scores");
        }
//      通过输入流得到信息
        Properties inproperty = new Properties();
        inproperty.load(new FileInputStream(file));
        System.out.println(inproperty.get("www.4399.com"));
    }
}


5.Collections工具类

该工具类是专门提供的一个集合的工具类,该工具类实现Collection,Map,List,Set等集合接口的数据操作

下面是Collections工具类的常用方法:

方法描述
addAll(Collection<? super T> c, T... elements)将元素数组添加到集合 c
binarySearch(List<? extends T> list, T key)使用二分查找算法在有序列表 list 中查找元素 key 的索引
copy(List<? super T> dest, List<? extends T> src)将源列表 src 的元素复制到目标列表 dest
fill(List<? super T> list, T obj)使用指定的对象 obj 填充列表 list
max(Collection<? extends T> coll)返回集合 coll 的最大元素
min(Collection<? extends T> coll)返回集合 coll 的最小元素
reverse(List<?> list)反转列表 list 中的元素
shuffle(List<?> list)随机打乱列表 list 中的元素
sort(List<T> list)对列表 list 进行升序排序
swap(List<?> list, int i, int j)交换列表 list 中索引为 ij 的元素

案例:通过Collections类操作List集合

package Example1823;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class javaDemo {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
//        批量添加信息
        Collections.addAll(list,"我是第一","我是第二","我是我");
        System.out.println(list);
//        集合内容反转
        Collections.reverse(list);
        System.out.println(list);
//        通过二分法查找
        System.out.println(Collections.binarySearch(list,"我是第二"));
    }
}

 

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

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

相关文章

485modbus转profinet网关连三菱变频器modbus通讯触摸屏监控

本案例介绍了如何通过485modbus转profinet网关连接威纶通与三菱变频器进行modbus通讯。485modbus转profinet网关提供了可靠的连接方式&#xff0c;使用户能够轻松地将不同类型的设备连接到同一网络中。通过使用这种网关&#xff0c;用户可以有效地管理和监控设备&#xff0c;从…

人工智能与物理学(软体机器人能量角度)的结合思考

前言 好久没有更新我的CSDN博客了&#xff0c;细细数下来已经有了16个月。在本科时期我主要研究嵌入式&#xff0c;研究生阶段对人工智能感兴趣&#xff0c;看了一些这方面的论文和视频&#xff0c;因此用博客记录了一下&#xff0c;后来因为要搞自己的研究方向&#xff0c;就…

使用Golang实现一套流程可配置,适用于广告、推荐系统的业务性框架——组合应用

在《使用Golang实现一套流程可配置&#xff0c;适用于广告、推荐系统的业务性框架——简单应用》中&#xff0c;我们看到了各种组合Handler的组件&#xff0c;如HandlerGroup和Layer。这些组件下面的子模块又是不同组件&#xff0c;比如LayerCenter的子组件是Layer。如果此时我…

Windows用户如何将cpolar内网穿透配置成后台服务,并开机自启动?

Windows用户如何将cpolar内网穿透配置成后台服务&#xff0c;并开机自启动&#xff1f; 文章目录 Windows用户如何将cpolar内网穿透配置成后台服务&#xff0c;并开机自启动&#xff1f;前置准备&#xff1a;VS Code下载后&#xff0c;默认安装即可VS CODE切换成中文语言 1. 将…

FSC 认证产品门户网站正式上线

【FSC 认证产品门户网站正式上线】 FSC 国际正式推出自助式服务平台——FSC认证产品门户网站。FSC 证书持有者均可通过该平台自行添加企业或组织的 FSC 认证产品&#xff0c;寻求更多商机&#xff1b;也可通过该门户申请参与亚马逊气候友好项目&#xff08;Amazon Climate-Frie…

低代码平台,让应用开发更简单!

一、前言 随着社会数字化进程的加速&#xff0c;旺盛的企业个性化需求和有限的专业开发人员供给之间的矛盾日益显著&#xff0c;业界亟需更快门槛、更高效率的开发方法和工具&#xff0c;低代码技术便应运而生。 低代码开发&#xff0c;是通过编写少量代码甚至无需代码&#xf…

作为一个老程序员,想对新人说什么?

前言 最近知乎上&#xff0c;有一位大佬邀请我回答下面这个问题&#xff0c;看到这个问题我百感交集&#xff0c;感触颇多。 在我是新人时&#xff0c;如果有前辈能够指导方向一下&#xff0c;分享一些踩坑经历&#xff0c;或许会让我少走很多弯路&#xff0c;节省更多的学习的…

Vue3文本省略(Ellipsis)

APIs 参数说明类型默认值必传maxWidth文本最大宽度number | string‘100%’falseline最大行数numberundefinedfalsetrigger展开的触发方式‘click’undefinedfalsetooltip是否启用文本提示框booleantruefalsetooltipMaxWidth提示框内容最大宽度&#xff0c;单位px&#xff0c;…

数据结构--单链表OJ题

上文回顾---单链表 这章将来做一些链表的相关题目。 目录 1.移除链表元素 2.反转链表 3.链表的中间结点 4.链表中的倒数第k个结点 5.合并两个有序链表 6.链表分割 7.链表的回文结构 8.相交链表 9.环形链表 ​编辑 10.环形链表II ​编辑 ​编辑 1.移除链表元素 思…

Camera之元数据(meta data)和原始数据(raw data)区别(三十一)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

JavaScript原生将图片转成base64

1.写个html文件 <!-- 产品照片 --> <div class"mb-3"> <label for"cover" class"form-label">产品图片</label><inputtype"file"class"form-control"id"coverfile"/> </div>…

这些你不容错过的音频转换器免费推荐给你

音频格式转换技术是一种能够将不同格式的音频文件互相转换的技术。你可能会想&#xff0c;为什么要进行音频格式转换呢&#xff1f;原因可是多种多样的&#xff01;有时候你可能收到了一个音频文件&#xff0c;但却无法在你的设备上播放&#xff0c;这时候就需要将其转换为兼容…

shiro快速入门

文章目录 权限管理什么是权限管理&#xff1f;什么是身份认证&#xff1f;什么是授权&#xff1f; 什么是shiro&#xff1f;shiro的核心架构shiro中的三个核心组件 shiro中的认证shiro中的授权shiro使用默认Ehcache实现缓存shiro使用redis作为缓存实现 权限管理 什么是权限管理…

从0到1学会手写操作系统,我只用了2个小时!!!

继《自己动手做一台计算机》 《嵌入式入门-模电基础》两大教程之后 黑马嵌入式教程再出力作 重磅发布第三弹 《自己动手写嵌入式操作系统》 问&#xff1a;嵌入式开发不是只学单片机就行&#xff1f;为什么要学操作系统&#xff1f; 答&#xff1a;年轻人&#xff0c;别把路…

LeetCode每日一题Day4——26. 删除有序数组中的重复项

✨博主&#xff1a;命运之光 &#x1f984;专栏&#xff1a;算法修炼之练气篇&#xff08;C\C版&#xff09; &#x1f353;专栏&#xff1a;算法修炼之筑基篇&#xff08;C\C版&#xff09; &#x1f433;专栏&#xff1a;算法修炼之练气篇&#xff08;Python版&#xff09; …

Python 批量处理JSON文件,替换某个值

Python 批量处理JSON文件&#xff0c;替换某个值 直接上代码&#xff0c;替换key TranCode的值 New 为 Update。输出 cancel忽略 import json import os import iopath D:\\Asics\\850\\202307 # old path2 D:\\test2 # new dirs os.listdir(path) num_flag 0 for file…

采购分析:节省采购成本的 6 种方法

为了成功启动采购计划、稳定现金流并节省开支&#xff0c;企业需要了解从采购到付款的 P2P 周期的方方面面。 有远见的采购领导者将采购分析作为综合战略的一部分。因其有助于以简化和自动化的方式解决问题&#xff0c;从而更好地管理项目并节省大量成本。 什么是采购分析&am…

docker删除容器(步骤详解)

要在Docker中删除容器&#xff0c;需要使用命令docker rm。 下面是详细步骤&#xff1a; 1. 首先&#xff0c;使用docker ps命令查看当前正在运行的容器。这个命令会列出所有正在运行的容器的ID、名称、状态等信息。 如果没有正在运行的容器可以通过docker ps -a 查看当前所…

Java中的内存划分,一个数组的内存图

Java中的内存划分 Java的内存需要分成5个部分&#xff1a; 栈&#xff08;Stack&#xff09; 存放的都是 方法 中的 局部变量 。方法的运行一定要在栈当中运行。 局部变量&#xff1a;方法的参数&#xff0c;或者是方法{}内部的变量 作用域&#xff1a;一旦超出作用域&#xff…

Stable Diffusion教程(7) - PS安装AI绘画插件教程

配套教程视频&#xff1a;https://v.douyin.com/Uyux9F6/ 1. 前置条件 安装了stable diffusion 还没安装的从知识库安装 阿超的AI绘画知识库 语雀 安装了ps2023 还没安装的从网盘下载Win版 PS 2023【必须win10、11】.rar官方版下载丨最新版下载丨绿色版下载丨APP下载-12…