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

news/2024/12/3 0:48:28/

文章目录

  • 双例模式
    • 一 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;}@Overridepublic int hashCode() {int result=userName !=null ? userName.hashCode():0;result=31*result+userAge;return result;}@Overridepublic 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;}@Overridepublic String toString() {return "Users{" +"userName='" + userName + '\'' +", userAge=" + userAge +'}';}@Overridepublic 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;}@Overridepublic 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);}@Overridepublic int hashCode() {return Objects.hash(name, age);}@Overridepublic String toString() {return "student{" +"name='" + name + '\'' +", age=" + age +'}';}
}
class ComparatorTest2 implements Comparator<student2> {//定义比较规则@Overridepublic 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.ppmy.cn/news/6697.html

相关文章

Kotlin之注解

注解是Java代码调用kotlin代码,kotlin对Java兼容提供的一种解决方案 1、 @JvmName 注解的作用就是更改kotlin源文件名称、方法名称 源文件名称修改 假设有一个kotlin文件 KotlinAnnotationAnnotation.kt,文件中有一个方法 getKotlinFunShow()fun getKotlinFunShow() {print…

Dubbo 面试题及答案【四】

1. Dubbo 中 zookeeper 做注册中心&#xff0c;如果注册中心集群都挂掉&#xff0c;发布者和订阅者之间还能通信么&#xff1f; 可以通信的&#xff0c;启动 dubbo 时&#xff0c;消费者会从 zk 拉取注册的生产者的地址接口等数据&#xff0c;缓存在本地。每次调用时&#xff…

<Linux线程同步>——《Linux》

目录 1. Linux线程同步 1.1条件变量 1.2同步概念与竞态条件 1.3条件变量函数 1.4 为什么pthread_ cond_ wait 需要互斥量? 1.5 条件变量使用规范 后记&#xff1a;●由于作者水平有限&#xff0c;文章难免存在谬误之处&#xff0c;敬请读者斧正&#xff0c;俚语成篇&am…

linux共享内存的使用

共享内存可以由多个程序同时访问的内存&#xff0c;能够避免进程间通信过程中的冗余数据拷贝&#xff0c;是IPC中最快的一种,特别适合用来作大块数据的传输。共享内存可以映射到不同的进程空间&#xff0c;这些进程间的数据传递就不再涉及内核。这个过程其实是把同一块物理内存…

MARKETS AND MARKET LOGIC——The Market‘s Principles (1)

序 没有人确切地知道场内期货交易者比场外交易者有多大的优势。但我们确实知道&#xff0c;无论这种优势是什么&#xff0c;现在都大大减少了&#xff0c;这要归功于J.Peter Steidlmayer、Kevin Koy和CBOT这对你来说是个好消息。这对我们来说是个好消息。作为一家折扣经纪人&am…

C++、python、VS code插件安装与SSH使用

下载按照VS coda 官网&#xff1a;https://code.visualstudio.com 1.安装相关插件 1.中文插件&#xff08;可选&#xff09; MS-CEINTL.vscode-language-pack-zh-hans 2.C插件&#xff08;必选&#xff09; ms-vscode.cpptools 3.ssh 远程&#xff08;必选&#xff09; ms-vs…

Python实现猎人猎物优化算法(HPO)优化支持向量机分类模型(SVC算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 猎人猎物优化搜索算法(Hunter–prey optimizer, HPO)是由Naruei& Keynia于2022年提出的一种最新的优…

十七、Docker Compose容器编排第二篇

在上一篇中我们讲解了容器编排是什么、能干什么、怎么安装、使用步骤&#xff0c;如果没有看的大家可以先看下&#xff1a;https://blog.csdn.net/u011837804/article/details/128335166&#xff0c;然后继续看这一篇&#xff0c;好了&#xff0c;我们继续。 1、Docker Compons…