Java--Collection集合

一、Collection

1.1 概述

  • Collection 层次结构 中的根接口。
  • Collection 表示一组对象,这些对象也称为 collection 的元素【集合中只能存储引用类型】。
  • 一些 collection 允许有重复的元素,而另一些则不允许。
  • 一些 collection 是有序的,而另一些则是无序的。
  • JDK 不提供此接口的任何 直接实现:它提供更具体的子接口(如 Set 和 List)实现。
  • 此接口通常用来传递 collection,并在需要最大普遍性的地方操作这些 collection。

1.2 Collection体系

  1. Collection接口
    • 这是所有集合类的根接口,定义了添加、删除、迭代等基本方法。
    • 实现Collection接口的类有ArrayList, LinkedList, HashSet, TreeSet, Vector, Stack等。
  2. List接口
    • List是一个有序的集合,允许重复元素,并且每个元素都有一个位置索引。
    • 实现List接口的类有ArrayList, LinkedList, Vector等。
  3. Set接口
    • Set是一个不包含重复元素的集合,没有顺序的概念。
    • 实现Set接口的类有HashSet, LinkedHashSet, TreeSet等。
  4. Queue接口
    • Queue是一个主要用于实现队列操作的集合,如先进先出(FIFO)。
    • 实现Queue接口的类有ArrayDeque, LinkedList等。
  5. Deque接口
    • Deque是双端队列的缩写,可以作为堆栈、队列或列表使用。
    • 实现Deque接口的类有ArrayDeque, LinkedList等。
  6. Map接口
    • Map是一种将键映射到值的对象,不允许重复键。
    • 实现Map接口的类有HashMap, LinkedHashMap, TreeMap, Hashtable, Properties等。

除了上述接口,还有一些辅助类和接口,例如Iterator用于遍历集合,Spliterator用于并行流处理,EnumSet用于枚举类型集合等。

Java Collection Framework的设计遵循了一些基本原则,如泛型化、可变性、线程安全性等,使得开发人员能够更加高效地处理各种数据结构问题。

1.3 常用方法

