Java基础——集合

2023-11-11

首先呢,给大家讲一下集合的由来:java的思想是面向对象思想,如果想统一的管理所有的对象,就涉及到用容器来储存对象,而对象数组是可以存储对象的,但是数组有一个缺点就是长度固定,为了突破这一限制 ,集合就应运而生了。

数组和集合的优缺点

长度:数组固定,集合可变;
内容:集合只能存储引用类型,数组可以存储基本类型和引用类型。

集合体系

单列集合顶层接口
Collection
	|-List有序(存入和取出顺序相同) 存入的元素可以重复 有索引 可以通过索引来操作元素
		|-ArrayList	数组结构
		|-LinkedList	链表结构
		|-Vector	数组结构
	|-Set 无序(存入和取出顺序不同) 存入的元素不可以重复
		|-HashSet	 哈希算法
		|-TreeSet	二叉树算法
双列集合
Map
	|-HashMap
	|-TreeMap
Collection

常用方法

boolean add(E e):向集合中添加元素e,添加成功返回true,添加失败返回false(List集合永远添加成功 Set集合就有可能添加失败因为Set集合会去掉重复元素)
boolean remove(Object o):删除集合中的元素o,删除成功则true,删除失败则false
void clear():清空集合里面的元素
boolean contains(Object o):集合是否包含元素o,如果包含返回true,如果不包含返回false
boolean isEmpty():判断集合是否为空
int size():集合的长度
集合的长度:c.size();
字符串长度:s.length();
数组的长度:arr.length;

代码演示:

public static void main(String[] args) {
    Collection c = new ArrayList();		//父类引用指向子类对象
    boolean b1 = c.add("abc");			//添加一个字符串
    boolean b2 = c.add(true);			//自动装箱new Boolean(true);
    boolean b3 = c.add(100);			//自动装箱new Integer(100);
    boolean b4 = c.add(new Student("张三",23));	//添加一个自定义对象	
    boolean b5 = c.add("abc");			//添加一个重复的字符串

    System.out.println(b1);		//true
    System.out.println(b2);		//true
    System.out.println(b3);		//true
    System.out.println(b4);		//true
    System.out.println(b5);		//true

    System.out.println(c);//[abc, true, 100, Student [name=张三, age=23], abc]  
    //ArrayList的父类重写了Object的toString()

    Collection c1 = new ArrayList();		//父类引用指向子类对象		
    c1.add("a");
    c1.add("b");
    c1.add("c");
    c1.add("d");

    c1.remove("b");					//删除指定元素
    System.out.println(c1);				//[a, c, d]

    System.out.println(c1.contains("b"));		//false  判断是否包含
    System.out.println(c1.contains("c"));		//true  判断是否包含

    System.out.println(c1.size()); 			//3  长度为3 

    System.out.println(c1.isEmpty());		//false  不为空

    c1.clear();					//清空集合										//清空集合
    System.out.println(c1);				//[]
}

Object[] toArray():集合转数组 (可以用来遍历)

代码演示:

public static void main(String[] args) {
    Collection c = new ArrayList();
    c.add(new Student("张三", 23));		//自动类型提升:Object obj = new Student("张三",23);
    c.add(new Student("李四", 24));
    c.add(new Student("王五", 25));
    c.add(new Student("赵六", 26));

    Object[] arr = c.toArray();		//将集合转换成数组
    for (int i = 0; i < arr.length; i++) {
        Student s = (Student)arr[i];	//向下转型
        System.out.println(s.getName() + "..." + s.getAge());
    }
}

不常用的带All的方法

boolean addAll(Collection c):添加 c里面的所有元素
boolean removeAll(Collection c):删除交集
boolean containsAll(Collection c):是否全部包含
boolean retainAll(Collection<?> c):取交集

迭代器 Iterator

迭代器的原理

Iterator是个接口,是通过集合里面的内部类实现的。迭代器是对集合进行遍历,而每一个集合内部的存储结构都是不同的,所以每一个集合存和取都是不一样,那么就需要在每一个类中定义hasNext()和next()方法。这样做是可以的,但是会让整个集合体系过于臃肿,迭代器是将这样的方法向上抽取出接口,然后在每个类的内部定义自己迭代方式,这样做的好处有二:第一、规定了整个集合体系的遍历方式都是hasNext()和next()方法;第二、代码有底层内部实现,使用者不用管怎么实现的,会用即可。

