集合,Collection接口,Iterator(迭代器),List接口和方法,ArrayList底层结构和源码分析

news2024/12/23 23:32:35
  1. 数组的不足
    1. 长度开始必须指定,而且一旦指定,不能修改
    2. 保存的必须为同一类型的元素
    3. 使用数组进行增加/删除元素的示意代码麻烦
    4. @SuppressWarnings({"all"})抑制警告
  2. 集合
    1. 可以动态保存任意多个对象,使用比较方便
    2. 提供了一系列方便的操作对象的方法:add,remove,set,get等
    3. 使用集合添加,删除新元素的示意代码简洁
  3. 集合主要是两组(单列集合,双列集合)

    1. 单列集合,
    2.  双列集合存放K-V(键值对)
  4. Collection接口和常用方法
    1. collection实现子类可以存放多个元素,每个元素可以是Object
    2. 有些Collection的实现类,可以存放重复的元素,有些不可以
    3. 有些Collection的实现类,有些是有序的(List),有些不是有序(Set)
    4. Collection接口没有直接的实现子类,是通过它的子接口Set和List来实现的。
    5. 常用方法
      package com.jshedu.collection;
      
      import java.util.ArrayList;
      import java.util.List;
      
      /**
       * @author 韩顺平
       * @version 1.0
       */
      public class CollectionMethod {
          @SuppressWarnings({"all"})
          public static void main(String[] args) {
              List list = new ArrayList();
      //        add:添加单个元素
              list.add("jack");
              list.add(10);//list.add(new Integer(10))
              list.add(true);
              System.out.println("list=" + list);//list=[jack, 10, true]
      //        remove:删除指定元素
              //list.remove(0);//删除第一个元素
              list.remove(true);//指定删除某个元素
              System.out.println("list=" + list);//list=[jack, 10]
      //        contains:查找元素是否存在
              System.out.println(list.contains("jack"));//T
      //        size:获取元素个数
              System.out.println(list.size());//2
      //        isEmpty:判断是否为空
              System.out.println(list.isEmpty());//F
      //        clear:清空
              list.clear();
              System.out.println("list=" + list);//list=[]
      //        addAll:添加多个元素
              ArrayList list2 = new ArrayList();
              list2.add("红楼梦");
              list2.add("三国演义");
              list.addAll(list2);
              System.out.println("list=" + list);//list=[红楼梦, 三国演义]
      //        containsAll:查找多个元素是否都存在
              System.out.println(list.containsAll(list2));//T
      //        removeAll:删除多个元素
              list.add("聊斋");
              list.removeAll(list2);
              System.out.println("list=" + list);//[聊斋]
      //        说明:以ArrayList实现类来演示.
      
          }
      }
      

      以ArrayList实现类来演示(ctrl+j显示所有快捷键)

  5. Collection接口遍历元素方式1-使用Iterator(迭代器)

    1. iterator对象称为迭代器,主要用于遍历Collection集合中的元素

    2. 所有实现了Collection接口的集合类都有一个iterator()方法,用以返回一个实现Iterator接口的对象,即可以返回一个迭代器

    3. iterator仅用于遍历集合,Iterator本身并不存放对象

    4. 在调用next()方法前必须调用hasNext()进行检测。若不调用且下一条记录无效,直接调用next()会抛出NoSuchElementException异常

    5. package com.jshedu.collection;
      
      import java.util.ArrayList;
      import java.util.Collection;
      import java.util.Iterator;
      import java.util.NoSuchElementException;
      
      /**
       * @author Mr.jia
       * @version 1.0
       */
      
      public class CollectionIterator {
          @SuppressWarnings({"all"})
          public static void main(String[] args) {
               Collection col = new ArrayList();//向上转型
              col.add(new BooK("三国演义","罗贯中",10.1));
              col.add(new BooK("小李飞刀","古龙",12.1));
              col.add(new BooK("红楼梦","曹雪芹",9.1));
              //col=[BooK{name='三国演义', author='罗贯中', price=10.1},
              // BooK{name='小李飞刀', author='古龙', price=12.1},
              // BooK{name='红楼梦', author='曹雪芹', price=9.1}]
              //System.out.println("col="+col);
              //现在希望能够遍历col集合
              //1.先得到col对应的 迭代器
              Iterator iterator = col.iterator();//返回迭代器
              //2.使用while循环遍历。。。快捷键生成while-->itit
              while (iterator.hasNext()){//这个方法是判断下面是否还有数据
                  //返回下一个元素,类型是Object
                  Object obj = iterator.next();//next()1.下移,2.将下移以后集合位置上的元素返回
                  System.out.println("obj="+obj);
                  /*
                  obj=BooK{name='三国演义', author='罗贯中', price=10.1}
                  obj=BooK{name='小李飞刀', author='古龙', price=12.1}
                  obj=BooK{name='红楼梦', author='曹雪芹', price=9.1}
                   */
              }
              //3.当退出while循环后,这时iterator迭代器,指向最后的元素
              //iterator.next();//NoSuchElementException,再次下一个会报这个异常
      
              //4.如果希望再次遍历,需要重置我们的迭代器
              iterator = col.iterator();
      
      
          }
      }
      class BooK{
          private String name;
          private String author;
          private double price;
      
          public BooK(String name, String author, double price) {
              this.name = name;
              this.author = author;
              this.price = price;
          }
      
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          public String getAuthor() {
              return author;
          }
      
          public void setAuthor(String author) {
              this.author = author;
          }
      
          public double getPrice() {
              return price;
          }
      
          public void setPrice(double price) {
              this.price = price;
          }
      
          @Override
          public String toString() {
              return "BooK{" +
                      "name='" + name + '\'' +
                      ", author='" + author + '\'' +
                      ", price=" + price +
                      '}';
          }
      }
      

      用迭代器遍历元素

  6. Collection接口遍历对象方式2-for循环增强

    1. 增强for循环,可以替代iterator迭代器,特点:增强for就是简化版的iterator本质一样。只能用于遍历集合或数组

    2. package com.jshedu.collection;
      
      import java.util.ArrayList;
      import java.util.Collection;
      
      /**
       * @author Mr.jia
       * @version 1.0
       */
      
      public class CollectionFor {
          @SuppressWarnings({"all"})
          public static void main(String[] args) {
              Collection col = new ArrayList();//向上转型
      
              col.add(new BooK("三国演义","罗贯中",10.1));
              col.add(new BooK("小李飞刀","古龙",12.1));
              col.add(new BooK("红楼梦","曹雪芹",9.1));
      
              
              //1.增强for循环,在集合使用
              //2.增强for底层仍然是迭代器
              for (Object book:col//快捷键大写I
                   ) {
                  System.out.println("book="+book);
              }
              //增强for,也可以直接在数组中使用
              int[] arr={1,3,4,5,56,};
              for (int i:arr
                   ) {
                  System.out.println("i="+i);
              }
          }
      }
      
      

      增强for直接把数组名或集合名传进去就能把单个元素输出

  7. List接口和方法

    1. package com.jshedu.List_;
      
      import java.util.ArrayList;
      import java.util.List;
      
      /**
       * @author Mr.jia
       * @version 1.0
       */
      
      public class List_ {
          @SuppressWarnings({"all"})
          public static void main(String[] args) {
              //1.List集合类中元素有序(即添加顺序和取出顺序一致),且可重复
              List list = new ArrayList();
              list.add("jack");
              list.add("tom");
              list.add("Rose");
              list.add("aili");
              list.add(213);
              System.out.println("list="+list);
              //list=[jack, tom, Rose, aili, 213]
              //2.List集合中的每个元素都有其对应的顺序索引,即支持索引
              //  索引从0开始
              System.out.println(list.get(3));//aili
              
          }
      }
      

      有序,可重复

    2. List方法

      package com.jshedu.List_;
      
      import java.util.ArrayList;
      import java.util.List;
      
      /**
       * @author 韩顺平
       * @version 1.0
       */
      public class ListMethod {
          @SuppressWarnings({"all"})
          public static void main(String[] args) {
              List list = new ArrayList();
              list.add("张三丰");
              list.add("贾宝玉");
      //        void add(int index, Object ele):在index位置插入ele元素
              //在index = 1的位置插入一个对象
              list.add(1, "韩顺平");
              System.out.println("list=" + list);//list=[张三丰, 韩顺平, 贾宝玉]
      //        boolean addAll(int index, Collection eles):从index位置开始将eles中的所有元素添加进来
              List list2 = new ArrayList();
              list2.add("jack");
              list2.add("tom");
              list.addAll(1, list2);
              System.out.println("list=" + list);//list=[张三丰, jack, tom, 韩顺平, 贾宝玉]
      //        Object get(int index):获取指定index位置的元素
              //说过
      //        int indexOf(Object obj):返回obj在集合中首次出现的位置
              System.out.println(list.indexOf("tom"));//2
      //        int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置
              list.add("韩顺平");
              System.out.println("list=" + list);//list=[张三丰, jack, tom, 韩顺平, 贾宝玉, 韩顺平]
              System.out.println(list.lastIndexOf("韩顺平"));//5
      //        Object remove(int index):移除指定index位置的元素,并返回此元素
              list.remove(0);
              System.out.println("list=" + list);//list=[jack, tom, 韩顺平, 贾宝玉, 韩顺平]
      //        Object set(int index, Object ele):设置指定index位置的元素为ele , 相当于是替换.
              list.set(1, "玛丽");
              System.out.println("list=" + list);//list=[jack, 玛丽, 韩顺平, 贾宝玉, 韩顺平]
      //        List subList(int fromIndex, int toIndex):返回从fromIndex到toIndex位置的子集合
              // 注意返回的子集合 fromIndex <= subList < toIndex
              List returnlist = list.subList(0, 2);
              System.out.println("returnlist=" + returnlist);//returnlist=[jack, 玛丽]
      
          }
      }
      

  8. List的三种遍历方式【List 接口的实现子类ArrayList,LinkedList,Vector】

    1. package com.jshedu.List_;
      
      import java.util.*;
      
      /**
       * @author 韩顺平
       * @version 1.0
       */
      public class ListFor {
          @SuppressWarnings({"all"})
          public static void main(String[] args) {
      
              //List 接口的实现子类 Vector LinkedList
              //List list = new ArrayList();
              //List list = new Vector();
              List list = new LinkedList();
      
              list.add("jack");
              list.add("tom");
              list.add("鱼香肉丝");
              list.add("北京烤鸭子");
      
              //遍历
              //1. 迭代器
              Iterator iterator = list.iterator();
              while (iterator.hasNext()) {
                  Object obj =  iterator.next();
                  System.out.println(obj);
      
              }
      
              System.out.println("=====增强for=====");
              //2. 增强for
              for (Object o : list) {
                  System.out.println("o=" + o);
              }
      
              System.out.println("=====普通for====");
              //3. 使用普通for
              for (int i = 0; i < list.size(); i++) {
                  System.out.println("对象=" + list.get(i));
              }
      
      
          }
      }
      

      迭代器,增强for,普通for

    2. 例题

      package com.jshedu.List_;
      
      
      import java.util.*;
      
      /**
       * @author Mr.jia
       * @version 1.0
       */
      /*
      名称:红楼梦		价格:100.0		作者:曹雪芹
      名称:三国演义		价格:10.1		作者:罗贯中
      名称:小李飞刀		价格:12.1		作者:古龙
      名称:红楼梦		价格:9.1		作者:曹雪芹
      定制排序后======
      名称:红楼梦		价格:9.1		作者:曹雪芹
      名称:三国演义		价格:10.1		作者:罗贯中
      名称:小李飞刀		价格:12.1		作者:古龙
      名称:红楼梦		价格:100.0		作者:曹雪芹
       */
      public class Homework03 {
          @SuppressWarnings({"all"})
          public static void main(String[] args) {
              //List arrayList = new ArrayList();
              //LinkedList arrayList = new LinkedList();
              Vector arrayList = new Vector();
              //三种集合实现都ok
      
              arrayList.add(new Book("红楼梦","曹雪芹",100));
              arrayList.add(new Book("三国演义","罗贯中",10.1));
              arrayList.add(new Book("小李飞刀","古龙",12.1));
              arrayList.add(new Book("红楼梦","曹雪芹",9.1));
              System.out.println();
              //迭代器
              Iterator iterator = arrayList.iterator();
              while (iterator.hasNext()) {
                  Object next =  iterator.next();
                  System.out.println(next);
              }
              //这里用的定制排序
              bubble(arrayList, new Comparator() {//匿名内部类
                  @Override
                  public int compare(Object o1, Object o2) {
                      Book i1 = (Book) o1;
                      Book i2 = (Book) o2;
                      return (int)(i1.getPrice()-i2.getPrice()  );
                      //更改i1-i2变化排序顺序
                  }
              });
              System.out.println("定制排序后======");
              iterator = arrayList.iterator();//迭代器重置
              while (iterator.hasNext()) {
                  Object next =  iterator.next();
                  System.out.println(next.toString());
              }
      //        for (Object o :) {
      //
      //        }
      
          }
          //冒泡排序
          public static void bubble(List list, Comparator c){
              Object temp;
              for (int i = 0; i < list.size()-1; i++) {//外层循环次数
                  for (int j = 0; j < list.size()-1-i ; j++) {
                      if(c.compare(list.get(j),list.get(j+1))>0){
                          //用List方法进行位置交换
                          temp = list.get(j);
                          list.set(j,list.get(j+1));
                          list.set(j+1,temp);
      
                      }
                  }
              }
          }
      
      }
      class Book{
          private String name;
          private String author;
          private double price;
      
          public Book(String name, String author, double price) {
              this.name = name;
              this.author = author;
              this.price = price;
          }
      
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          public String getAuthor() {
              return author;
          }
      
          public void setAuthor(String author) {
              this.author = author;
          }
      
          public double getPrice() {
              return price;
          }
      
          public void setPrice(double price) {
              this.price = price;
          }
      
          @Override
          public String toString() {
              return "名称:"+getName()+"\t\t"+"价格:"+getPrice()+"\t\t"+
                      "作者:"+getAuthor();
          }
      }
      

      集合的运用匿名内部类,compare方法重写,List用方法位置交换

  9. ArrayList注意事项

    1. ArrayList可以加入null,并且多个

    2. ArrayList是由数组来实现数据存储的

    3. ArrayList基本等同于Vector,除了ArrayList是线程不安全(执行效率高),在多线程情况下,不建议使用ArrayList。

  10. ArrayList底层结构和源码分析

    1. ArrayList中维护了一个Object类型【这就是集合为什么可以存储任意类型的数据】的数组elementData【】。transient Object[] elementData;transient表示瞬间,短暂的,表示该属性不会被序列话。

    2. 当创建ArrayList对象时,如果使用的是无参构造器,则初始elementData容量为0,第1次添加,则扩容elementData为10,如需要再次扩容,则扩容elementData为1.5倍。【也就是10+10/2=15,为什么这样写,因为底层扩容机制就是按这个算法来的grow()】

      1.  代码执行流程,elementData==空【大写的一串英文】

         minCapacity表示的是需要几个空间,

         

    3. 如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如果需要扩容,则直接扩容elementData 为1.5倍。【在你提供的任意数的1.5倍,】

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

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

