Java基础-集合框架

集合框架:

内存层面可考虑的数据存储容器:数组,集合

数组的特点:长度,存储元素类型确定,既可以放基本数据类型,也可以放引用数据类型

缺点:长度不可变,存储元素特点单一,属性方法少,删除插入性能差

集合体系:

java.util.Collection:存储一个一个的数据
    |-----子接口:List:存储有序的、可重复的数据 ("动态"数组)
           |---- ArrayList(主要实现类)、LinkedList、Vector

    |-----子接口:Set:存储无序的、不可重复的数据(高中学习的集合)
           |---- HashSet(主要实现类)、LinkedHashSet、TreeSet


java.util.Map:存储一对一对的数据(key-value键值对,(x1,y1)、(x2,y2) --> y=f(x),类似于高中的函数)
    |---- HashMap(主要实现类)、LinkedHashMap、TreeMap、Hashtable、Properties

collection下的方法:

add(Object obj)        addAll(Collection coll)        clear()        isEmpty()        size()
contains(Object obj)        containsAll(Collection coll)        retainAll(Collection coll)
remove(Object obj)        removeAll(Collection coll)        hashCode()
equals()        toArray()        

iterator()说明:

1. 迭代器(Iterator)的作用:用来遍历集合元素的。

2. 获取迭代器(Iterator)对象:Iterator iterator = coll.iterator();

3. 如何实现遍历(代码实现)
while(iterator.hasNext()){
    System.out.println(iterator.next()); //next():①指针下移 ② 将下移以后集合位置上的元素返回
}
4. 增强for循环(foreach循环)的使用(jdk5.0新特性)
作用:用来遍历数组、集合。

格式:for(要遍历的集合或数组元素的类型 临时变量 : 要遍历的集合或数组变量){
    操作临时变量的输出
}
说明:
> 针对于集合来讲,增强for循环的底层仍然使用的是迭代器。
> 增强for循环的执行过程中,是将集合或数组中的元素依次赋值给临时变量,注意,循环体中对临时变量的修改,可能不会导致原有集合或数组中元素的修改。(涉及对象属性则会改变)

集合与数组的相互转换:


集合 ---> 数组:toArray()
数组 ---> 集合:调用Arrays的静态方法asList(Object ... objs)

向Collection中添加元素的要求:要求元素所属的类一定要重写equals()!

原因:因为Collection中的相关方法(比如:contains() / remove())在使用时,要调用元素所在类的equals()。

list接口中常用方法:(包含collection中)

- 插入元素
  - `void add(int index, Object ele)`:在index位置插入ele元素
  - boolean addAll(int index, Collection eles):从index位置开始将eles中的所有元素添加进来
- 获取元素
  - `Object get(int index)`:获取指定index位置的元素
  - List subList(int fromIndex, int toIndex):返回从fromIndex到toIndex位置的子集合
- 获取元素索引
  - int indexOf(Object obj):返回obj在集合中首次出现的位置
  - int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置
- 删除和替换元素
  - `Object remove(int index)`:移除指定index位置的元素,并返回此元素
  - `Object set(int index, Object ele)`:设置指定index位置的元素为ele

小结:
    增:add(Object obj);addAll(Collection coll)
    删:remove(Object obj);remove(int index)

 list中remove参数优先选择是索引,存在数据和索引冲突时(显式将其包装为对象)

eg:list.remove(2)-删除索引2的元素,list.remove(integer.valueof(2))-删除list中数据2

    改:set(int index, Object ele)
    查:get(int index)
    插:add(int index, Object ele);addAll(int index, Collection eles)
    长度:size()
    遍历:iterator() :使用迭代器进行遍历;增强for循环;一般的for循环

List及其实现类特点


java.util.Collection:存储一个一个的数据
    |-----子接口:List:存储有序的、可重复的数据 ("动态"数组)
           |---- ArrayList:List的主要实现类;线程不安全的、效率高;底层使用Object[]数组存储
                           在添加数据、查找数据时,效率较高;在插入、删除数据时,效率较低
           |---- LinkedList:底层使用双向链表的方式进行存储;在对集合中的数据进行频繁的删除、插入操作时,建议使用此类
                           在插入、删除数据时,效率较高;在添加数据、查找数据时,效率较低;
           |---- Vector:List的古老实现类;线程安全的、效率低;底层使用Object[]数组存储