代码演示:

public static void main(String[] args) {
	Collection c = new ArrayList();
	c.add(new Student("张三", 23));		//Object obj = new Student("张三",23);
	c.add(new Student("李四", 24));
	c.add(new Student("王五", 25));
	c.add(new Student("赵六", 26));
		
	//获取迭代器
	Iterator it = c.iterator();
	while(it.hasNext()) {
        System.out.println(((Student)it.next()).getName()+"  "+
					((Student)it.next()).getAge());//如果这样写的话  打印结果为  zhangsan  14 并且报错java.util.NoSuchElementException 因为next()方法调用一次,指针就往后走一次
        
		Student s = (Student)it.next();	//所以一般while循环里面 就出现一次next(),如果想使用多次 请用一个变量接受next()方法的返回值 
		System.out.println(s.getName()+"  "+s.getAge());
	}
}
List接口

List的特有方法

void add(int index,E element);在指定的index位置插入element元素
E remove(int index);删除index位置上的元素
E get(int index);获取指定index位置上的元素。可以用来遍历List集合,而且这种遍历方式是List特有的遍历方式
E set(int index,E element);把集合中index位置上的元素用element元素替换

concurrentModificationException:并发修改异常

原因:在用迭代器遍历集合的时候,我们通过集合改变了元素,而迭代器是通过集合得到的,集合发生了改变,而迭代器还是通过原来的集合得到的,所以产生了并发修改异常。
解决:

  1. 通过迭代器遍历集合的时候,我们通过迭代器来改变集合元素,而这时候原来Iterator没有添加元素的方法,所以就用ListIterator,因为ListIterator里面有add方法
  2. 通过普通for循环来遍历集合的时候,用集合来改变元素

代码演示:

public static void main(String[] args) {
    List list = new ArrayList();
    list.add("a");				//Object obj = new String();
    list.add("b");
    list.add("world");
    list.add("c");
    list.add("d");
    list.add("e");

    //报并发修改异常原因:
    Iterator it = list.iterator();	//获取迭代器
    while(it.hasNext()) {			//判断集合中是否有元素
        String str = (String)it.next();	//向下转型
        if("world".equals(str)) {
            //遍历的同时在用集合调用add方法增加元素,并发修改ConcurrentModificationException
            list.add("javaee");	
        }
    }

    //解决方案一
    ListIterator lit = list.listIterator();//获取迭代器(List集合特有的)可以通过hasPrevious()和previous()来往前遍历
    while(lit.hasNext()) {
        String str = (String)lit.next();//向下转型
        if("world".equals(str)) {
            lit.add("javaee");	//遍历的同时用迭代器调用add方法添加元素就没问题
        }
    }

    //解决方案二
    for (int i = 0; i < list.size(); i++) {	//通过普通for循环来遍历集合的时候,用集合来改变元素
        String str = (String)list.get(i);
        if("world".equals(str)){
            list.add("javaee");
        }
    }

    System.out.println(list);
}
ArrayList

基本上都是从List实现的方法,因此没有特有的方法。
案例:ArrayList去除集合中字符串的重复值(字符串的内容相同)

public static void main(String[] args) {
	ArrayList list = new ArrayList();
	list.add("a");
	list.add("a");
	list.add("b");
	list.add("b");
	list.add("c");
	list.add("c");
	list.add("c");
	list.add("c");
		
	ArrayList newList = getSingle(list);
	System.out.println(newList);
}
/*
* 分析:
* 1,创建新集合
* 2,根据传入的集合(老集合)获取迭代器
* 3,遍历老集合
* 4,通过新集合判断是否包含老集合中的元素,如果包含就不添加,如果不包含就添加
*/
public static ArrayList getSingle(ArrayList list) {
    ArrayList newList = new ArrayList<>();		//1,创建新集合
    Iterator it = list.iterator();			//2,根据传入的集合(老集合)获取迭代器

    while(it.hasNext()) {				//3,遍历老集合
        Object obj = it.next();			//记录住每一个元素
        if(!newList.contains(obj)) {	//如果新集合中不包含老集合中的元素
            newList.add(obj);			//将该元素添加
        }
    }
    return newList;
}
LinkedList