相关文章

【零基础学习】Javascript 快速入门(完整篇)简单、适合初学者

【零基础学习】Javascript 快速入门前言&#xff1a;如何解决错误提示&#xff08;Error&#xff09;Uncaught TypeError: Cannot set properties of null (setting innerHTML)Uncaught ReferenceError: displayDate is not defined at HTMLButtonElement.onclick安装Visual St…

剪枝与重参第八课:ACNet、DBB、RepVGG重参

目录ACNet、DBB、RepVGG重参前言1. 并行多分支结构1.1. 并行多分支结构 Demo2. ACNet2.1 ACNet简述2.2 init2.3 forward2.4 swtich to deploy2.5 get_equivalent_kernel_bias2.6 Conv2d与BN的融合(重参)2.7 Conv1x3Conv3x1Conv3x3的融合(重参)2.8 模型导出2.9 完整示例代码总结…

【电路理论】KCL、KVL、线性直流电路各大方法、定理详解

博主简介&#xff1a;努力学习的22级计科生一枚~博主主页&#xff1a; 是瑶瑶子啦所属专栏: 电路理论 目录一、KCL、KVL定律1.1&#xff1a;KCL1.2&#xff1a;KVL1.3&#xff1a;总结二、线性直流电路2.1&#xff1a;电阻网络等效变换2.1.1&#xff1a;电阻等效——三角&星…