Set及其实现类特点


java.util.Collection:存储一个一个的数据
    |-----子接口:Set:存储无序的、不可重复的数据
           |---- HashSet:主要实现类;底层使用的是HashMap,即使用数组+单向链表+红黑树结构进行存储。(jdk8中)
                |---- LinkedHashSet:是HashSet的子类;在现有的数组+单向链表+红黑树结构的基础上,又添加了一组双向链表,用于记录添加元素的先后顺序。即:我们可以按照添加元素的顺序实现遍历。便于频繁的查询操作。
           |---- TreeSet:底层使用红黑树存储。可以按照添加的元素的指定的属性的大小顺序进行遍历。
使用场景:> 用来过滤重复数据

eg:对arraylist中重复对象去重-使用set

HashSet set = new HashSet(list);
List list1 = new ArrayList(set);
return list1;

Set中常用方法:即为Collection中声明的15个抽象方法。没有新增的方法。

Set中无序性、不可重复性的理解(以HashSet及其子类为例说明)-理解为存放位置的不确定

>无序性: != 随机性。
         添加元素的顺序和遍历元素的顺序不一致,是不是就是无序性呢? No!
         到底什么是无序性?与添加的元素的位置有关,不像ArrayList一样是依次紧密排列的。
         这里是根据添加的元素的哈希值,计算的其在数组中的存储位置。此位置不是依次排列的,表现为无序性。

>不可重复性:添加到Set中的元素是不能相同的。
          比较的标准,需要判断hashCode()得到的哈希值以及equals()得到的boolean型的结果。
          哈希值相同且equals()返回true(先比哈希再比equals),则认为元素是相同的。放入集合后,对对象的元素进行修改不会重新计算哈希值(map的底层逻辑)

添加到HashSet/LinkedHashSet中元素的要求:


要求元素所在的类要重写两个方法:equals() 和 hashCode()。
同时,要求equals() 和 hashCode()要保持一致性!我们只需要在IDEA中自动生成两个方法的重写即可,即能保证两个方法的一致性。
TreeSet的使用;底层的数据结构:红黑树; 添加数据后的特点:可以按照添加的元素的指定的属性的大小顺序进行遍历。
向TreeSet中添加的元素的要求:
> 要求添加到TreeSet中的元素必须是同一个类型的对象,否则会报ClassCastException.
> 添加的元素需要考虑排序:① 自然排序 ② 定制排序

注意: 判断数据是否相同的标准
> 不再是考虑hashCode()和equals()方法了,也就意味着添加到TreeSet中的元素所在的类不需要重写hashCode()和equals()方法了
> 比较元素大小的或比较元素是否相等的标准就是考虑自然排序或定制排序中,compareTo()或compare()的返回值。如果compareTo()或compare()的返回值为0,则认为两个对象是相等的。由于TreeSet中不能存放相同的元素,则后一个相等的元素就不能添加到TreeSet中。

Map及其实现类对比


java.util.Map:存储一对一对的数据(key-value键值对,(x1,y1)、(x2,y2) --> y=f(x),映射)
    |---- HashMap:主要实现类;线程不安全的,效率高;可以添加null的key和value值;底层使用数组+单向链表+红黑树结构存储(jdk8)
        |---- LinkedHashMap:是HashMap的子类;在HashMap使用的数据结构的基础上,增加了一对双向链表,用于记录添加的元素的先后顺序,进而我们在遍历元素时,就可以按照添加的顺序显示。开发中,对于频繁的遍历操作,建议使用此类。
    |---- TreeMap:底层使用红黑树存储;可以按照添加的key-value中的key元素的指定的属性的大小顺序进行遍历。需要考虑使用①自然排序 ②定制排序。
    |---- Hashtable:古老实现类;线程安全的,效率低;不可以添加null的key或value值;底层使用数组+单向链表结构存储(jdk8)
        |---- Properties:其key和value都是String类型。常用来处理属性文件。


