Java集合框架【三Map接口、Iterator送代器、Collections工具类】

news2024/11/24 4:37:59

文章目录

  • 双例模式
    • 一 Map接口简介
      • 1.1 常用方法
      • 1.2 演示
    • 二 HashMap的存储结构简介
    • 三 TreeMap容器类
      • 3.1 TreeMap的比较规则
      • 3.2 元素自身实现比较规则
      • 3.3 通过比较器实现比较规则
    • 四 Iterator迭代器
      • 4.1 Iterator送代器接口介绍
      • 4.2 栗子
    • 五 Collections工具类
      • 5.1 Collections工具类简介
      • 5.2 栗子

双例模式

一 Map接口简介

  • Map接口定义了双例集合的存储特征。Map中的容器称为双列集合。
  • 双例集合的存储特征是以key与value结构为单位进行存储。
  • Map中常用的容器为HashMap,TreeMap等。

1.1 常用方法

方法说明
V put(K key,Vvalue)把key与value添加到Map集合中
void putAll(Map m)从指定Map中将所有映射关系复制到此Map中
V remove(Object key)删除key对应的value
V get(Object key)根据指定的key,获取对应的value
boolean containsKey(Object key)判断容器中是否包含指定的key
boolean containsValue(Object value)判断容器中是否包含指定的value
Set keySet()获取Map集合中所有的key,存储到Set集合中
Set<Map.entry<K,V>> entrySet()返回一个Set基于Map.Entry类型包含Map中所有映射。
void clear()删除Map中所有的映射

1.2 演示

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

/**
 * @author 缘友一世
 * date 2022/12/25-18:50
 */
public class HashMapTest {
    public static void main(String[] args) {
        HashMap<String, String> map = new HashMap<>();
        System.out.println(map.put("a", "A"));//添加成功返回空
        System.out.println(map.put("b", "B"));//添加成功返回空
        System.out.println(map.put("a","B"));//将之前的值覆盖,并返回之前的值

        System.out.println("key: a value:"+map.get("a"));//获取成功返回值
        System.out.println("key: a value:"+map.get("A"));//获取失败返回null

        //方法一:获取HashMap容器中所有的元素,可以使用keySet方法和get方法一起完成
        Set<String> keys = map.keySet();
        for(String key:keys){
            System.out.println(key+":"+map.get(key));
        }
        //获取所有元素方法二:
        Set<Map.Entry<String, String>> entrySet = map.entrySet();
        for(Map.Entry<String,String> entry:entrySet) {
            String key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key+":"+value);
        }
        System.out.println("=======");
        HashMap<String, String> map2 = new HashMap<>();
        map2.put("f","F");
        map2.put("a","aa");
        map2.putAll(map);//map2与map相同的键,map2的值会被覆盖
        Set<String> keys2 = map2.keySet();
        for(String key:keys2) {
            System.out.println(key+":"+map2.get(key));
        }

        String a = map.remove("a");
        Set<String> keys3 = map.keySet();
        for(String key:keys3) {
            System.out.println(key+map.get(key));
        }

        System.out.println(map.containsKey("b"));
        System.out.println(map.containsValue("B"));

    }
}

在这里插入图片描述

二 HashMap的存储结构简介

  • HashMap底层实现采用哈希表。
  • 哈希表的本质是"数组"+“链表”
    • 数组特点:占用空间连续。寻址容易,查询速度快。
      • 缺点:增加和删除效率非常低。
    • 链表:占用空间不连续。增加和删除效率非常高。
      • 缺点: 寻址困难,查询速度慢。
        在这里插入图片描述

三 TreeMap容器类

  • TreeMap是可以对键进行排序的一种容器类。
  • TreeMap的底层是基于红黑树实现的。

3.1 TreeMap的比较规则

  • 在使用TreeMap时需要给定排序规则
    • 元素自身实现比较规则
    • 通过比较器实现比较规则

3.2 元素自身实现比较规则

//元素自身实现比较规则
class Users3 implements Comparable<Users3> {

    private String userName;
    private int userAge;

    public Users3() {
    }