【Flink】Flink基础

Flink 官网地址 &#xff08;官网介绍的非常详细&#xff0c;觉得看英文太慢的直接使用浏览器一键翻译&#xff0c;本文是阅读官方文档后进行的内容梳理笔记&#xff09; https://nightlies.apache.org/flink/flink-docs-release-1.17/docs/dev/python/overview/ 这 Flink API …

winForm初始

创建winForm应用程序步骤 创建项目界面设计&#xff0c;拖控件布局设置属性编写代码运行程序 设置属性 在forms框内右击属性 属性框内有 修改标题 在(属性)里的外观里的Text, 点击text后会出现相对应的提示 设置关联属性名称 查看代码 右击 设置label名称 设置textbox关联属…

38-Vue之cron表达式组件使用

cron表达式组件使用前言vue-cron-editor-buefy1. 安装vue-cron-editor-buefy包2. 使用3. 配置路由4. 运行并查看效果vcrontab1. 安装vcrontab包2. 使用3. 配置路由4. 运行并查看前言 本篇来学习下vue中如何生成cron表达式的两个包 vue-cron-editor-buefy 1. 安装vue-cron-ed…

先认识浏览器和 dom

先认识浏览器和 dom 认识浏览器使用控制台(console)初识 dom获取浏览器可见区域高度简单的操作一下 dom向页面添加一个元素innerHTML认识块模式认识坐标与定位小结认识浏览器 我们先创建一个文本文件,然后将其扩展名改成 html,或者直接创建一个 html 文档。嗯,空白的,里…

