JAVA全栈开发 day14_集合(Collection\List接口、数据结构、泛型)

news2025/1/12 3:54:08

一、数组

数组是一个容器,可以存入相同类型的多个数据元素。

  • 数组局限性:

    ​ 长度固定:(添加–扩容, 删除-缩容)

    ​ 类型是一致的

对象数组 :

int[] arr = new int[5];

Student[] arr = new Student[5];

  Student[] arr = new Student[3];

        Student stu = new Student("张三",18);
        Student stu2 = new Student("李四",28);
        Student stu3= new Student("王老吉",38);

        arr[0] = stu;
        arr[1] = stu2;
        arr[2] = stu3;

        System.out.println(arr[0].name);
  //Object类型的数组,可以存放任意引用类型, 如果是基本类型,会自动装箱
        Object[] obj = new Object[5];
        obj[0] = new Student("赵四",18);
        obj[1] = new Teacher("杨老师",18);
        obj[2] = "abc";
        obj[3] = 111;
        obj[4] = true;

在这里插入图片描述

二、集合

  • 集合:集合是java中提供的一种容器,可以用来存储多个数据。

  • 特点: 长度不固定,还可以存储不同的数据(但是一般都用同一类型)

集合和数组既然都是容器,它们有啥区别呢?

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

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

1.集合的体系

在这里插入图片描述

2.Collection 常用的方法

2.1基本功能

  • public boolean add(E e): 把给定的对象添加到当前集合中 。
  • public void clear() :清空集合中所有的元素。
  • public boolean remove(E e): 把给定的对象在当前集合中删除。
  • public boolean contains(E e): 判断当前集合中是否包含给定的对象。
  • public boolean isEmpty(): 判断当前集合是否为空。
  • public int size(): 返回集合中元素的个数。
  • public Object[] toArray(): 把集合中的元素,存储到数组中。

2.2高级功能

  • boolean addAll(Collection<? extends E> c) 添加一个集合到当前集合
  • boolean removeAll(Collection<?> c) 移除一个集合元素
  • boolean retainAll(Collection<?> c) 两个集合都有的元素,思考元素去哪里?boolean又是什么意思?
  • boolean containsAll(Collection<?> c) 判断当前集合是否包含指定集合的元素 一个还是所有?

2.3集合的遍历

 public static void main(String[] args) {
        Collection c = new ArrayList();
        c.add("hello");
        c.add("java");
        c.add("collection");

        //遍历集合
        Object[] arr = c.toArray();
       //String -> Object
        for(int i=0;i<arr.length;i++){
            String s = (String)arr[i];
            System.out.println(s);
        }
    }

3.Iterator 迭代器

3.1迭代器的介绍

专门为集合提供遍历的一种技术

3.2迭代器的怎么使用

 Collection c = new ArrayList();
        Student student = new Student("张三",18);
        Student student2 = new Student("李四",28);
        Student student3 = new Student("王老吉",38);

        c.add(student);
        c.add(student2);
        c.add(student3);

        Iterator iterator = c.iterator();
        while (iterator.hasNext()){
            Student s = (Student) iterator.next();
            System.out.println(s);
        }

3.3迭代器的原理

在这里插入图片描述

三、数据结构

  • 数据结构的有什么用?

    数据结构:研究数据的存储

当你用着java里面的容器类很爽的时候,你有没有想过,怎么ArrayList就像一个无限扩充的数组,也好像链表之类的。好用吗?好用,这就是数据结构的用处,只不过你在不知不觉中使用了。

现实世界的存储,我们使用的工具和建模。每种数据结构有自己的优点和缺点,想想如果Google的数据用的是数组的存储,我们还能方便地查询到所需要的数据吗?而算法,在这么多的数据中如何做到最快的插入,查找,删除,也是在追求更快。

我们java是面向对象的语言,就好似自动档轿车,C语言好似手动档吉普。数据结构呢?是变速箱的工作原理。你完全可以不知道变速箱怎样工作,就把自动档的车子从 A点 开到 B点,而且未必就比懂得的人慢。写程序这件事,和开车一样,经验可以起到很大作用,但如果你不知道底层是怎么工作的,就永远只能开车,既不会修车,也不能造车。当然了,数据结构内容比较多,细细的学起来也是相对费功夫的,不可能达到一蹴而就。我们将常见的数据结构:堆栈、队列、数组、链表和红黑树 这几种给大家介绍一下,作为数据结构的入门,了解一下它们的特点即可。

