Java集合框架-Collection和Map

文章目录

  • Collection-单列集合特点
    • List
      • ArrayList
      • LinkedList
      • Vecter
    • Set
      • HashSet
      • TreeSet
  • Map-键值对集合特点
    • Map常用API
      • put添加细节
      • remove
    • Map的三种遍历方式
      • 1.通过键找值
      • 2.通过"键值对"
      • 3.Lambda表达式
      • foreach源码
    • HashMap
      • 需求

为什么要使用泛型

泛型的优点1.集合中存储的元素类型统一了2.从集合中取出来的元素类型是泛型指定的类型,不需要进行大量的“向下转型”泛型的确定1.导致集合中存储的元素缺乏多样性。

Collection-单列集合特点

在这里插入图片描述

List

ArrayList

ArrayList特点1.ArrayList层地采用了数组的数据结构;2.ArrayList是非线程安全的;3.ArrayList初始化容量是10(底层先创建了一个长度为0的数组,当添加第一个元素的时候,初始化容量10);4.ArrayList底层是Object类型的数组Object[]5.扩容1.56.建议给定一个预估计的初始化容量,减少数组的扩容次数,这是ArrayList集合比较重要的优化策略数组的优点1.数组的检索效率比较高。为什么数组的检索效率高?数组中每个元素占用空间大小相同,内存地址是连续的,知道首元素内存地址,然后知道下标,通过数学表达式计算出元素的内存地址,所以检索的效率高。2.数组向数组末尾添加元素的效率还是很高的,也就是数组的添加效率很高。数组的缺点1.数组随机增删元素效率比较低

LinkedList

链表数据结构的特点

链表的优点:1.由于链表上的元素在空间存储上内存地址不连续,所以随机增删元素的时候不会有量元素的位移,因此随机增删的效率高。在以后得开发中,如果遇到随机增删集合中元素的业务比较多时,建议使用LinkedList链表的缺点1.不能通过数学表达式计算被查找元素的内存地址,每一次查找都是从头节点开始遍历,直到找到为止,所以LinkedList集合检索/查找的效率较低。
LinkedList特点1.LinkedList底层采用了双向链表数据结构

Vecter

Vecter特点1.Vector底层也采用了数组的数据结构是线程安全的。2.Vector底层方法都使用了synchronized关键字修饰虽然线程安全但效率不高,一般使用较少了。

Set

HashSet

HashSet特点:1.HashSet创建时实际上是底层new了一个HashMap集合,也就意味着HashSet是将数据存储到了HashMap集合中了,HashMap是一个哈希表数据结构;

在这里插入图片描述

TreeSet

TreeSet的父级接口是SortSet,SortSet继承了Set接口,接口是抽象的,无法实例化。

TreeSet特点1.TreeSet也称可排序集合2.无顺不可重复,但存储的元素可以自动按照大小顺序或字幕A~Z排序3.无序:指得是元素存进去的顺序和取出来的顺序不一样,并且没有下标。4.TreeSet创建的时候,底层new了一个TreeMapTreeMap底层使用了二叉树数据结构

在这里插入图片描述
在这里插入图片描述

Map-键值对集合特点

 Map-键值对集合特点:1.Map是以key()value()的方式存储数据:键值对;2.key()不能重复,value()可以重复;3.key()value()都是引用数据类型,存储对象的内存地址;4.key()value()一一对应,每一个键只能找到自己对应的值,key起到主导的地位,value是key的一个附属品。5.key()value()是一个整体,称为"键值对"或者"键值对对象",在Java中叫做"Entry对象"

Map常用API

Map接口中常用方法:*    V put(K key,V value)Map集合中添加键值对*    V get(Object key)                       通过Key获取value*    void clear()                            清空Map集合*    boolean containsKey(Object key)         判断Map中是否包含某个Key*    boolean containsValue(Object value)     判断Map中是否包含某个value*    boolean isEmpty()                       判断Map集合中元素个数是否为0*    Set<K> keySet()                         获取Map集合中所有的key(所有的键是一个set集合)*    V remove(Object key)                    通过key删除键值对*    int size()                              获取Map集合中键值对的个数*    Collection<V> values()                  获取Map集合中所有的value,返回一个Collection

代码中选中Map关键字Ctrl+B去到Map的源码中
在这里插入图片描述
在这里插入图片描述

put添加细节

1.put对象是,Map有返回值