public void addFirst(E e)将指定元素插入此列表的开头。
public void addLast(E e)将指定元素添加到此列表的结尾。
public E removeFirst()移除并返回此列表的第一个元素。
public E removeLast()移除并返回此列表的最后一个元素。
public E getFirst()返回此列表的第一个元素。
public E getLast()返回此列表的最后一个元素。

代码演示:

public static void main(String[] args) {
    LinkedList list = new LinkedList();
    list.addFirst("a");
    list.addFirst("b");
    list.addFirst("c");
    list.addFirst("d");
    list.addLast("e");
    System.out.println(list.getFirst());	//d
    System.out.println(list.getLast());	//e
    System.out.println(list.removeFirst());	//d
    System.out.println(list.removeLast());	//e
    System.out.println(list);		//[c, b, a]
}

栈和队列:
栈: 先进后出
队列: 先进先出

Vector

jdk1.0出现1.2并入到List体系,后来被ArrayList替代,所以了解即可。

附:
数组结构:查询快 增删慢
链表结构:查询慢 增删快

List的三个儿子的特点
ArrayList:查询快 增删慢 不安全 效率高
LinkedList:查询慢 增删快 不安全 效率高
Vector:查询快 增删慢 安全 效率低

好了集合部分就先说到这了,想了解更多学习知识,请关注微信公众号“阿Q说代码”,获取更多学习资料吧!你也可以后台留言说出你的疑惑,阿Q将会在后期的文章中为你解答。每天学习一点点,每天进步一点点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java基础——集合 的相关文章

  • 使用 ArrayList 将文本文件拆分并存储到数组中

    我一直在开发一个测验应用程序 它使用文本文件来存储问题 问题的格式如下 QUESTION CHOICE A CHOICE B CHOICE C CHOICE D ANSWER 我希望它读取每一行并将其分成 6 个不同的部分 作为分割字符串并
  • 使用 c:foreach (JSP/JSTL) 迭代 ArrayList,变量不起作用

    我知道 关于我的问题有无数的例子 但我经历了很多 但无法弄清楚我的错误在哪里 我正在迭代 ArrayList TestSzenario TestSzenario 类包含一个名为 name 的字符串变量 具有适当的 getter 和 sett
  • 在 for 循环中重新创建 ArrayList 的最快方法

    在Java中 对一个巨大的矩阵X使用以下函数来打印其列不同的元素 create the list of distinct values List
  • 长数组列表渲染使 Angular.js 中的页面滚动变慢

    当尝试从数组 带有图像 渲染超过 120 个项目时滚动列表的速度变慢 基本上 当我在无限滚动中加载新数据时 我会将旧数组数据与新数组数据连接起来 另一方面 像 dribbble behance 这样的流行网站似乎没有这个问题 也许这个问题是
  • 如何在没有 JSTL 的情况下迭代 JSP 上的数组列表

    我已从 MySQL 检索结果并创建了数组列表用户 我已发送此 US er 数组列表并通过请求响应对象发送它 现在我需要在 JSP 页面上显示它 1 没有JSTL 2 使用JSTL 表名是user reg 有四个字段id username p
  • 我将如何评估某个公式?

    我有一个多维数组列表 我向用户询问一个公式 然后我对其进行评估 问题是我得到这样的用户输入 a1 a2 12 a3 问题是 a1 a2 和 a3 指的是列 我必须将其评估为一定的值 我完全不知道如何解决这个问题 任何建议或指导都会很棒 此外
  • Java - 按步骤切片任何数组

    在 python 中 我们可以执行以下操作 array 0 1 2 3 4 5 6 7 8 9 10 new array array 3 print new array gt gt gt 0 3 6 9 Java中有类似的东西吗 我一直在寻
  • required java.util.ArrayList,found java.lang.Object :我不明白此错误的原因

    以下是 jsp 页面的一些片段
  • 获取ArrayList中重复项的数量

    例如 假设我有一个ArrayList可能包含以下值 x x x y y 现在我想要检索的是x and x我希望能够区分我所拥有的x or y因为实际上 我可以在 ArrayList 中拥有任何对象 并且我必须能够区分它们 我想做的是首先转换
  • ArrayList 是如何工作的?

    ArrayList内部使用什么数据结构 内部有一个ArrayList使用一个Object 当您将项目添加到ArrayList 列表检查后备阵列是否还有剩余空间 如果有空间 新项目将添加到下一个空白处 如果没有空间 则会创建一个更大的新数组
  • Java ArrayList 和 LinkedList - 在末尾添加元素实现细节

    我对为什么 arraylist 比链表更快的理解是 使用 arraylist 基本上只需要一个操作 更新末尾数组元素的引用 而使用链表你必须做更多的事情 例如创建一个新节点 更新 2 个引用 遍历链表并更新最后一个节点以指向新节点等 但是我
  • Java 中的 ArrayList 和多线程

    在什么情况下 不同步的集合 例如 ArrayList 会导致问题 我想不出任何问题 有人可以给我一个 ArrayList 导致问题而 Vector 解决问题的例子吗 我编写了一个程序 有 2 个线程都修改一个包含一个元素的数组列表 一个线程
  • 如何对arraylist进行一系列排序操作(多个排序条件)

    我有一个对象数组列表 我想在此列表上运行一系列排序操作 例如 我想首先按名称对它们进行排序 如果两个名称相同 则按 id 对它们进行排序 我怎样才能实现它 这是我的代码 Comparator
  • 添加到 ArrayList 时出现 Java NullPointerException?

    我的代码抛出 NullPointerException 即使该对象似乎正确存在 public class IrregularPolygon private ArrayList
  • Java ArrayList 复制

    我有一个ArrayList l1大小为 10 我指定l1到新列表引用类型l2 Will l1 and l2指向相同ArrayList目的 或者是副本ArrayList对象分配给l2 当使用l2参考 如果我更新列表对象 它会反映l1参考类型也
  • 如何从 php 中的值数组中对特定字符串进行排序?

    array array 2011 September 38 2011 June 4 2010 November 9 2011 November 29 2010 December 19 我想按如下方式对这个数组字符串进行排序 它应该首先对年份
  • 尝试让 GUI 使用 arrayList 在牌组中打印随机卡

    所以我目前正在用java开发一个卡牌战争游戏 我试图让 GUI 屏幕使用 arrayList 从一组卡片图像中打印 2 张随机卡片 必须使用它进行分配 卡片图像文件名为 1 png 2 png 52 png 并存储在 image card
  • 我想在Java中使用关于随机索引的索引

    我使用Java 当我在Java中使用ArrayList时 如果我随机访问索引号 这可能吗 如果这是不可能的 我应该怎么做 例如 ArrayList
  • 如何避免 ArrayIndexOutOfBoundsException 或 IndexOutOfBoundsException? [复制]

    这个问题在这里已经有答案了 如果你的问题是我得到了java lang ArrayIndexOutOfBoundsException在我的代码中 我不明白为什么会发生这种情况 这意味着什么以及如何避免它 这应该是最全面的典范 https me
  • Java中HashMap和ArrayList的区别?

    在爪哇 ArrayList and HashMap被用作集合 但我不明白我们应该在哪些情况下使用ArrayList以及使用时间HashMap 他们两者之间的主要区别是什么 您具体询问的是 ArrayList 和 HashMap 但我认为要完