『pyqt5 从0基础开始项目实战』08. 本地数据配置文件的保存与读取之SMTP邮件报警(保姆级图文)

目录导包和框架代码简化说明绑定鼠标事件编写弹窗UI和读取配置保存配置功能读取本地配置文件编写UI界面保存设置main.py中启动弹窗UI完整代码main.pythreads.pydialog.py总结欢迎关注 『pyqt5 从0基础开始项目实战』 专栏&#xff0c;持续更新中 欢迎关注 『pyqt5 从0基础开始项…

什么是MVVM?

MVVM 是 Model-View-ViewModel 的缩写&#xff0c;是M-V-VM三部分组成。它本质上就是MVC的改进版。 M&#xff1a;Model 代表数据模型&#xff0c;也可以在Model中定义数据修改和操作的业务逻辑。 V&#xff1a;View 代表视图UI&#xff0c;它负责将数据模型转化成UI 展现出来。…

OpenResty+OpenWAF的WEB防护实战

OpenResty是一个基于 Nginx 与 Lua 的高性能 Web 平台&#xff0c;其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。本文介绍通过OpenRestyOpenWAF来搭建软WAF的应用&#xff…

【Linux】多线程协同

目录 生产消费模型 BlockQueue阻塞队列模型 BlockQueue.hp Task.hpp mypc.cc RingQueue循环队列模型 POSIX信号量 RingQueue.hpp Task.hpp main.cc 生产消费模型 生产者与生产者之间关系&#xff1a;互斥&#xff08;竞争&#xff09; 消费者与消费者之间关系&…