put:添加/覆盖在添加数据的时候,如果键不存在,那么直接把键值对对象提提添加到map集合当中,方法返回null在添加数据的时候,如果键是存在的,那么会把原有的键值对对象覆盖,会把被覆盖的值进行返回。
public class MapApi {public static void main(String[] args) {Map<String,String> m = new HashMap<>();String value0 = m.put("郭靖","黄蓉");System.out.println(value0);m.put("韦小宝","沐剑屏");m.put("杨过","小龙女");m.put("尹志平","小龙女");//向相同的键里再次添加元素String value = m.put("韦小宝","双儿");System.out.println(value);System.out.println(m);}
}

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

remove

remove时也有返回值,返回的是被删除的键值对对象的值。

在这里插入图片描述

public class MapTest01 {public static void main(String[] args) {Map<Integer,String> map = new HashMap<>();//1.向Map中添加key-valuemap.put(101,"zhangsan");map.put(202,"lisi");map.put(303,"wangwu");map.put(404,"zhaoliu");System.out.println(map);//2.获取添加到Map中的key-value的个数System.out.println("2.Map中所有键值对的个数:"+map.size());//3.通过key取valueString value = map.get(303);System.out.println("3.通过key取到的value为:"+value);//4.获取所有的valueCollection<String> values = map.values();System.out.println("4.values()获取Map中的所有value:"+values);//foreach valuesfor(String str : values){System.out.println("5.遍历取出:"+str);}//6.获取所有的keySet<Integer> keys = map.keySet();System.out.println("6.keySet()返回Map中所有的key:"+keys);//7.判断是否包含某个key和valueSystem.out.println("7.判断是否包含202的key的结果为:"+map.containsKey(202));System.out.println("8.判断是否包含leilei的value的结果为:"+map.containsValue("leilei"));//9.通过key删除key-valuemap.remove(404);System.out.println("9.调用remove()方法后的键值对的数量:"+map.size());//10.清空Map集合map.clear();System.out.println("10.clear()后键值对的数量为:"+map.size());}
}
{404=zhaoliu, 101=zhangsan, 202=lisi, 303=wangwu}
2.Map中所有键值对的个数:4
3.通过key取到的value为:wangwu
4.values()获取Map中的所有value:[zhaoliu, zhangsan, lisi, wangwu]
5.遍历取出:zhaoliu
5.遍历取出:zhangsan
5.遍历取出:lisi
5.遍历取出:wangwu
6.keySet()返回Map中所有的key:[404, 101, 202, 303]
7.判断是否包含202的key的结果为:true
8.判断是否包含leilei的value的结果为:false
9.调用remove()方法后的键值对的数量:3
10.clear()后键值对的数量为:0

Map的三种遍历方式

1.通过键找值