HashMap的底层实现(① new HashMap() ② put(key,value))


HashMap中元素的特点
> HashMap中的所有的key彼此之间是不可重复的、无序的。所有的key就构成一个Set集合。--->key所在的类要重写hashCode()和equals()
> HashMap中的所有的value彼此之间是可重复的、无序的。所有的value就构成一个Collection集合。--->value所在的类要重写equals()
> HashMap中的一个key-value,就构成了一个entry。
> HashMap中的所有的entry彼此之间是不可重复的、无序的。所有的entry就构成了一个Set集合。

 Map中的常用方法(所有实现类都有)


- 添加、修改操作:
  - Object put(Object key,Object value):将指定key-value添加到(或修改)当前map对象中,key可以为null
  - void putAll(Map m):将m中的所有key-value对存放到当前map中
- 删除操作:
  - Object remove(Object key):移除指定key的key-value对,并返回value
  - void clear():清空当前map中的所有数据
- 元素查询的操作:
  - Object get(Object key):获取指定key对应的value
  - boolean containsKey(Object key):是否包含指定的key
  - boolean containsValue(Object value):是否包含指定的value
  - int size():返回map中key-value对的个数
  - boolean isEmpty():判断当前map是否为空
  - boolean equals(Object obj):判断当前map和参数对象obj是否相等
- 元视图操作的方法:
  - Set keySet():返回所有key构成的Set集合
  - Collection values():返回所有value构成的Collection集合
  - Set entrySet():返回所有key-value对构成的Set集合

小结:
    增:put(Object key,Object value); putAll(Map m)
    删:Object remove(Object key)
    改:put(Object key,Object value);putAll(Map m)
    查:Object get(Object key)
    长度:size()
    遍历:遍历key集:Set keySet();遍历value集:Collection values();遍历entry集(类:Map.entry(entry有getkey和getvalue方法)):Set entrySet()

TreeMap的使用(类比TreeSet)


> 底层使用红黑树存储;
> 可以按照添加的key-value中的key元素的指定的属性的大小顺序进行遍历。
> 需要考虑使用①自然排序 ②定制排序。
> 要求:向TreeMap中添加的key必须是同一个类型的对象。

Hashtable与Properties的使用
Properties:是Hashtable的子类,其key和value都是String类型的,常用来处理属性文件。

Collections 是一个操作 Set、List 和 Map 等集合的工具类。

常用方法
排序操作:
- reverse(List):反转 List 中元素的顺序
- shuffle(List):对 List 集合元素进行随机排序
- sort(List):根据元素的自然顺序对指定 List 集合元素按升序排序
- sort(List,Comparator):根据指定的 Comparator 产生的顺序对 List 集合元素进行排序
- swap(List,int, int):将指定 list 集合中的 i 处元素和 j 处元素进行交换

查找
- Object max(Collection):根据元素的自然顺序,返回给定集合中的最大元素
- Object max(Collection,Comparator):根据 Comparator 指定的顺序,返回给定集合中的最大元素
- Object min(Collection):根据元素的自然顺序,返回给定集合中的最小元素
- Object min(Collection,Comparator):根据 Comparator 指定的顺序,返回给定集合中的最小元素
- int binarySearch(List list,T key)在List集合中查找某个元素的下标,但是List的元素必须是T或T的子类对象,而且必须是可比较大小的,即支持自然排序的。而且集合也事先必须是有序的,否则结果不确定。
- int binarySearch(List list,T key,Comparator c)在List集合中查找某个元素的下标,但是List的元素必须是T或T的子类对象,而且集合也事先必须是按照c比较器规则进行排序过的,否则结果不确定。
- int frequency(Collection c,Object o):返回指定集合中指定元素的出现次数

复制、替换
- void copy(List dest,List src):将src中的内容复制到dest中

使用要求dest的size大于src的size,否则会抛出异常,正确使用:

List dest = Arrays.asList(new Object[src.size()]);
Collections.copy(dest,src);