1.常见的数据结构

数据存储的常用结构有:栈、队列、数组、链表和红黑树。我们分别来了解一下:

2.栈,队列

在这里插入图片描述

3.数组与链表

  • 数组: 利于查询 ,不利于增删改

  • 链表:不利于查询 ,利于增删改

    (根据需求,选择对应的数据形式,进行存储)

在这里插入图片描述

四、List 接口的方法

  • void add(int index, E element)

  • Object get(int index)

  • ListIterator listIterator()
    返回列表中的列表迭代器(按适当的顺序)。

  • Object set(int index, E element)
    用指定的元素(可选操作)替换此列表中指定位置的元素。

  • ListIterator listIterator() : 此方法重要;不但可以正向还可以反向,还可以进行添加和修改

在迭代器在迭代元素时,用集合去操作,出现以下的异常:

ConcurrentModificationException 并发修改异常

  • 解决方法
    ​ 迭代器在进行迭代元素时,就用迭代器去修改(包括添加)
    ​ 集合遍历元素时,就用集合去修改

1.List 子类特点

ArrayList类

​         底层数组 : 查询快,增删改慢

​         线程不安全: 不安全,效率高

Vecktor类

​         底层数组 : 查询快,增删改慢

​         线程安全: 安全,效率低

LinkedList类

​        底层链表 : 查询慢,增删改快

​         线程不安全: 不安全,效率高


以上子类的选择,根据项目的需要来做 (看情况)

2.AarryList的方法使用

四种遍历

ArrayList list = new ArrayList();
        list.add("hello");
        list.add("world");
        list.add("java");

        //数组
        Object[] arr  = list.toArray();
        for(int i=0; i<arr.length;i++){
            String s = (String)arr[i];
            System.out.println(arr[i]);
        }
        //迭代器
        Iterator iterator = list.iterator();
          while (iterator.hasNext()){
              System.out.println(iterator.next());
          }
        //列表迭代器
        ListIterator listIterator = list.listIterator();
        while (listIterator.hasNext()){
            System.out.println(listIterator.next());
        }
        //size  get()
        for(int i=0; i<list.size();i++){
            String s = (String)list.get(i);
            System.out.println(arr[i]);
        }

3.Vector类特有方法

  • addElement(E obj)
    将指定的组件添加到此向量的末尾,将其大小增加1。

  • elementAt(int index)
    返回指定索引处的组件。

  • elements()
    返回此向量的组件的枚举。

  • firstElement()
    返回此向量的第一个组件(索引号为 0的项目)。

JDK升级原因:

  1. 效率
  2. 简化书写
  3. 安全
  /*
        * Vector类特有的方法
        * addElement(E obj) 将指定的组件添加到此向量的末尾,将其大小增加1。   add()
          elementAt(int index)返回指定索引处的组件。   get()
          elements() 返回此向量的组件的枚举。           iterator
                 hasMoreElements()                    hasNext()
                nextElement()                         next()
            firstElement() 返回此向量的第一个组件(索引号为 0的项目)。
        * */
        Vector vector = new Vector();
        vector.addElement("hello");
        vector.addElement("world");
        vector.addElement("java");

//        for(int i=0;i<vector.size();i++){
//            System.out.println(vector.elementAt(i));
//        }
//        System.out.println(vector.firstElement());

        Enumeration enumeration = vector.elements();
        while (enumeration.hasMoreElements()){
            System.out.println(enumeration.nextElement());
        }

4.LinkedList类特有的方法

  • addFirst(E e)
    在该列表开头插入指定的元素。

  • addLast(E e)
    将指定的元素追加到此列表的末尾。

五、泛型

  • 泛型: 是一种把类型明确的工作推迟到创建对象或者调用方法的时候,才去明确的特殊类型, 参数化类型,把类型当做参数一样进行传递

  • 格式:
    <数据类型>
    此处数据类型只能是引用类型

  • 好处:

    1. 把运行时报的错误,提前到了编译期间
    2. 避免了强制转换
    3. 优化程序的设计,解决了黄色警告线

1.泛型的应用:

1.1类上定义泛型

   public class ObjectTool<T> {
       private T obj;
   
       public T getObj() {
           return obj;
       }
   
       public void setObj(T obj) {
           this.obj = obj;
       }
   }

1.2方法上定义泛型

在方法中定义泛型,相当于可以传任意类型的参数

    public <T> void show(T t){
         System.out.println(t);
     }

1.3接口上定义泛型

  • 方法1
 class MyListImpl implements MyList<String>{
    @Override
    public void show(String s) {
        
    }
}
  • 方法2
 class MyListImpl<T> implements MyList<T>{
    @Override
    public void show(T s) {
        
    }
}

2.泛型通配符

<?> : 任意类型 <? extends E> : 向下限定 , E及子类 <? supter E > : 向上限定 , E及父类 # 六、作业: 1.ArrayList去重复(新建集合,不新建集合); 2.用 LinkedList 类去模拟一个栈的集合类(add 方法,取方法 -- 先进后出) 3.使用Collection , ArrayList ,LinkedList, Vecktor 实现字符串集合的遍历 ,实现自定义对象的遍历 4.代码题 某中学有若干学生(学生对象放在一个List中),每个学生有一个姓名属性、年龄属性(int)、班级名称属性(String)和考试成绩属性(int), 某次考试结束后,每个学生都获得了一个考试成绩。请打印出所有学生分数总和,和平均年龄 # 七、面试题 ## 第一题:**List a=new ArrayList() 和 ArrayList a =new ArrayList()的区别?** ``` List list = new ArrayList(); 这句创建了一个 ArrayList 的对象后把上溯到了 List。此时它是一个List对象了,有些ArrayList 有但是 List 没有的属性和方法,它就不能再用了。 ArrayList list=new ArrayList(); 创建一对象则保留了ArrayList 的所有属性。所以需要用到 ArrayList 独有的方法的时候不能用前者。实例代码如下: List list = new ArrayList(); ArrayList arrayList = new ArrayList(); list.trimToSize(); //错误,没有该方法。 arrayList.trimToSize(); //ArrayList里有该方法。 ``` ## 第二题:**说一下ArrayList的扩容机制** ``` (1)带初始容量参数的构造函数,用户可以自己定义容量 (2)默认构造函数,使用初始容量10构造一个空列表(无参数构造) (3)构造包含指定collection元素的列表,这些元素利用该集合的迭代器按顺序返回 首先获取数组的旧容量,然后计算新容量的值,计算使用位运算,将其扩容至原来的1.5倍。 得到新容量的值后,校验扩容后的容量是否大于需要的容量,如果小于,则把最小需要容量当作扩容后的新容量。并确保扩容后的容量不超过数组能设置的最大大小值。 最后将老数组的数据复制到新的数组中。 ``` ## 第三题:Vector和ArrayList以及LinkedList区别和联系,以及分别的应用场景? Vector的底层的实现其实是一个数组,是线程安全的实现类,方法都有**synchronized** LinkedList的底层其实是一个**双向链表**,每一个对象都是一个Node节点,Node就是一个静态内部类,它是**线程不安全的,**所有的方法都没有加锁或者进行同步 这里先简单介绍一下,下面会对**ArrayList**的扩容机制进行分析 ArrayList是**线程不安全**的,如果不指定它的初始容量,那么它的初**始容量是0**,当**第一次**进行添加操作的时候它的容量将**扩容为10** **三种集合的使用场景** 1. Vector很少用,有其他线程安全的List集合 2. 如果需要大量的添加和删除则可以选择LinkedList 原因是:它查询的时候需要遍历整个链表,插入和删除的时候无需移动节点 3. 如果需要大量的查询和修改则可以选择ArrayList 原因:底层为数组,删除和插入需要移动其他元素,查询的时候根据下标来查 ## 第四题:我们想要使用线程安全的List集合,你有什么办法? 1:可以使用Vector 2.自己重写类似于ArrayList的但是线程安全的集合 3.可以使用**Collections(工具类)**中的方法,将ArrayList变成一个线程安全的集合 **4.可以使用java.util.concurrent包下的CopyOnWriteArrayList,它是线程安全的** ## 第五题:**那你说说CopyOnWriteArrayList是怎么实现线程安全的?** 它是juc包下的,专门用于并发编程的,他的设计思想是:**读写分离**,**最终一致,写时复制** **它不能指定容量,初始容量是0.它底层也是一个数组,集合有多大,底层数组就有多大,不会有多余的空间** **CopyOnWriteArrayList的缺点** 底层是数组,删除插入的效率不高,写的时候需要复制,占用内存,浪费空间,如果集合足够大的时候容易触发GC 数据一致性问题。CopyOnWrite容器只能保证数据的最终一致性,不能保证数据的实时一致性。所以如果你希望写入的的数据,马上能读到,请不要使用CopyOnWrite容器。【当执行add或remove操作没完成时,get获取的仍然是旧数组的元素】。CopyOnWriteArrayList读取时不加锁只是写入和删除时加锁 应用场景:读操作远大于写操作的时候 **CopyOnWriteArrayList和Collections.synchronizedList区别** CopyOnWriteArrayList和Collections.synchronizedList是实现线程安全的列表的两种方式。两种实现方式分别针对不同情况有不同的性能表现,其中CopyOnWriteArrayList的写操作性能较差,而多线程的读操作性能较好。而Collections.synchronizedList的写操作性能比CopyOnWriteArrayList在多线程操作的情况下要好很多,而读操作因为是采用了synchronized关键字的方式,其读操作性能并不如CopyOnWriteArrayList。因此在不同的应用场景下,应该选择不同的多线程安全实现类。

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

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

