章六、集合(1)—— 概念、API、List 接口及实现类、集合迭代

news/2024/7/7 19:57:29

零、 关闭IDEA调试时自动隐藏空元素


一、 集合的概念


存储一个班学员信息,假定一个班容纳20名学员

        当我们需要保存一组一样(类型相同)的元素的时候,我们应该使用一个容器来存储,数组就是这样一个容器。

数组有什么缺点?

        数组一旦定义,长度将不能再变化。然而在我们的开发实践中,经常需要保存一些变长的数据集合,于是,我们需要一些能够动态增长长度的容器来保存我们的数据。

而我们需要对数据的保存的逻辑可能各种各样,于是就有了各种各样的数据结构。Java中对于各种数据结构的实现,就是我们用到的集合。

集合和数组既然都是容器,它们的区别:

        数组的长度是固定的。集合的长度是可变的。

        数组中存储的是同一类型的元素,可以存储基本数据类型值。集合存储的都是对象。而且对象的类型可以不一致。在开发中一般当对象多的时候,使用集合进行存储。

二、 集合 API


集合体系概述

        Java的集合框架是由很多接口、抽象类、具体类组成的,都位于java.util包中。

单列集合:一次放进去一个值(对象)

双列集合:键值

三、 Collection 接口


Collection 接口:定义了存取一组对象的方法,其子接口 Set 和 List 分别定义了存储方式:

        ● Set 中的数据对象不可以重复。

        ● List 中的数据对象有顺序(添加顺序)且可以重复。

四、 List 接口及实现类


  List 的实现类

List继承了Collection接口,有三个实现的类

ArrayList :数组列表,数据采用数组方式存储。

LinkedList :链表

Vector :数组列表,添加同步锁,线程安全的

  ArrayList

        • ArrayList 实现

        ArrayList实现了长度可变的数组,在内存中分配连续的空间。遍历元素和随机访问元素的效率比较高

        • ArrayList 常用方法

add(E element)   //在数组尾部添加

add(int index , E element)  //在索引处添加

get(int index)   //获得索引处的值

indexOf(Object o)    //返回指定字符在此字符串中第一次一次出现处的索引

lastIndexOf(Object o)    //返回指定字符在此字符串中最后一次出现处的索引

remove(int index)   // 删除并返回指定位置元素

set(int index, E element)    //用于替换动态数组中指定索引的元素

import java.util.ArrayList;
import java.util.Arrays;

public class ArrayListDemo1 {
    public static void main(String[] args) {
        ArrayList arrayList = new ArrayList();
        //添加元素(数组尾部)
        arrayList.add("a");
        arrayList.add(1);
        arrayList.add('b');
        arrayList.add("a");
        arrayList.add(true);
        System.out.println(arrayList);

        //在指定索引处添加元素,其他依次后移
        arrayList.add(1,"new");
        System.out.println(arrayList);

        //获得索引处的元素
        System.out.println("arrayList.get(1) = "+arrayList.get(1));

        //返回指定字符在此字符串中第一次出现处的索引
        System.out.println(arrayList.indexOf("a"));  //0
        //返回指定字符在此字符串中最后一次出现处的索引
        System.out.println(arrayList.lastIndexOf("a"));  //4

        //删除元素(单次)
        arrayList.remove("a");   //通过直接输入删除的值来删
        arrayList.remove(1);   //通过索引来删除
        System.out.println(arrayList);
        arrayList.remove("1");  //数字只能通过索引来删除
        System.out.println(arrayList);
        arrayList.remove("b");  //遇到重复相同的字符串,只会删除第一个
        System.out.println(arrayList);

        //删除元素(指定索引处),其后的依次前移
        arrayList.remove(1);
        System.out.println(arrayList);

        //替换元素(不考虑元素类型)
        arrayList.set( 1,"newNew");
        System.out.println(arrayList);

        //清空元素
        arrayList.clear();
        System.out.println(arrayList);

        //判断是否为空
        System.out.println(arrayList.isEmpty()); //true 

    }
}

         • 易错处