- boolean replaceAll(List list,Object oldVal,Object newVal):使用新值替换 List 对象的所有旧值
- 提供了多个unmodifiableXxx()方法,该方法返回指定 Xxx的不可修改的视图(只可读不可修改,用final修饰人可以增加修改)

添加
- boolean addAll(Collection  c,T... elements)将所有指定元素添加到指定 collection 中。

同步
- Collections 类中提供了多个 synchronizedXxx() 方法,该方法可使将指定集合包装成线程同步的集合,从而可以解决多线程并发访问集合时的线程安全问题
区分Collection 和 Collections:
Collection:集合框架中的用于存储一个一个元素的接口,又分为List和Set等子接口。
Collections:用于操作集合框架的一个工具类。此时的集合框架包括:Set、List、Map

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

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

相关文章

从零开始 Linux(一):基础介绍与常用指令总结

从零开始 Linux 01. 概念理解 1.1 什么是 Linux? Linux 是一个开源免费的 操作系统,具有很好的稳定性、安全性,且有很强的处理高并发的能力 Linux 的应用场景: 可以在 Linux 下开发项目,比如 JavaEE、大数据、Python…

3D词云图

工具库 tagcanvas.min.js vue3&#xff08;框架其实无所谓&#xff0c;都可以&#xff09; 实现 <script setup> import { onMounted, ref } from vue; import ./tagcanvas.min.js;const updateFlag ref(false);// 词云图初始化 const initWordCloud () > {let …

RabbitMQ快速实战

目录 什么是消息队列&#xff1f; 消息队列的优势 应用解耦 异步提速 削峰填谷 总结 主流MQ产品特点比较 Rabbitmq快速上手 创建用户admin Exchange和Queue Connection和Channel RabbitMQ中的核心概念总结 什么是消息队列&#xff1f; MQ全称Message Queue&#xf…

Spring5深入浅出篇:Spring中ioc(控制反转)与DI(依赖注入)

Spring5深入浅出篇:Spring中ioc(控制反转)与DI(依赖注入) 反转(转移)控制(IOC Inverse of Control) 控制&#xff1a;对于成员变量赋值的控制权 反转控制&#xff1a;把对于成员变量赋值的控制权&#xff0c;从代码中反转(转移)到Spring⼯⼚和配置⽂件中完成好处&#xff1a;…

七、并发工具(上)

一、自定义线程池 1&#xff09;背景&#xff1a; 在 QPS 量比较高的情况下&#xff0c;我们不可能说所有的访问都创建一个线程执行&#xff0c;这会导致内存占用过高&#xff0c;甚至有可能出现 out of memory另外也要考虑 cpu 核数&#xff0c;如果请求超过了cpu核数&#…

【bitonicSort学习】

bitonicSort学习 什么是Bitonic Sort核心 什么是Bitonic Sort https://zhuanlan.zhihu.com/p/53963918 这个是用来并行排序的一个操作 之前学过一些CPU排序&#xff0c;快排 冒泡 归并啥的&#xff0c;有一些能转成并行&#xff0c;有一些不适合 像快排这种二分策略就可以考虑…

Vue3的自定义指令怎么迁移到nuxt3

一、找到Vue3中指令的源码 const DISTANCE 100; // 距离 const ANIMATIONTIME 500; // 500毫秒 let distance: number | null null,animationtime: number | null null; const map new WeakMap(); const ob new IntersectionObserver((entries) > {for (const entrie…

草图导入3d后模型贴材质的步骤?---模大狮模型网

3D模型在导入草图大师后出现混乱可能有多种原因&#xff0c;以下是一些可能的原因和解决方法&#xff1a; 模型尺寸问题&#xff1a;如果3D模型的尺寸在导入草图大师时与画布尺寸不匹配&#xff0c;可能导致模型混乱。解决方法是在3D建模软件中调整模型的尺寸&#xff0c;使其适…

FreeRTOS使用计数信号量进行任务同步与资源管理