偏向锁到轻量级锁的升级过程(耗资源)

目录 上原理&#xff1a; 细说原理&#xff1a; 什么是锁记录呢&#xff1f; 什么是Mark Word 呢&#xff1f; 上图解&#xff1a; 上原理&#xff1a; 偏向锁使⽤了⼀种等到竞争出现才释放锁的机制&#xff0c;所以当其他线程尝试竞争偏向锁时&#xff0c; 持有偏向锁的…

nssctf web 入门(3)

目录 [NISACTF 2022]easyssrf [SWPUCTF 2021 新生赛]ez_unserialize [SWPUCTF 2021 新生赛]no_wakeup 这里通过nssctf的题单web安全入门来写&#xff0c;会按照题单详细解释每题。题单在NSSCTF中。 想入门ctfweb的可以看这个系列&#xff0c;之后会一直出这个题单的解析&…

FLStudio21中文版本好不好用?值不值得下载

FLStudio中文21最新版本以其使用速度而闻名&#xff0c;是一个高度复杂的音乐制作环境。现代的DAW是一种非凡的野兽。首先&#xff0c;它在很大程度上把自己放在了(几乎)每个人记录过程的核心。其次&#xff0c;通过在价格适中的软件中模拟完整的工作室体验&#xff0c;它在音乐…

