认识ArrayList

简介: 认识ArrayList

在上一期用ArrayList实现了玩牌,但没有正式介绍它,今天咱们来好好唠一唠这个ArrrayList

主要从以下几个方面来介绍

🎆ArrayList在集合框架中的位置

🎇ArrayList的方法介绍以及实现

🚀从源码认识ArrayList的扩容机制

🧶ArrayList的遍历

🚀ArrayList实现杨辉三角

1.ArrayList在框架中的位置


aebdb2f698e041f6b9b2ff79006a9740.png蓝色的代表类之间的继承


红色的代表类继承了接口,以及接口和接口之间的拓展


ArrayList继承了AbstractList类,实现了List接口


ArrayList实现了RandomAccess接口,说明ArrayList支持随机访问


ArrayList实现了List接口,它是以泛型形式实现的,使用时必须实例化


实现了Cloneable接口,可以被克隆


实现了Serializable接口,表示可以被序列化,意思就是字符串转数组,那么数组转字符串叫做反序列化


Arraylist不是线程安全的,只在单线程中使用,多线程中使用Vector


ArrayList底层是一段连续的空间,是可以动态扩容的,是动态的顺序表


既然AarrayList是一个类,那么就要从它的构造方法去认识它


ed105df51b554a3785c0993b249da412.png

c33ddccea22f4a9e94001483ff8c0dc1.png

28f6268f7d474958b47c84ac3631dfc0.png

e29654a1d4e6421592d88e02f160027d.png


上面三个是ArrayList类的构造方法


第一个构造方法是无参构造


第二个构造方法是实现Collection类的接口帮助ArrayList实现构造


第三个构造方法是 指定顺序表的初始容量


和顺序表一样,ArrayList也有增删查改的基本操作,但在这里不用再进行具体实现了,因为和顺序表的增删查改的实现思路是一样的,直接用就好了,Java提供了库方法


public class ArrayList{
    public static void main(String[] args) {
        List<Integer> list=new java.util.ArrayList<>();//new一个ArrayList类的对象,
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        System.out.println(list);
        list.size();
        System.out.println(list.size());
        list.add(6);
        System.out.println(list);
        list.remove(2);//根据下标进行删除
        System.out.println(list);
        list.remove(new Integer(5));//根据对象中某个具体的数进行删除
        System.out.println(list);
        list.get(3);
        System.out.println(list);
        list.set(1,10);
        System.out.println(list);
         List<Integer>  ret=  list.subList(0,2);
        System.out.println(ret);
    }


7c46380f9afb4052a972c4d383b91dca.png

 public static void main(String[] args) {
    List<Integer> list=new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        System.out.println(list);
        ArrayList<Number> arrayList1=new ArrayList<>(list);
        System.out.println(arrayList1);
        arrayList1.add(10);
        arrayList1.add(25);
        System.out.println(arrayList1);
    }


这里有个比较容易忽略的点

 

绿色圈出来的两个框,第一个泛型中Integer是Number 的子类,所以也可以像第一个那样写

Collection其他的接口帮助ArrayList构造

现在来看看ArrayList的源码扩容机制

10e78165babf4085b71ef063657a5ca9.png

3cbcde00daf54b95ad104cf16830fd1c.png

大致看看源码,知道ArrayList默认是1.5倍的扩容就好

ArrayList的遍历

它的遍历有三种方式

1.for循环

2.for each 循环

3.迭代器(这个不咋用)


 public static void main(String[] args) {
        List<Integer> list=new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        for(int i=0;i<list.size();i++){
            System.out.println(list.get(i)+" ");
        }
        System.out.println("=====");
        for ( Integer x:list) {
            System.out.println(x);
        }
        //使用迭代器
        ListIterator<Integer>  iterator=list.listIterator()
        while (iterator.hasNext()) {
            System.out.print(iterator.next()+" ");
        }
    }


最后为大家带来杨辉三角的实现


  public List<List<Integer>> generate(int numRows) {
        List<List<Integer>>  list =new ArrayList<>();
       List<Integer> row=new ArrayList<>();
           row.add(1);
           list.add(row);
           for(int i=1;i<numRows;i++){
               List<Integer> prevRow=list.get(i-1);
               List<Integer>  curRow=new ArrayList<>();
               curRow.add(1);
               for(int j=1;j<i;j++){//中间放的那个数
                   int x=prevRow.get(i-1)+prevRow.get(j-1);
                   curRow.add(x);
               }
               curRow.add(1);
               list.add(curRow);
           }
           return list;
    }
}


今天的讲解就到这,我们下期再见了,886!!!

相关文章
|
SQL 存储 算法
抓个包看下 kerberos的 pre-authentication是如何工作的 1
抓个包看下 kerberos的 pre-authentication是如何工作的
|
Web App开发 Java
使用java操作浏览器的工具selenium-java和webdriver下载地址
【10月更文挑战第12天】Selenium-java依赖包用于自动化Web测试,版本为3.141.59。ChromeDriver和EdgeDriver分别用于控制Chrome和Edge浏览器,需确保版本与浏览器匹配。示例代码展示了如何使用Selenium-java模拟登录CSDN,包括设置驱动路径、添加Cookies和获取页面源码。
879 6
|
11月前
|
机器学习/深度学习 人工智能 监控
《C++赋能智能摄像头:开启实时视频分析新纪元》
在科技飞速发展的今天,智能摄像头结合人工智能技术,实现了人员识别、行为分析和异常事件预警等强大功能。C++凭借其高效性和对底层资源的出色掌控能力,成为将人工智能模型部署到智能摄像头的关键技术之一。本文深入探讨了如何在C++中实现这一目标,解锁智能摄像头的无限潜能。文章详细介绍了智能摄像头与人工智能的结合带来的需求与挑战,C++的独特优势,以及模型选择与优化、环境搭建与依赖配置、数据传输与预处理、模型集成与实时分析等关键技术要点。最后,提出了应对复杂环境和提升性能的策略,并展望了未来的发展前景。
304 18
|
开发框架 安全 .NET
Web安全-一句话木马
Web安全-一句话木马
309 3
【Qt 学习笔记】Qt常用控件 | 布局管理器 | 水平布局Horizontal Layout
【Qt 学习笔记】Qt常用控件 | 布局管理器 | 水平布局Horizontal Layout
990 2
|
JavaScript
5. 解决 nativeTags 不被 Vue - Office 插件兼容的问题
5. 解决 nativeTags 不被 Vue - Office 插件兼容的问题
330 0
|
弹性计算 文件存储 数据库
阿里云8M带宽云服务器承载量多大?阿里云8M带宽云服务器评测
在当今的云计算时代,云服务器已成为企业和个人用户的首选。其中,带宽作为衡量云服务器性能的重要指标之一,经常被人们提及。那么,一个拥有8M带宽的云服务器到底能承受多少承载量呢? 我们以常见的网站应用为例来探究这个问题。假设经过优化后的网页平均大小为60KB,8M带宽即意味着每秒能传输8*1024KB的数据。简单计算可知,8M带宽的云服务器在1秒内可以传输大约136个这样的网页。但是,这并不意味着它能同时支持136个用户访问,因为还需要考虑用户访问的并发性。
819 1
|
前端开发 JavaScript
Promise的链式调用案例讲解
Promise的链式调用案例讲解
191 0
|
机器学习/深度学习 存储 自然语言处理
深入解析序列模型:全面阐释 RNN、LSTM 与 Seq2Seq 的秘密
深入解析序列模型:全面阐释 RNN、LSTM 与 Seq2Seq 的秘密
|
存储 异构计算
在FPGA上实现高通滤波器
在FPGA上实现高通滤波器
323 0