相关文章

分享88个清新唯美PPT,总有一款适合您

分享88个清新唯美PPT&#xff0c;总有一款适合您 88个清新唯美PPT下载链接&#xff1a;https://pan.baidu.com/s/1XUUjxjmWFw2fJKENjk6_Yg?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整…

【亚马逊云科技】re:Invent 2023 | Amazon Q王炸产品震撼来袭

re:Invent 2023前沿资讯快速入口➡️&#xff1a;2023亚马逊云科技reinvent大会&#xff0c;与开发者一起构建未来&#xff01; 文章目录 一、2023 亚马逊云科技 re:Invent 精彩内容速递&#x1f3a8;二、Amazon Q 震撼来袭2.1 什么是Amazon Q&#xff1f;2.2 Amazon Q功能介绍…

OpenHarmony 关闭息屏方式总结

前言 OpenHarmony源码版本&#xff1a;4.0release 开发板&#xff1a;DAYU / rk3568 一、通过修改系统源码实现不息屏 修改目录&#xff1a;base/powermgr/power_manager/services/native/profile/power_mode_config.xml 通过文件中的提示可以知道DisplayOffTime表示息屏的…

wordpress安装之Linux ftp传输

工欲善其事,必先利其器。 最近准备在自己的服务器上搭建一个个人技术分享的平台。 因为我发现现在网络上的工具呀&#xff0c;还有一些问题的解答总是模棱两可&#xff0c;所以我打算自己做一个。 首先呢&#xff0c;我们需要有一个linxu的系统当服务器&#xff0c;然后呢&a…

d3dcompiler_47.dll缺失怎么修复?一招搞定电脑弹窗问题

在计算机使用过程中&#xff0c;我们常常会遇到一些错误提示&#xff0c;其中之一就是“d3dcompiler_47.dll缺失”。这个错误通常出现在游戏或应用程序运行时&#xff0c;它会导致程序无法正常启动或运行。为了解决这个问题&#xff0c;我们需要采取一些措施来修复缺失的文件。…

带米勒钳位的隔离驱动SiLM5350系列 工作原理、特性参数、封装形式

带米勒钳位的隔离驱动SiLM5350系列 单通道 30V&#xff0c;10A 带米勒钳位的隔离驱动 具有驱动电流更大、传输延时更低、抗干扰能力更强、封装体积更小等优势, 为提高电源转换效率、安全性和可靠性提供理想之选。 描述&#xff1a; SiLM5350系列是单通道隔离驱动器&#xff0…

2023年中国数据要素市场研究报告

第一章 概况 1.1 定义 中国数据要素交易市场是一个多层次、多维度的复杂体系&#xff0c;涵盖了不同的交易方式、市场类型和行业应用。数据要素作为一种新兴的生产要素&#xff0c;涉及社会经营活动中所有可以电子化记录、为使用者或所有者带来经济效益的数据资源。 在狭义上…