由于ArrayList可以存储任何类型的对象,而遍历时,会默认为Object类型,要使用子类的还要涉及向下转型,既麻烦又不可取。因而Java引入一种泛型( <E> ),用来限制可以输入的对象类型

public class ArrayList<E> extends AbstractList<E>

import java.util.ArrayList;

public class ArrayListDemo3 {
    public static void main(String[] args) {
        /*
        集合容器中默认可以添加Object类型
         */
        //但是不建议,毕竟好进去不好出来
        //因而我们使用 <>泛型 来限定输入的类型
        ArrayList<String> arrayList = new ArrayList();
        arrayList.add("a");
        //arrayList.add(1); //报错



    }
}

  LinkedList

        • LinkedList 实现

LinkedList采用链表存储方式。插入、删除元素时效率比较高

        • LinkedList 常用方法

add(int index , Object element)        //添加

addFirist(Object element)        //头添加

addLast(Object element)        //尾添加

get(int index)        //获得索引元素

removeFirst()       // 返回头元素

removeLast()        //返回尾元素

remove(int index)  //删除并返回索引的元素

getFirst()   //获得头元素

getLast()   //获得尾元素

import java.util.LinkedList;

public class LinkListDemo1 {
    public static void main(String[] args) {
        LinkedList<String> linkedList = new LinkedList<>();
        linkedList.add("a");
        linkedList.add("b");
        linkedList.add("c");
        System.out.println(linkedList);
        linkedList.add(1,"dd"); //向指定位置插入
        System.out.println(linkedList);
        //获取指定位置上的元素
        System.out.println(linkedList.get(1));

        //删除并返回是否删除成功
        System.out.println(linkedList.remove("a")); 
        System.out.println(linkedList);
        System.out.println(linkedList.pop()); //从这个列表表示的堆栈中弹出一个元素。弹出意味着移除并返回这个列表的第一个元素。
    }
}

  Vector 

 Vector 数组列表,添加同步锁,它是线程安全的

import java.util.Vector;
/*
数组列表,线程安全的
 */
public class VectorDemo {
    public static void main(String[] args) {
        Vector<String> vector = new Vector<>();
        vector.add("a");
        vector.add("b");
        vector.add("c");

    }
}

五、 List接口集合迭代


  for循环遍历

import java.util.ArrayList;
import java.util.Arrays;

public class ListTraverse {
    public static void main(String[] args) {
        ArrayList<String> arrayList = new ArrayList<>();
        arrayList.add("a");
        arrayList.add("b");
        arrayList.add("c");

        /*
        通过for循环遍历
         */
        for(int i = 0;i<arrayList.size();i++){
            System.out.println(arrayList.get(i));
        }
        System.out.println();
        //for循环时可以修改元素
        for(int i = 0;i<arrayList.size();i++){
            if("a".equals(arrayList.get(i))){
                arrayList.remove(i);
            }
            System.out.println(arrayList.get(i));
        }
        System.out.println();

    }
}

  增强for循环的遍历

import java.util.ArrayList;
import java.util.Arrays;

public class ListTraverse {
    public static void main(String[] args) {

        ArrayList<String> arrayList1 = new ArrayList<>();
        arrayList1.add("a");
        arrayList1.add("b");
        arrayList1.add("c");
        /*
        通过增强for循环遍历
         */
        for(String s:arrayList1){
            System.out.println(s);
        }
        System.out.println();
        //增强for循环时不允许修改元素
        for(String s:arrayList1){
            if(s.equals("a")){
                arrayList1.remove(s);
            }
            System.out.println(s);
        }
    }
}

        注:增强for循环遍历元素时,不允许修改元素(增添或删除)

  迭代器遍历(Iterator)

import java.util.ArrayList;
import java.util.Iterator;