国内版的ChatGPT弯道超车的机会在哪里?

前言 从去年11月最后一天ChatGPT诞生&#xff0c;截至目前&#xff0c;ChatGPT的热度可谓是爆了。众所周知&#xff0c;ChatGPT是美国“开放人工智能研究中心”研发的聊天机器人程序&#xff0c;它是一个人工智能技术驱动的自然语言处理工具&#xff0c;它能够通过学习和理解人…

【数据分析】— 特征工程、特征设计、特征选择、特征评价、特征学习

【数据分析】— 特征工程特征工程是什么&#xff1f; (Feature Engineering)特征工程的意义特征工程的流程特征的设计从原始数据中如何设计特征&#xff1f;基本特征的提取创建新的特征函数变换特征独热特征表示 One-hot Representation数据的统计特征TF-IDF&#xff08;词频-逆…

「Cpolar」看我如何实现公网远程控制Mac OS【使用mac自带VNC】

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后端的开发语言A…

探寻人工智能前沿 迎接AIGC时代——CSIG企业行(附一些好玩的创新点)

上周我有幸参加了由中国图像图形学会和合合信息共同举办的CSIG企业行活动。这次活动邀请了多位来自图像描述与视觉问答、图文公式识别、自然语言处理、生成式视觉等领域的学者&#xff0c;他们分享了各自的研究成果和经验&#xff0c;并与现场观众进行了深入的交流和探讨。干货…

重感知还是重地图?其实无需选择

近来&#xff0c;关于自动驾驶应该重感知还是重地图是个热点话题&#xff0c;很多重量级车厂、自动驾驶供应商都开始提出重感知轻地图的方案&#xff0c;并承诺很快能发布出对应的产品。业界也出现了高精地图已“死”等类似的言论。 一时之间&#xff0c;似乎轻地图已经成为了…

三种实现模型可视化的方式(print, torchinfo, tensorboard)

记录一下自己使用的三种模型可视化的方式&#xff0c;从简单到难 Print 最简单的是print&#xff0c;就不用多说了。 Torchinfo from torchinfo import summary import torch model (...) summary(model, (1,3,128,128))即可按照像文档路径一样的方式输出结构&#xff0c;…