    public Users3(String userName, int userAge) {
        this.userName = userName;
        this.userAge = userAge;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public int getUserAge() {
        return userAge;
    }

    public void setUserAge(int userAge) {
        this.userAge = userAge;
    }

    @Override
    public int hashCode() {
        int result=userName !=null ? userName.hashCode():0;
        result=31*result+userAge;
        return result;
    }

    @Override
    public boolean equals(Object o) {
        if(this==o) return true;
        if(o==null || getClass()!=o.getClass()) return false;
        Users3 users = (Users3) o;
        if(userAge!=users.userAge) return false;
        return userName!=null ? userName.equals(users.userName):false;
    }

    @Override
    public String toString() {
        return "Users{" +
                "userName='" + userName + '\'' +
                ", userAge=" + userAge +
                '}';
    }

    @Override
    public int compareTo(Users3 o) {
        if(this.userAge>o.getUserAge()) {
            return 1;
        }
        if(this.userAge==o.getUserAge()) {
            return this.userName.compareTo(o.getUserName());
        }
        return -1;
    }
}
/**
 * @author 缘友一世
 * date 2022/12/25-19:25
 */
public class TreeMapTest {
    public static void main(String[] args) {
        TreeMap<Users3,String> map = new TreeMap<>();
        Users3 u1 = new Users3("o", 18);
        Users3 u2 = new Users3("a", 22);
        map.put(u1,"o");
        map.put(u2,"a");
        Set<Users3> keys = map.keySet();
        for(Users3 key:keys) {
            System.out.println(key+":"+map.get(key));
        }
    }
}

在这里插入图片描述

3.3 通过比较器实现比较规则

//通过比较器实现比较规则
class student2 {
    private  String name;
    private int age;

    public student2() {
    }