public class ListTraverse1 {
    public static void main(String[] args) {
        ArrayList<String> arrayList = new ArrayList<>();
        arrayList.add("a");
        arrayList.add("b");
        arrayList.add("c");

        /*
        使用迭代器遍历
         */
        //获得集合对象的迭代器对象
        Iterator<String> it = arrayList.iterator();
        while (it.hasNext()){
            String s = it.next();//获取到下一个元素
            System.out.println(s);
        }


        ArrayList<String> arrayList1 = new ArrayList<>();
        arrayList1.add("a");
        arrayList1.add("b");
        arrayList1.add("c");
        Iterator<String> its = arrayList1.iterator();
        while (its.hasNext()){
            String s = its.next();//获取到下一个元素
            if(s.equals("a")){
                its.remove(); //使用迭代器对象删除元素
            }
            System.out.println(s);
        }

    }
}


http://lihuaxi.xjx100.cn/news/2085244.html

相关文章

python实现--分块查找

python实现–顺序查找 python实现–折半查找 python实现–分块查找 python实现B/B树 分块查找&#xff08;Block Search&#xff09;&#xff0c;也称为索引顺序查找&#xff0c;是一种结合顺序查找和索引查找思想的查找算法。它适用于线性表中数据量较大&#xff0c;但是分布不…

MySQL学习Day29——多版本并发控制

一、什么是MVCC MVCC(Multiversion concurrency control)多版本并发控制。顾名思义,MVCC是通过数据行的多个版本管理来实现数据库的并发控制。这项技术使得在InnoD8的事务隔离级别下执行一致性读操作有了保证。换言之就是为了查询一些正在被另一个事务更新的行,并且可以看到它…

01 数据结构引入 和 顺序表

阅读引言&#xff1a; 从本文开始给大家带来我在复习过程中写的数据结构的代码&#xff0c; 分享给需要的同学 一、数据结构引入 1.数据结构解决什么问题 数据结构可以将杂乱无章的数据管理起来&#xff0c; 提高数据的访问效率 计算机处理的对象&#xff08;数据&#xff09…

爬虫入门到精通_框架篇16(Scrapy框架基本使用_名人名言的抓取

1 目标站点分析 抓取网站&#xff1a;http://quotes.toscrape.com/ 主要显示了一些名人名言&#xff0c;以及作者、标签等等信息&#xff1a; 点击next&#xff0c;page变为2&#xff1a; 2 流程框架 抓取第一页&#xff1a;请求第一页的URL并得到源代码&#xff0c;进行下…

一篇搞定mysql数据库基础

目录 一、MySQL具体的特点 1.关系型数据库&#xff08;RDBMS&#xff09;&#xff1a; 2.MySQL是一个“客户端-服务器”结构的程序 Q1:服务器能不能知道客户端什么时候发请求&#xff1f;&#xff1f; Q2:服务器是只给一个客户端提供服务吗&#xff1f;&#xff1f; 二、M…

什么是智慧公厕?智慧公厕的应用价值有哪些?

在现代社会&#xff0c;城市的发展与人民生活质量息息相关。作为城市基础设施中的重要一环&#xff0c;公共厕所的建设及管理一直备受关注。智慧公厕作为一种公共厕所使用、运行、管理的综合应用解决方案&#xff0c;正逐渐在智慧城市的建设中崭露头角。那么&#xff0c;智慧公…

【Oracle之DataGuard的初步学习】

** 以下所有均是基于11G版本的 ** 一、DataGuard的部署方式 DG的部署最常用的方式就是直接在备库端部署一个空库然后再设置参数&#xff0c;但是这样做在初始同步时如果数据量过大会耗费较长的时间&#xff1b;相对来说这中方式比较简单不易出错。 还有一种方式就是通过rman的备…

[Leetcode] 904. 水果成篮 —— 滑动窗口

Problem: 904. 水果成篮 文章目录 思路解题方法复杂度Code 思路 需要找到连续的最多两种类型的最长序列 通过例子讲解思路&#xff1a;34335&#xff0c;left0&#xff0c;mid1&#xff0c;new_mid2 定义&#xff1a;现有三个下标left,mid,new_mid&#xff1b;其中left和mid分别…