FreeRTOS使用计数信号量进行任务同步与资源管理 介绍 在多任务系统中&#xff0c;任务之间的同步和对共享资源的管理是非常重要的。FreeRTOS 提供了丰富的同步机制&#xff0c;其中计数信号量是一种强大的工具&#xff0c;用于实现任务之间的同步和对资源的访问控制。 什么是…

figure方法详解之清除图形内容

figure方法详解之清除图形内容 一 clf():二 clear():三 clear()方法和clf()方法的区别&#xff1a; 前言 Hello 大家好&#xff01;我是甜美的江。 在数据可视化中&#xff0c;Matplotlib 是一个功能强大且广泛使用的库&#xff0c;它提供了各种方法来创建高质量的图形。在 Mat…

unity 拖入文件 窗口大小

目录 unity 拖入文件插件 设置窗口大小 unity 拖入文件插件 GitHub - Bunny83/UnityWindowsFileDrag-Drop: Adds file drag and drop support for Unity standalong builds on windows. 设置窗口大小 file build

Iceberg从入门到精通系列之二十一:Spark集成Iceberg

Iceberg从入门到精通系列之二十一&#xff1a;Spark集成Iceberg 一、在 Spark 3 中使用 Iceberg二、添加目录三、创建表四、写五、读六、Catalogs七、目录配置八、使用目录九、替换会话目录十、使用目录特定的 Hadoop 配置值十一、加载自定义目录十二、SQL 扩展十三、运行时配置…

电子电器架构——车载网关转发buffer心得汇总

电子电器架构——车载网关转发buffer心得汇总 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力…

vue2父组件向子组件传值时,子组件同时接收多个数据类型,控制台报警的问题

最近项目遇到一个问题,就是我的父组件向子组件(公共组件)传值时,子组件同时接收多个数据类型,控制台报警的问题,如下图,子组件明明写了可同时接收字符串,整型和布尔值,但控制台依旧报警: 仔细检查父组件,发现父组件是这样写的: <common-tabletooltip :content=…

2024 springboot Mybatis-flex 打包出错

Mybatis-flex官网&#xff1a;快速开始 - MyBatis-Flex 官方网站 从 Mybatis-flex官网获取模板后&#xff0c;加入自己的项目内容想打包确保错&#xff0c;先试试一下方法 这里改成skip的默认是true改成false&#xff0c;再次打包就可以了

Git系列---标签管理

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 1.理解标签2.创建标签…

MySQL原理(一)架构组成之物理文件组成

目录 一、日志文件 1、错误日志 Error Log 1.1、作用&#xff1a; 1.2、开启关闭&#xff1a; 1.3、使用 2、二进制日志 Binary Log & Binary Log Index 2.1、作用&#xff1a; 2.2、开启关闭&#xff1a; 2.3、Binlog还有一些附加选项参数 &#xff08;1&#x…

verilog编程之乘法器的实现

知识储备 首先来回顾一下乘法是如何在计算机中实现的。 假设现在有两个32位带符号定点整数x和y&#xff0c;我们现在要让x和y相乘&#xff0c;然后把乘积存放在z中&#xff0c;大家知道&#xff0c;两个32位数相乘&#xff0c;结果不会超过64位&#xff0c;因此z的长度应该为64…

大数据开发之离线数仓项目(3数仓数据同步策略)(可面试使用)

第 1 章&#xff1a;实时数仓同步数据 实时数仓由flink源源不断从kafka当中读数据计算&#xff0c;所以不需要手动同步数据到实时数仓。 第 2 章&#xff1a;离线数仓同步数据 2.1 用户行为数据同步 2.1.1 数据通道 用户行为数据由flume从kafka直接同步到hdfs&#xff0c;…

通俗易懂理解通道注意力机制(CAM)与空间注意力机制(SAM)

重要说明&#xff1a;本文从网上资料整理而来&#xff0c;仅记录博主学习相关知识点的过程&#xff0c;侵删。 一、参考资料 通道注意力&#xff0c;空间注意力&#xff0c;像素注意力 通道注意力机制和空间注意力机制 视觉 注意力机制——通道注意力、空间注意力、自注意力…