    public student2(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        student2 student = (student2) o;
        return age == student.age && Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    @Override
    public String toString() {
        return "student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
class ComparatorTest2 implements Comparator<student2> {
    //定义比较规则

    @Override
    public int compare(student2 o1, student2 o2) {
        if(o1.getAge()>o2.getAge()) {//升序
            return 1;
        }else if(o1.getAge()==o2.getAge()) {
            return o1.getName().compareTo(o2.getName());
        }
        return -1;
    }
}
/**
 * @author 缘友一世
 * date 2022/12/25-19:25
 */
public class TreeMapTest {
    public static void main(String[] args) {
        //通过比较器比较规则
        TreeMap<student2,String> treeMap=new TreeMap<>(new ComparatorTest2());
        student2 s1 = new student2("o", 18);
        student2 s2 = new student2("a", 19);
        student2 s3 = new student2("s", 19);
        treeMap.put(s1,"o");
        treeMap.put(s2,"a");
        treeMap.put(s3,"s");
        Set<student2> keys1 = treeMap.keySet();
        for(student2 key:keys1) {
            System.out.println(key+""+treeMap.get(key));
        }
    }
}

在这里插入图片描述

四 Iterator迭代器

4.1 Iterator送代器接口介绍

  • Collection接口继承了Iterable接口,在该接口中包含一个名为iterator的抽象方法,所有实现了Collection接口的容器类对该方法做了具体实现。
  • iterator方法会返回一个lterator接口类型的选代器对象,在该对象中包含了三个方法用于实现对单例容器的选代处理。
  • lterator对象的工作原理:
    在这里插入图片描述
  • lterator接口方法:
方法说明
boolean hasNext();判断游标当前位置是否有元素,如果有返回true,否则返回false;
Object next()获取当前游标所在位置的元素,并将游标移动到下一个位置
void remove()删除游标当前位置的元素,在执行完next后该操作只能执行一次;

4.2 栗子

import java.util.ArrayList;
import java.util.Iterator;

/**
 * @author 缘友一世
 * date 2022/12/25-19:47
 */
public class IteratorListTest {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        Iterator<String> iterator = list.iterator();
        for(Iterator<String> it=list.iterator();it.hasNext();) {
            System.out.print(it.next()+" ");
        }

        System.out.println();
        while(iterator.hasNext()) {
            System.out.print(iterator.next()+" ");
        }

        System.out.println();
        Iterator<String> iterator2 = list.iterator();
        while(iterator2.hasNext()) {
            if("c".equals(iterator2.next())){
                iterator2.remove();
            };
        }
        for(Iterator<String> it=list.iterator();it.hasNext();) {
            System.out.print(it.next()+" ");
        }

    }
}

在这里插入图片描述

五 Collections工具类

5.1 Collections工具类简介

  • Collections是一个工具类,它提供了对Set、List、Map进行排序、填充、查找元素的辅助方法。该类中所有的方法都为静态方法。
  • 常用方法:
方法说明
void sort(List)对List容器内的元素排序,排序的规则是按照升序进行排序。
void shuffle(List)/对List容器内的元素进行随机排列。
void reverse(List对List容器内的元素进行逆续排列。
void fill(List,Object)用一个特定的对象重写整个List容器。
int binarySearch(List,Object)对于顺序的List容器,采用折半查找的方法查找特定对象

5.2 栗子

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

/**
 * @author 缘友一世
 * date 2022/12/25-20:01
 */
public class CollectionsTest {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("c");
        list.add("d");
        list.add("b");
        list.add("a");
        Collections.sort(list);
        for(String str:list) {
            System.out.print(str+" ");
        }

        System.out.println();
        Collections.reverse(list);
        for(String str:list) {
            System.out.print(str+" ");
        }

        System.out.println();
        Collections.shuffle(list);
        for(String str:list) {
            System.out.print(str+" ");
        }
    }
}

在这里插入图片描述

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

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

相关文章

关于node代码如何丝滑执行多条命令行这件事

最近写脚本比较多&#xff0c;然后经常写命令行相关的代码&#xff0c;记录一下以备万一。 首先&#xff0c;node使用命令行依赖于child_process&#xff0c;这个是node原生支持的,我用的最多就是exec。 按顺序执行多个命令 因为写脚本需要执行多个语句&#xff0c;所以写了…

[Python图像识别] 五十一.水书图像识别之利用数据增强扩充图像数据集

该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~ 上一篇文章…

五、传输层(三)TCP

目录 3.0 TCP特点补充 3.1 TCP报文段首部格式 3.2 TCP连接管理 3.2.1 三报文握手 3.2.2 四报文挥手 3.3 TCP的流量控制和可靠传输 3.4 TCP拥塞控制 3.4.1 接收窗口、拥塞窗口、发送窗口关系 3.4.2 慢开始和拥塞避免 3.4.3 快重传和快恢复 3.0 TCP特点补…

Java项目:springboot超市订单管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 该超市订单管理毕业设计基于jdk8版本开发&#xff0c;在部署时需要使用jdk8以上的版本。使用了目前流行的框架组合springbootmybatis的框架技术…

DispatcherServlet初始化过程源码分析 | SpringMVC源码分析

一、继承或实现关系 public class DispatcherServlet extends FrameworkServlet public abstract class FrameworkServlet extends HttpServletBean implements ApplicationContextAware public abstract class HttpServletBean extends HttpServlet implements Environment…

聊聊Go语言并发之道

写在前面 2007年&#xff0c;Go语言诞生于Google公司&#xff0c;2009年开源&#xff0c;2012年推出1.0版本&#xff0c;曾两次获得TIOBE年度语言。2012年起&#xff0c;全球大量的开源项目开始使用Go语言开发&#xff0c;目前Go语言已成为云计算领域事实上的标准语言&#xff…

深度学习常见概念字典(感知机、全连接层、激活函数、损失函数、反向传播、过拟合等)

这一章的所有内容均是为了进入深度学习具体的某某网络而准备的&#xff0c;简单但是非常有必要。 1. 神经网络&#xff08;neural networks&#xff09;的基本组成 1.1 神经元&#xff08;neuron&#xff09; 神经元&#xff08;neuron&#xff09; 是神经网络&#xff08;n…

slf4j常用配置文件读取

slf4j常用配置文件读取 log4j2读取配置文件 日志现在一般都是使用slf4j作为接口、底层实现一般是用log4j2或者logback。 我们先看下log4j2是如何读取配置文件的。 implementation org.apache.logging.log4j:log4j-slf4j-impl:2.19.0如果使用gradle的话。上面的代码就会导入sl…

VS coda C++、python运行与Dbug配置

首先新建终端 一次性使用C方法 检查C编译器是否存在 which g可见位置存在于&#xff1a;/usr/bin/g 一次性命令格式&#xff1a; 使用json配置文件 运行C方法&#xff08;推荐&#xff09;&#xff1a; 根据你查找的g的位置来决定 使用配置好的tasks.json&#xff08;C的…

QT入门-UI-信号槽

目录 一、QWidget类&#xff08;重点&#xff09; 二、子组件&#xff08;掌握&#xff09; 三、样式表&#xff08;熟悉&#xff09; 一、什么是信号槽&#xff1f; 二、信号槽的连接方式 2.1 自带信号→自带槽 2.2 自带信号→自定义槽 2.3 自定义信号 三、传参方式 3.1 成员变…

C#语言实例源码系列-伪装文件

专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册 &#x1f449;关于作者 众所周知&#xff0c;人生是一个漫长的流程&#xff0c;不断克服困难&#xff0c;不断反思前进的过程。在这个过程中…

Redis分布式锁存在的问题

假设有这样一个场景&#xff0c;在一个购票软件上买一张票&#xff0c;但是此时剩余票数只有一张或几张&#xff0c;这个时候有几十个人都在同时使用这个软件购票。在不考虑任何影响下&#xff0c;正常的逻辑是首先判断当前是否还有剩余的票&#xff0c;如果有&#xff0c;那么…

Spring5.3.0源码下载

目录源码下载环境配置import into idea修改配置gradle-wapper.propertiesbuild.gradleSetting Gradlerefresh Gradle写一个小dome源码研究心得源码下载 Spring5.3.0 Download Address 我们只需要下载zip就行了&#xff0c; 如果忘记了这个地址&#xff0c;可以在Spring Offici…

网络技术——网络运维工程师必会的网络知识(3)(详细讲解)

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.网络层协议与应用 1.网络层的功能 2.IP数据包格式 3.广播与…

100天精通Python(数据分析篇)——第70天:Pandas常用排序、排名方法(sort_index、sort_values、rank)

文章目录每篇前言一、按索引排序&#xff1a;sort_index()1. Series类型排序1&#xff09;升序2&#xff09;降序2. DataFrame类型排序1&#xff09;按行索引排序2&#xff09;按列索引排序二、按值排序&#xff1a;sort_values()1. Series类型排序1&#xff09;升序2&#xff…

冻结集合:不可能增删frozenset()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 冻结集合&#xff1a;不可能增删 frozenset() 选择题 对于以下python代码表述错误的一项是? a{1,2} print("【显示】a",a) a.add(3) print("【执行】a.add(3)【显示】a"…

【现代机器人学】学习笔记七:开链动力学(前向动力学Forward dynamics 与逆动力学Inverse dynamics)

这节的内容主要讲述机器人动力学的内容。相对于本书其他部分运动学内容相比&#xff0c;把动力学一下子合成了一章。看完以后有三个感受&#xff1a; 1.本章难度相对其他章节较大&#xff0c;因此需要反复去看&#xff0c;以求对重要内容的眼熟&#xff0c;不求全部记住&#…

Java window多环境配置

目录JDK版本下载配置内容描述创建JAVA_HOME在Path配置版本切换效果JDK版本下载 Java8 Download address 这个是Java8 的下载地址&#xff0c;下载是要登录的&#xff0c;自己花费一点时间去注册。如果想要下载其它版本的JDK&#xff0c;请看下面的图&#xff0c;然后你就可以看…

QT数据库-网络编程-打包

目录 一、讲解之前 二、数据库基本操作 三、模糊查询 二、编程之前 三、通信结构 一、设置应用图标&#xff08;熟悉&#xff09; 二、Debug和Release模式&#xff08;掌握&#xff09; 三、动态链接库&#xff08;掌握&#xff09; 四、打包&#xff08;熟悉&#xff09; 一、…

FastDDS(10)Transport Layer传输层

传输层在DDS实体之间提供通信服务,负责通过物理传输实际发送和接收消息。DDS层将此服务用于用户数据和发现流量通信。然而,DDS层本身是独立于传输的,它定义了一个传输API,可以运行在实现该API的任何传输插件上。这样,它就不局限于特定的传输,应用程序可以选择最适合其需求…