随机推荐

  • mysql数据库的内部结构说明

    记住 表才是存放数据的基本单元 结论 Mysql数据底层由多个database组成 每一个database存放多张表
  • 【记录】在NAS上部署git文章汇总(网址)

    1 https blog csdn net mtclz3 article details 87461470 2 https blog csdn net u014213012 article details 65631261 3 https
  • git常用操作命令总结

    本篇文章主要收集记录git常用命令
  • Keil编程中Source Brower : "P17" is undefined!的问题

    博客原文 Keil编程中Source Brower P17 is undefined 的问题 在Keil新建工程中经常会遇到一个问题 去看某一个变量定义 然后跳转不过去 并提示Source Brower 某某 is undefined 在这
  • 嵌入式VSCode+gdbserver图形化调试环境搭建与使用

    目录 一 原理 二 环境搭建 1 VSCode设置 2 gdbserver安装 三 调试过程 一 原理 嵌入式系统中一般在 PC端运行 gdb工具 源码也是在 PC端 源码对应的可执行文件放到开发板中运行 为此我们需要在开发板中运行 gdb
  • 数据库分库分表

    一 为什么要分库分表 如果一个网站业务快速发展 那这个网站流量也会增加 数据的压力也会随之而来 比如电商系统来说双十一大促对订单数据压力很大 Tps十几万并发量 如果传统的架构 一主多从 主库容量肯定无法满足这么高的Tps 业务越来越大 单
  • Linux下Socket编程

    什么是Socket Socket接口是TCP IP网络的API Socket接口定义了许多函数或例程 程式员能够用他们来研发TCP IP网络上的应用程式 要学Internet上的TCP IP网络编程 必须理解Socket接口 Socket接
  • 七. Kubernetes Objects对象,对象状态与yaml

    目录 一 基础概念理解 二 k8s 对象中的spec与status 三 如何编写yaml 一 基础概念理解 Kubernetes Objects 官方地址 在k8s中所有操作资源实体都可以称为对象 先下图中的这些 都可以称为对象 不同对象功
  • 汇编语言随笔(10)-内中断及实验12(返回到dos的中断处理程序)

    不同类型内中断的区分 中断类型码 8086cpu中在下面4种情况下会产生内中断 1 除法错误 如之前提到的除法溢出 2 单步执行 3 执行into指令 4 执行int指令 那么当内中断发生时cpu如何来区分到底是哪种中断源呢 通过中断类型码
  • 代码随想录训练营day9

    题目一 实现strStr 力扣题目链接 题目描述 给你两个字符串 haystack 和 needle 请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标 下标从 0 开始 如果 needle 不是 haysta
  • GLSL的in、out存储限制符使用错误

    在GLSL中用in修饰的变量表示传入的数据 用out修饰的变量表示传出的数据 通过这样可以实现顶点着色器向片段着色器传递数据 但要注意这个变量的命名要相同 不相同的话 片段着色器是获取不到从顶点着色器传入的数据的 1 顶点着色器 versi
  • unity打包技巧

    打包准备 1 android 需要jdk 和android sdk 如果有使用C 的库 还需要NDK 只有将 so文件放在 Assets Plugins Android libs下 Unity才会将 so文件识别为共享库 并在打包时将之拷贝
  • 分布式事务-seata AT模式-强一致性。

    目录 1 seata原理 2 关键组件 3 seate服务端参数 4 微服务配置 5 业务流程 6 依次启动eureka seate服务器 微服务 1 seata原理 Seata 是一款开源的分布式事务解决方案 致力于提供高性能和简单易用的
  • element-ui 表格一行显示多行内容并实现多行内某一行列合并

    这是加上边框的 去掉边框后这个表格看着更明显一点 表格一行放多行内容 并让第二行进行列合并 第一行不合并
  • 详解数据结构之顺序栈的基本操作(C语言描述)

    1 栈是线性表的特例 因此栈的顺序存储其实也就是线性表顺序存储的简化 我们称之为顺序栈 线性表是采用数组来实现的 因此顺序栈也采用数组来实现 2 栈的结构定义 elementype类型根据实际情况而定 这里假设为int类型 栈的结构体定义为
  • 时间序列ARIMA滚动预测

    什么是时间序列 时间序列简单的说就是各时间点上形成的数值序列 时间序列分析就是通过观察历史数据预测未来的值 在这里需要强调一点的是 时间序列分析并不是关于时间的回归 它主要是研究自身的变化规律的 这里不考虑含外生变量的时间序列 为什么用py
  • C语言结构体struct的比较

    两个struct结构体进行比较 首先不能直接比较 struct A a b a和b相比是错误的 其次不能进行内存比较 如下 程序运行的结果会如何 void DiffStructWithMultiVar struct A a 0 struct
  • 远程连接身份验证错误,找不到加密Oracle修正(正解)

    出现问题 使用远程连接弹出一个对话框 提示 发生身份验证错误 要求的函数不受支持 方法一 win r 输入gpedit msc 找到下面路径 策略路径 计算机配置 gt 管理模板 gt 系统 gt 凭据分配 设置名称 加密 Oracle 修
  • 图像质量评估

    图像质量评估 http jingyan baidu com article cbf0e500f5505a2eab28936e html 客观评价方法 图像质量的客观评价方法是根据人眼的主观视觉系统建立数学模型 并通过具体的公式计算图像的质量
  • Java基础——集合

    首先呢 给大家讲一下集合的由来 java的思想是面向对象思想 如果想统一的管理所有的对象 就涉及到用容器来储存对象 而对象数组是可以存储对象的 但是数组有一个缺点就是长度固定 为了突破这一限制 集合就应运而生了 数组和集合的优缺点 长度 数