增删改查
import java.util.ArrayList;
import java.util.Collection;public class Demo02 {public static void main(String[] args) {/*** 方法摘要 * 增boolean add(E e) 确保此 collection 包含指定的元素(可选操作)。 boolean addAll(Collection<? extends E> c) 将指定 collection 中的所有元素都添加到此 collection 中(可选操作)。 * 删boolean remove(Object o) 从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。 boolean removeAll(Collection<?> c) 移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。 void clear() 移除此 collection 中的所有元素(可选操作)。 * 改* 查int size() 返回此 collection 中的元素数。 boolean isEmpty() 如果此 collection 不包含元素,则返回 true。 boolean contains(Object o) 如果此 collection 包含指定的元素,则返回 true。 boolean containsAll(Collection<?> c) 如果此 collection 包含指定 collection 中的所有元素,则返回 true。 boolean retainAll(Collection<?> c) 仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。 *//***  创建集合对象*      多态方式创建对象:*          声明的容器对象类型是接口,实际创建的对象类型是实现类*      声明了容器对象中的元素类型是String【泛型】*/Collection<String> coll = new ArrayList<String>();// 添加数据coll.add("曹操");coll.add("曹丕");coll.add("曹植");coll.add("曹昂");// 输出容器中的内容System.out.println(coll.toString());Collection<String> c = new ArrayList<String>();// 添加数据c.add("曹爽");c.add("曹冲");c.add("曹洪");// 添加指定集合中的全部数据c.addAll(coll);System.out.println(c);// 删除数据,有布尔类型的返回值,表示删除是否成功coll.remove("曹昂");System.out.println(coll);// 移除两个集合中交集部分c.removeAll(coll);System.out.println(c);System.out.println("集合中元素的数量:" + c.size());// 清空集合// c.clear();System.out.println("集合中元素的数量:" + c.size());// 集合中是否包含指定元素System.out.println(c.contains("曹操"));System.out.println(c.contains("曹爽"));// 是否完全包含另一个集合中的数据System.out.println(c.containsAll(coll));System.out.println(c.containsAll(c));coll.add("曹爽");coll.add("曹冲");System.out.println(c);System.out.println(coll);// 在c集合中留下两个集合中交集部分内容c.retainAll(coll);System.out.println(c);}
}
遍历集合【重点】【掌握】

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;public class Demo03 {public static void main(String[] args) {/*** 遍历*  foreach*  iterator*/// 创建集合Collection<String> names = new ArrayList<String>();// 添加数据names.add("唐三藏");names.add("孙悟空");names.add("猪八戒");names.add("沙和尚");names.add("白龙马");/***  foreachfor(数据类型 变量名 : 容器对象){}容器对象:数组、集合数据类型:容器中元素的类型变量名字:临时变量名字,用来存储容器中的每一个元素*/for (String name : names) {System.out.println(name);}/***  迭代器*      先使用获取迭代器对象:*          调用集合的iterator()方法*      使用循环从迭代器中获取每一个元素*          使用while循环*/Iterator<String> it = names.iterator();// 不断地判定是否有下一个数据while (it.hasNext()) {// 获取下一个对象,顺便把游标向下移动String name = it.next();System.out.println(name);}}
}

二、List

2.1 概述

  • 有序地Collection
    • 元素有索引
    • 元素能重复
  • 每个元素的插入位置进行精确地控制。
  • 以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
  • List 接口中的方法超过了 Collection接口中指定的约定。
    • 包含Collection中继承的方法 + List接口中独有的方法

2.2 实现类

ArrayList【重点】
  • 基于数组实现的
  • 查询速度快,增删速度相对较慢
LinkedList
  • 基于链表实现的
  • 查询数据速度慢,增删数据速度快
Vector
  • 基于数组 && 线程安全的
  • Vector 是同步的。

三、ArrayList

3.1 概述

  • List
    • ArrayList容量可变,长度可变
    • 基于数组实现
  • 提供一些方法来操作内部用来存储列表的数组的大小。
    • ensureCapacity(int minCapacity)
      • 确保 ArrayList 的容量至少为指定的最小容量。这个方法主要是为了避免频繁的数组复制操作,因为 ArrayList 在内部使用一个数组来存储元素,当数组空间不足时,会创建一个新的更大的数组并将原有元素复制过去,这是一个相对昂贵的操作。
      • 参数 minCapacity 指定了 ArrayList 应该至少具有的容量。如果当前的容量小于 minCapacity,那么 ArrayList 会增加其内部数组的大小,以满足这个要求。
    • trimToSize
      • trimToSize() 方法是 java.util.ArrayList 类的一个成员方法,它的作用是将 ArrayList 的容量调整为其实际大小。在 ArrayList 中,容量是指底层数组的大小,而大小则是指 ArrayList 中实际元素的数量。
      • 通常,ArrayList 在添加元素超过其当前容量时,会自动扩展其底层数组的大小,以容纳更多的元素。这种扩展通常是按照一定的比例进行的(默认是增加50%)。然而,这可能导致 ArrayList 的容量远大于其实际大小,尤其是当你从一个较大的 ArrayList 中移除大量元素后。
      • trimToSize() 方法的作用就在于此。当你调用 trimToSize() 后,ArrayList 会重新分配一个刚好能容纳当前元素数量的新数组,并将所有元素复制到新数组中。这样,ArrayList 的容量就等于其大小,从而节省了内存。
  • 每个 ArrayList 实例都有一个容量。该容量是指用来存储列表元素的数组的大小。
  • 它总是至少等于列表的大小。随着向 ArrayList 中不断添加元素,其容量也自动增长。
  • 在添加大量元素前,应用程序可以使用 ensureCapacity 操作来增加 ArrayList 实例的容量。这可以减少递增式再分配的数量。

3.2 创建对象

import java.util.ArrayList;public class Demo01 {public static void main(String[] args) {/*** 构造方法摘要 ArrayList() 构造一个初始容量为 10 的空列表。 ArrayList(int initialCapacity) 构造一个具有指定初始容量的空列表。 ArrayList(Collection<? extends E> c) 构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的。 *///  构造一个初始容量为 10 的空列表。 ArrayList<String> list01 = new ArrayList<String>();//  构造一个具有指定初始容量的空列表。 ArrayList<String> list02 = new ArrayList<String>(1024);list02.add("Hello");list02.add("World");// 基于其他集合创建List集合对象,包含其他集合中的数据ArrayList<String> list03 = new ArrayList<String>(list02);System.out.println(list03);}
}

3.3 常用方法

增删

import java.util.ArrayList;public class Demo02 {public static void main(String[] args) {/**方法摘要 增boolean add(E e) 将指定的元素添加到此列表的尾部。 void add(int index, E element) 将指定的元素插入此列表中的指定位置。 boolean addAll(Collection<? extends E> c) 按照指定 collection 的迭代器所返回的元素顺序,将该 collection 中的所有元素添加到此列表的尾部。 boolean addAll(int index, Collection<? extends E> c) 从指定的位置开始,将指定 collection 中的所有元素插入到此列表中。 删E remove(int index) 移除此列表中指定位置上的元素。 boolean remove(Object o) 移除此列表中首次出现的指定元素(如果存在)。 void clear() 移除此列表中的所有元素。 removeAll移除两个集合中重复的内容*/// 创建集合ArrayList<String> list01 = new ArrayList<String>();// 添加数据list01.add("刘备");list01.add("刘封");list01.add("刘禅");list01.add("刘表");System.out.println(list01);// 在指定位置插入数据list01.add(2, "关羽");list01.add(2, "关羽");System.out.println(list01);// 通过索引移除数据,返回被移除的数据String name = list01.remove(0);System.out.println(name);System.out.println(list01);// 移除指定的对象,返回移除是否成功boolean result = list01.remove("关羽");System.out.println(result);System.out.println(list01);// 创建集合,存储整数ArrayList<Integer> list = new ArrayList<Integer>();// 添加数据list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);// 输出System.out.println(list);Integer i = 1;list.remove(i);System.out.println(list);}
}
改查
import java.util.ArrayList;
import java.util.List;public class Demo03 {public static void main(String[] args) {/***  改E set(int index, E element) 用指定的元素替代此列表中指定位置上的元素。 void ensureCapacity(int minCapacity) 如有必要,增加此 ArrayList 实例的容量,以确保它至少能够容纳最小容量参数所指定的元素数。 void trimToSize() 将此 ArrayList 实例的容量调整为列表的当前大小。 查int size() 返回此列表中的元素数。 E get(int index) 返回此列表中指定位置上的元素。 boolean contains(Object o) 如果此列表中包含指定的元素,则返回 true。 containsAll是否包含另一个集合中的所有内容int indexOf(Object o) 返回此列表中首次出现的指定元素的索引,或如果此列表不包含该元素,则返回 -1。 int lastIndexOf(Object o) 返回此列表中最后一次出现的指定元素的索引,或如果此列表不包含该索引,则返回 -1。 retainAll保留两个集合中的交集部分内容subList截取集合中的区间数据其他iteratorlistIteratorObject[] toArray() 按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组。  */// 创建集合ArrayList<String> list01 = new ArrayList<String>();// 添加数据list01.add("刘备");list01.add("刘封");list01.add("刘禅");list01.add("刘表");list01.add("关羽");list01.add("张飞");list01.add("赵云");System.out.println(list01);// 修改指定位置的元素list01.set(2, "刘阿斗");System.out.println(list01);// 元素的数量System.out.println(list01.size());// 获取指定索引位置的对象System.out.println(list01.get(0));System.out.println(list01.get(1));System.out.println(list01.get(2));System.out.println(list01.get(3));// 指定对象在集合中第一次出现的索引,如果对象不存在返回-1System.out.println(list01.indexOf("刘禅"));System.out.println(list01.indexOf("刘阿斗"));// 截取指定区间的数据,得到一个新的集合List<String> subList = list01.subList(2, 6);System.out.println(subList);}
}

3.4 遍历集合【重点】【掌握】


import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;public class Demo04 {public static void main(String[] args) {/***  遍历ArrayList集合*      索引遍历*          for*          while*          do-while*      无索引遍历*          foreach*          iterator*          listIterator*/// 创建集合ArrayList<String> list = new ArrayList<String>();// 添加数据list.add("刘备");list.add("关羽");list.add("张飞");list.add("赵云");list.add("黄忠");System.out.println("===============for==================");for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));}System.out.println("===============while==================");int index = 0;while (index < list.size()) {System.out.println(list.get(index));index++;}System.out.println("===============do-while==================");index = 0;do {System.out.println(list.get(index));index++;} while (index < list.size());System.out.println("===============foreach==================");for (String name : list) {System.out.println(name);}System.out.println("===============iterator==================");// 获取迭代器对象Iterator<String> it = list.iterator();while (it.hasNext()) {String name = it.next();System.out.println(name);}System.out.println("===============listLterator==================");// 获取迭代器对象ListIterator<String> lit = list.listIterator();while (lit.hasNext()) {String name = lit.next();System.out.println(name);}while (lit.hasPrevious()) {String name = lit.previous();System.out.println(name);}System.out.println("----------------------------------------");// 从指定位置开始获取迭代器对象:开始的位置是最后一个元素ListIterator<String> litt = list.listIterator(list.size());// 逆序遍历集合while (litt.hasPrevious()) {String name = litt.previous();System.out.println(name);}}
}

3.5 比较ArrayList和LinkedList的性能

  • 增加
  • 查询

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;public class Demo05 {public static void main(String[] args) {  // 创建集合  ArrayList<String> arrayList = new ArrayList<String>();  LinkedList<String> linkedList = new LinkedList<String>();  long arrayInsertStartTime = System.currentTimeMillis();  insertData(arrayList);  long arrayInsertEndTime = System.currentTimeMillis();  System.out.println("ArrayList插入数据消耗时间:" + (arrayInsertEndTime-arrayInsertStartTime));  long linkedInsertStartTime = System.currentTimeMillis();  insertData(linkedList);  long linkedInsertEndTime = System.currentTimeMillis();  System.out.println("LinkedList插入数据消耗时间:" + (linkedInsertEndTime-			linkedInsertStartTime));  long arraySelectStartTime = System.currentTimeMillis();  selectData(arrayList);  long arraySelectEndTime = System.currentTimeMillis();  System.out.println("ArrayList查询数据消耗时间:" + (arraySelectEndTime-arraySelectStartTime));  long linkedSelectStartTime = System.currentTimeMillis();  selectData(linkedList);  long linkedSelectEndTime = System.currentTimeMillis();  System.out.println("LinkedList查询数据消耗时间:" + (linkedSelectEndTime-linkedSelectStartTime));  }  /**  * 插入数据100000条  * @param list  */  public static void insertData(List<String> list) {  for (int i = 0; i < 100000; i++) {  list.add(0,Math.random() + "");  }  }  public static void selectData(List<String> list) {  for (int i = 0; i < 100000; i++) {  list.get(list.size()/2);  }  }}

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

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

相关文章

华为智慧交通-高速公路视频云联网解决方案

华为高速公路视频云联网解决方案摘要&#xff1a; 智慧高速愿景智慧高速旨在实现人、车、路互信协同&#xff0c;提供更安全、高效、便捷的出行体验。通过全路段感知、全过程管控、全天候通行&#xff0c;以及智慧路段、服务区的建设&#xff0c;实现数字化、知识型、安全型、高…

用LangGraph搭建智能体—AI Agents in LangGraph(一)

1. 学习背景 LangGraph最近出来后如火如荼&#xff0c;最近AndrewNg又出了新鲜的学习课程&#xff0c;于是乎先了解一波。 学习地址&#xff1a;传送门 代码地址&#xff1a;传送门 废话不多说&#xff0c;开始干活。 2. 从头开始构建代理&#xff08;Build an Agent from…

ubuntu24无法网络无法连接的问题

今天使用ubuntu的最新版24.04碰见个很奇怪的问题&#xff0c;所有防火墙都是关闭的&#xff0c;但是无法访问3306端口。 通过官方文档发现&#xff0c;原来新版本引入了AppArmor&#xff0c;进行了跟高级别的安全控制&#xff0c; 使用命令aa-status查看 果然在生效 这就是为什…

厦门大学学报哲学社会科学版

《厦门大学学报&#xff08;哲学社会科学版&#xff09;》是厦门大学主办、教育部主管的高层次的哲学社会科学综合性学术刊物&#xff0c;2003年底首批入选教育部“哲学社会科学名刊工程”&#xff0c;2012年获国家社科基金学术期刊资助。 《厦门大学学报》的前身为《厦门大学…

[经验] 孙叔敖举于海,百里奚举于市的翻译 #学习方法#学习方法#微信

孙叔敖举于海,百里奚举于市的翻译 1、孙叔敖举于海 孙叔敖&#xff0c;春秋时期鲁国大夫&#xff0c;是古代中国的著名政治家和军事家&#xff0c;他被誉为“孔子之后”的大贤。 孙叔敖的主要贡献在于他的外交策略和军事管理能力。在他的领导下&#xff0c;鲁国积极扩张其疆…

前端学习(三)之CSS

一、什么是CSS html定义网页的结构和信息&#xff08;骨架血肉&#xff09;css定义网页的样式&#xff08;衣服&#xff09;js定义用户和网页的交互逻辑&#xff08;动作&#xff09; 通过CSS&#xff0c;可以指定页面中各个元素的颜色、字体、大小、间距、边框、背景等样式&…

pig4cloud启动流程

环境 SpringBoot版本&#xff1a;2.7.16 SpringSecurity版本&#xff1a;5.7.11 pig4cloud版本&#xff1a;3.7.1-JDK8 流程图 概述 pig4cloud是对SpringSecurity的实现&#xff0c;其工作原理脱离不了SpringSecurity&#xff1b;pig4cloud启动首先SecurityAutoConfigurati…

9.11和9.9哪个大?

没问题 文心一言 通义千问

【前端】JavaScript入门及实战46-50

文章目录 46 对象(1)47 对象(2)48 属性名和属性值49 基本和引用数据类型50 对象字面量 46 对象(1) <!DOCTYPE html> <html> <head> <title></title> <meta charset "utf-8"> <script type"text/javascript">/…

Puromycin(嘌呤霉素)— pac基因筛选抗生素

Puromycin是由Streptomyces alboniger&#xff08;白黑链霉菌&#xff09;产生的一种氨基糖苷类抗生素&#xff0c;可抑制原核细胞和真核细胞的肽基转移。Puromycin可抑制革兰氏阳性菌、多种动物细胞和昆虫细胞的生长&#xff0c;但是真菌和革兰氏阴性菌对Puromycin具有抗性&am…

Spring Boot外部配置加载顺序

官网地址&#xff1a; Externalized Configuration :: Spring Boot Spring Boot外部配置加载顺序 Spring Boot使用一种非常特定的PropertySource顺序设计&#xff0c;以便合理地覆盖值。后面的属性源可以覆盖前面定义的值(后面的优先级高于前面的)。属性源的考虑顺序如下&…

12.顶部带三角形的边框 CSS 关键字 currentColor

顶部带三角形的边框 创建一个在顶部带有三角形的内容容器。 使用 ::before 和 ::after 伪元素创建两个三角形。两个三角形的颜色应分别与容器的 border-color 和容器的 background-color 相同。一个三角形(::before)的 border-width 应比另一个(::after)宽 1px,以起到边框的作…

大屏系统类优质UI风格

大屏系统类优质UI风格

C 语言回调函数

回调函数的概念 您的理解是正确的。pFunCallBack 是一种函数指针类型&#xff0c;它定义了函数的签名&#xff08;即函数的参数类型和返回类型&#xff09;。当我们说 pFunCallBack pFun&#xff0c;我们是在声明一个变量 pFun&#xff0c;其类型是 pFunCallBack —— 即一个函…

暗网与深网的技术原理、应用及社会影响探究

一、引言 互联网已经成为现代社会不可或缺的一部分&#xff0c;它不仅改变了人们的生活方式&#xff0c;也深刻影响着社会的经济、政治和文化等各个领域。然而&#xff0c;在互联网的广阔领域中&#xff0c;存在着一些不为人知的部分&#xff0c;即深网和暗网。深网和暗网的出现…

PHP项目开发流程概述

PHP项目开发流程是一个系统性的过程&#xff0c;它涵盖了从项目启动到最终部署及维护的各个阶段。以下是对PHP项目开发流程的详细概述&#xff0c;并附有相关代码示例。 一、需求分析 概述&#xff1a; 需求分析是项目开发的起始点&#xff0c;主要目的是明确项目的目标、功能…

推荐4款高清稳定的远程控制软件。

远程控制软件已经在我们生活中的很多场景里都排上了用场&#xff0c;它可以帮助我们灵活办公&#xff0c;教育学习&#xff0c;游戏娱乐&#xff0c;技术支持等。如果你刚好需要远程控制设备的话&#xff0c;可以看看这4款软件&#xff0c;连接稳定高清&#xff0c;操作简单。 …

Java中的Heap(堆)(如果想知道Java中有关堆的知识点,那么只看这一篇就足够了!)

前言&#xff1a;&#xff08;Heap&#xff09;是一种特殊的完全二叉树&#xff0c;它在诸多算法中有着广泛的应用&#xff0c;本文将详细介绍Java中的堆。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 先让我们看一下本文大…

生成式人工智能落地校园与课堂的15个场景

生成式人工智能正在重塑教育行业&#xff0c;为传统教学模式带来了革命性的变化。随着AI的不断演进&#xff0c;更多令人兴奋的应用场景将逐一显现&#xff0c;为学生提供更加丰富和多元的学习体验。 尽管AI在教学中的应用越来越广泛&#xff0c;但教师们也不必担心会被完全替代…

细水长流:使用Scikit-Learn实现模型的增量预测

细水长流&#xff1a;使用Scikit-Learn实现模型的增量预测 在机器学习领域&#xff0c;增量学习是一种允许模型在新数据到来时不断更新和学习的范式。Scikit-Learn&#xff08;简称sklearn&#xff09;&#xff0c;作为Python中广受欢迎的机器学习库&#xff0c;提供了一些支持…