 public static void main(String[] args) {Map<String,String> m = new HashMap<>();m.put("郭靖","黄蓉");m.put("韦小宝","沐剑屏");m.put("杨过","小龙女");System.out.println(m);Set<String> keys = m.keySet();for(String str : keys){String key = str;String value = m.get(key);System.out.println(key + "=" + value);}}

在这里插入图片描述

2.通过"键值对"

public static void main(String[] args) {Map<String,String> m = new HashMap<>();m.put("郭靖","黄蓉");m.put("韦小宝","沐剑屏");m.put("杨过","小龙女");System.out.println(m);Set<Map.Entry<String, String>> entries = m.entrySet();for (Map.Entry e  : entries){System.out.println(e.getKey()+"="+e.getValue());}}

在这里插入图片描述
Ctrl+Alt+V自动生成方法的返回值类型,或者在方法名后加.var也可以
在这里插入图片描述
在这里插入图片描述

3.Lambda表达式

public static void main(String[] args) {Map<String,String> m = new HashMap<>();m.put("鲁迅","我没说过这句话");m.put("诸葛亮","悠悠苍天,何薄于我");m.put("曹操","我笑诸葛无谋,周瑜少智");System.out.println(m);m.forEach(new BiConsumer<String, String>() {@Overridepublic void accept(String s, String s2) {System.out.println(s +"="+s2);}});//改写为lambdam.forEach((s, s2) -> System.out.println("我是lambda:"+s +"="+s2));}

在这里插入图片描述

foreach源码

foreach的缺点foreach底层也是使用的增强for循环,它没有下标,不能通过下标查询元素

在这里插入图片描述

HashMap

HashMap底层原理1.HashMap底层是哈希表结构2.依赖hashCode方法和equals方法保证键的唯一3.如果键存储的是自定义对象,需要重写hashCode和equals方法如果值存储字定义对象,不需要重写hashCode和equals方法

需求

创建一个HashMap集合,1.键是学生对象(Student),值是籍贯(String).2.存储三个键值对元素,并遍历3.要求:同姓名同年龄认为是同一个学生。
public class Student {private int age;private String name;@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;return age == student.age &&Objects.equals(name, student.name);}@Overridepublic int hashCode() {return Objects.hash(age, name);}@Overridepublic String toString() {return "Student{" +"age=" + age +", name='" + name + '\'' +'}';}getter setter省略......
}
public class HashMapTest {public static void main(String[] args) {HashMap<Student,String> map = new HashMap<>();//1.实例化学生对象Student student0 = new Student(23,"张三");Student student1 = new Student(24,"李四");Student student2 = new Student(25,"王五");Student student3 = new Student(25,"王五");map.put(student0,"湖北");map.put(student1,"广东");map.put(student2,"河南");map.put(student3,"福建");//遍历map对象Set<Student> students = map.keySet();for(Student stu : students){String value = map.get(stu);System.out.println(stu +"=>"+value);}}
}

在这里插入图片描述

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

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

相关文章

#QT(智能家居界面-布局)

1.IDE&#xff1a;QTCreator 2.实验&#xff1a; 水平布局&#xff0c;垂直布局&#xff0c;栅格布局&#xff08;弹簧&#xff09; 界面自动调整 3.记录 注意弹簧不是拖拽拉长&#xff0c;而是使用栅格布局 运行发现窗口放大缩小可以自动调整 如果想要重新布局&#xff0c;需…

【PHP趣味技术】分分钟教会你轻松采集PDF文本内容 《重庆话真的太吃皮老!》

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享博主 &#x1f40b; 希望大家多多支持一下, 我们一起学习和进步&#xff01;&#x1f604; &#x1f3c5; 如果文章对你有帮助的话&#xff0c;欢迎评论 &#x1f4ac;点赞&a…

备忘 clang diagnostic 类的应用示例 ubuntu 22.04

系统的ncurses环境有些问题 通过源码安装了ncurses6.3后&#xff0c;才可以在 llvmort-18.1.rc4中编译通过示例&#xff1a; 1&#xff0c;折腾环境 ncurses-6.3$ ./configure ncurses-6.3$ make -j ncurses-6.3$ sudo make install sudo apt install libtinfo5 sudo…

使用Visual Studio 2022 创建lib和dll并使用

概述&#xff1a;对于一个经常写javaWeb的人来说,使用Visual Studio似乎没什么必要&#xff0c;但是对于使用ffi的人来说&#xff0c;使用c或c编译器&#xff0c;似乎是必不可少的&#xff0c;下面我将讲述如何用Visual Studio 2022 来创建lib和dll&#xff0c;并使用。 静态库…

ABAP - SALV教程12 显示图标和提示信息

ALV要求字段的值为图标的需求并不多见&#xff0c;一般都用于红黄绿灯&#xff0c;来表示单据的执行状态&#xff0c;添加图标的方式也可以实现红黄绿灯的功能&#xff0c;也可以参考SALV实现红黄绿灯这篇文章&#xff1a;http://t.csdnimg.cn/Dzx7x效果图SAVL列设置为图标图标…

434G数据失窃!亚信安全发布《勒索家族和勒索事件监控报告》

最新态势快速感知 最新一周全球共监测到勒索事件90起&#xff0c;与上周相比数量有所增加。 lockbit3.0仍然是影响最严重的勒索家族&#xff1b;alphv和cactus恶意家族也是两个活动频繁的恶意家族&#xff0c;需要注意防范。 Change Healthcare - Optum - UnitedHealth遭受了…

详细分析服务器自动重启原因(涉及Linux、Window)

目录 前言1. Linux2. Window 前言 对于服务器异常重启的问题&#xff0c;需要定位原因并解决&#xff0c;下次就不会重启 1. Linux 要查看Linux服务器自动重启的原因&#xff0c;可以执行以下步骤&#xff1a; 检查系统日志&#xff1a;Linux系统通常会记录系统事件和错误信…

vue3页面内容切换(类似登录、注册内容切换)

一、内容描述 页面有俩块内容&#xff0c;分别是验证码登录页面内容&#xff0c;账号密码登录页面内容。有俩种处理方式&#xff0c;一个是写俩个页面跳转使用&#xff0c;还有一种是一个页面俩个内容&#xff0c;切换的只是不同的内容&#xff0c;相同的内容保留。一般都是选择…

通过人工智能增强的对话建立有意义的联系

人工智能如何重塑我们的交流&#xff1f;2024年最新对话AI趋势 在技术和人类互动比以往任何时候都更加复杂地交织在一起的时代&#xff0c;人工智能增强的对话已成为建立有意义的联系的关键要素。 这种转变不仅关乎效率&#xff0c;还关乎效率。 这是为了丰富沟通的结构。 在这…

12. Nginx进阶-Location

简介 Nginx的三大区块 在Nginx中主要配置包括三个区块&#xff0c;结构如下&#xff1a; http { #协议级别include /etc/nginx/mime.types;default_type application/octet-stream;log_format main $remote_addr - $remote_user [$time_local] "$r…

(十五)【Jmeter】取样器(Sampler)之HTTP请求

简述 操作路径如下: HTTP请求 (HTTP Sampler): 作用:模拟发送HTTP请求并获取响应。配置:设置URL、请求方法、请求参数等参数。使用场景:测试Web应用程序的HTTP接口性能。优点:支持多种HTTP方法和请求参数,适用于大多数Web应用程序测试。缺点:功能较为基础,对于复杂…

42、网络编程/多点通信和域套接字通信模型20240304

一、多点通信之广播的收发端实现 1.广播发送端代码&#xff1a; #include<myhead.h>int main(int argc, const char *argv[]) {int sfdsocket(AF_INET,SOCK_DGRAM,0);//创建套接字if(sfd-1){perror("socket,error");return -1;}int broadcast1;//设置套接字广…

opencv VideoCapture

videocapture顾名思义视频捕捉&#xff0c;主要是从视频文件、摄像头或网络摄像头获取视频流数据&#xff0c;并将其作为一系列帧进行处理。 我们这里主要实现了获取项目文件夹下的1.mp4视频文件&#xff0c;然后经过灰度变化、均值滤波、边缘检测然后将视频显示出来 #include…

ruoyi-vue-plus4.X版本实现内嵌swagger文档(简单解决方法)

1.在common模块中添加pom依赖 <dependency><groupId>org.webjars</groupId><artifactId>swagger-ui</artifactId><version>4.15.5</version></dependency>结果如下&#xff1a; 2.在ResourcesConfig配置类的addResourceHandl…

Git分支补充

我们在合并分支时并不总是一帆风顺&#xff0c;有些时候也会遇到“合并冲突”的问题。 下面我们来还原一下&#xff1a; 创建分支dev $ git checkout -b dev 切换到一个新分支 dev $ git branch * devmaster我们将 text.txt 内容改为 欢迎关注CSDNkeduo并将修改的内容提交到 d…

Linux-信号3_sigaction、volatile与SIGCHLD

文章目录 前言一、sigaction__sighandler_t sa_handler;__sigset_t sa_mask; 二、volatile关键字三、SIGCHLD方法一方法二 前言 本章内容主要对之前的内容做一些补充。 一、sigaction #include <signal.h> int sigaction(int signum, const struct sigaction *act,struc…

Prometheus结合Grafana监控MySQL,这篇不可不读!

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

动态规划:LeetCode第10题 正则表达式匹配

题目&#xff1a; 给你一个字符串 s 和一个字符规律 p&#xff0c;请你来实现一个支持 . 和 * 的正则表达式匹配。 . 匹配任意单个字符* 匹配零个或多个前面的那一个元素 所谓匹配&#xff0c;是要涵盖 整个 字符串 s的&#xff0c;而不是部分字符串。 示例 1&#xff1a; …

软考57-上午题-【数据库】-数据库的控制功能

一、事务管理 1-1、事务的定义 事务是一个操作序列&#xff0c;这些操作&#xff0c;要么都做&#xff0c;要么都不做。 事务和程序是两个不同的概念&#xff0c;一般一个程序可以包含多个事务。 1-2、事务定义的语句 1、事务开始&#xff1a;BEGIN TRANSACTION 2、事务提…

【ES入门一:基础概念】

集群层面上的基础概念 集群 由多个es实例组成的叫做集群 节点 单个ES的服务实例叫做节点。每个实例都有自己的名字&#xff0c;就是在配置文件中配置的‘node.name’中的内容。为了标识每个节点&#xff0c;每个节点启动后都会分配一个UID&#xff0c;存储在data目录。每个…