图片点击放大

在列表中添加插槽 <template slot-scope"scope">&#xff0c;获取当前点击的数据 在图片中添加点击事件的方法&#xff0c;用来弹出窗口 <vxe-columnfield"icon"title"等级图标"><template slot-scope"scope"><…

基于若依的ruoyi-nbcio流程管理系统仿钉钉流程初步完成转bpmn设计(还有bug,以后再修改)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 今天初步完成仿钉钉流程转bpmn设计的工作&#xff0c;当然还有不少bug&#xff0c;以后有需要或者网友也帮…

【android开发-01】android中toast的用法介绍

1&#xff0c;android中toast的作用 在Android开发中&#xff0c;Toast是一种用于向用户显示简短消息的轻量级对话框。它通常用于向用户提供一些即时的反馈信息&#xff0c;例如操作结果、提示或警告。 Toast的主要作用如下&#xff1a; 提供反馈&#xff1a;Toast可以在用户…

索尼PMW580视频帧EC碎片重组开启方法

索尼PMW580视频帧EC碎片重组开启方法 索尼PMW-580摄像机生成的MXF文件存在严重的碎片化&#xff0c;目前CHS零壹视频恢复程序MXF版、专业版、高级版已经支持重组结构体正常的碎片&#xff0c;同时也支持对于结构体破坏或者覆盖后仅存在音视频帧EC数据的重组&#xff0c;需要注…

记一次:Python的学习笔记二(Django项目1)

前言&#xff1a;书接上回&#xff0c;认识了Python项目环境&#xff0c;那么开始做一些案例了&#xff0c;笔者是Java出身&#xff0c;接触的也大都是web项目&#xff0c;那么Python的web项目有哪些呢&#xff1f;了解了一下有很多&#xff0c;37个之多&#xff0c;有 Django …

深入探究Photoshop图像修复与润饰技巧

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 在Photoshop中&#xff0c;图像修复和润饰是强…

KEIL:error 35: undefined line number 原因

error 35: undefined line number 是什么意思 #首先这个错误提示是仿真时候出现的&#xff0c;非编译出现 error 35: undefined line number 其次&#xff0c;这并不是什么没有编译 原因很简单&#xff0c;是因为之前设置了仿真断点&#xff0c;但是在修改程序之后&#xff0…

Linux:docker的网络通信(7)

1.端口映射 端口映射---端口映射机制将容器内的服务提供给外部网络访问 启动容器时&#xff0c;不指定对应的端口&#xff0c;在容器外无法通过网络访问容器内的服务 可随机或指定映射端口范围 -P ---------大写P&#xff0c;开启随机端口 -p 宿主机端口&#xff1a;容器端口…

力扣283题 移动零 双指针解法

移动零 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2: 输入: nums [0] 输出…

html/css中用float实现的盒子案例

运行效果&#xff1a; 代码部分&#xff1a; <!doctype html> <html> <head> <meta charset"utf-8"> <title>无标题文档</title> <style type"text/css">.father{width:300px; height:400px; background:gray;…

数据探索:五款免费数据可视化工具概览

数据可视化是解读和传达数据的重要方式&#xff0c;而现在有许多免费的工具可供选择&#xff0c;让您在探索数据时更轻松、更有趣。以下是五款推荐的免费数据可视化工具&#xff1a; Tableau Public&#xff1a; Tableau Public是一款功能强大的可视化工具&#xff0c;能够创建…

POI和EasyExcel读写Excel 操作

POI和EasyExcel读写Excel 操作 1.POI读写Excel 数据1.1 导入依赖1.2 POI Excel 写 03和07版本方式(小数据量)1.3 大文件写HSSF&#xff08;03版&#xff09;1.4 大文件写XSSF&#xff08;07版&#xff09;1.5 大文件写SXSSF 2.POI Excel读 03和07版本方式2.1 读取数据&#xff…

【ASP.NET CORE】数据迁移 codefirst

已经写好实体类&#xff0c;使用add-migration生成数据迁移语句&#xff0c;注意如果项目中有多个dbcontext需要使用 -context 名称&#xff0c;指定下需要使用的dbcontext add-Migration Address -context mvcsqlcontext运行后会生成两个文件 2. 使用Update-Database语句更…