热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java——ArrayList(动态数组)介绍

本章节对ArrayList进行个简要的介绍,前面也写过一篇博客记录自己模拟实现Arr

文章目录

  • 一、简介
  • 二、使用
    • 1、构造
      • 1.1 无参构造
      • 1.2 指定初始容量
      • 1.3 利用其他的collection进行构造
    • 2、基础操作
      • 2.1 添加元素
      • 2.2 删除元素
      • 2.3 修改元素
      • 2.4 访问元素
      • 2.5 计算大小
      • 2.6 遍历数组
    • 3、常用操作
    • 4、扩容机制
  • 三、模拟实现ArrayList
一、简介

ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。
ArrayList 继承了AbstractList ,并实现了List 接口。
在这里插入图片描述
ArrayList 类位于java.util 包中,使用前需要引入它,语法格式如下:

importjava.util.ArrayList;// 引入 ArrayList 类ArrayList<E> objectName=newArrayList<>();// 初始化
  • E: 泛型数据类型,用于设置objectName 的数据类型,只能为引用数据类型。
  • objectName: 对象名。

注:

  1. ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问
  2. ArrayList实现了Cloneable接口,表明ArrayList可以clone的
  3. ArrayList实现了Serializable接口,表明ArrayList支持序列化的
  4. Vector不同,ArrayList不是线程安全的,在单线程下可以使用,在多线程中可以选择Vector或者CopyOnWriteArrayList
  5. ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表。
二、使用

1、构造

ArrayList有三种构造方式:无参构造、利用其他的collection构造、指定顺序表的初始容量。

1.1 无参构造

无参构造类型是推荐的写法。

//Integer为整型的包装类型List<Integer> list=newArrayList<>();

1.2 指定初始容量

List<Integer> list=newArrayList<>(10);
 list.add(1);
 list.add(2);
 list.add(3);

1.3 利用其他的collection进行构造

//构建一个与list1元素一样的listArrayList<Integer> list2=newArrayList<>(list1);

注: 无论哪种构造形式,都应该避免省略类型,任意类型的元素都能够存放,使用时会带来很多麻烦。

2、基础操作

2.1 添加元素

添加元素到ArrayList 可以使用add() 方法:

publicclassTest{publicstaticvoidmain(String[] args){ArrayList<String> array=newArrayList<String>();
        sites.add("Hello");
        sites.add("CSDN");System.out.println(array);}}

在这里插入图片描述

2.2 删除元素

删除元素使用remove()方法:

publicclassTest{publicstaticvoidmain(String[] args){ArrayList<String> array=newArrayList<>();
        array.add("Hello");
        array.add("CSDN");
        array.add("IDEA");
        array.add("Java");System.out.println(array);
        array.remove(2);System.out.println(array);}}

在这里插入图片描述

2.3 修改元素

修改元素可以使用set() 方法:

publicclassTest{publicstaticvoidmain(String[] args){ArrayList<String> array=newArrayList<>();
        array.add("Hello");
        array.add("CSDN");
        array.add("IDEA");
        array.add("Java");System.out.println(array);
        array.set(2,"python");// 第一个参数为索引,第二个参数为要修改的值System.out.println(array);}}

在这里插入图片描述

2.4 访问元素

访问元素使用get()方法:

publicclassTest{publicstaticvoidmain(String[] args){ArrayList<String> array=newArrayList<>();
        array.add("Hello");
        array.add("CSDN");
        array.add("IDEA");
        array.add("Java");System.out.println(array);System.out.println(array.get(2));// 获取位置2的元素}}

在这里插入图片描述

2.5 计算大小

计算数组内元素个数使用size()方法:

publicclassTest{publicstaticvoidmain(String[] args){ArrayList<String> array=newArrayList<>();
        array.add("Hello");
        array.add("CSDN");
        array.add("IDEA");
        array.add("Java");System.out.println(array);System.out.println(array.size());}}

在这里插入图片描述

2.6 遍历数组

遍历数组有三种方式:for循环遍历、for-each遍历、迭代器遍历。

publicclassTest{publicstaticvoidmain(String[] args){ArrayList<String> array=newArrayList<>();
        array.add("Hello");
        array.add("CSDN");
        array.add("IDEA");
        array.add("Java");System.out.println(array);System.out.println("for:");for(int i=0; i< array.size(); i++){System.out.print(array.get(i)+" ");}System.out.println();System.out.println("for-each:");for(String j:array){System.out.print(j+" ");}System.out.println();System.out.println("迭代器:");Iterator<String> it= array.listIterator();while(it.hasNext()){System.out.print(it.next()+" ");}System.out.println();}

在这里插入图片描述

3、常用操作

方法作用
void add(int index, E element)将element元素插入到index位置
boolean addAll(Collection c)将c中的元素全部插入
boolean remove(Object o)删除第一个遇到的o元素
void clear()清空
boolean contains(Object o)判断o是否在表中
int indexOf(Object o)返回第一个o所在的下标
int lastIndexOf(Object o)返回最后一个o的下标
List subList(int fromIndex, int toIndex)截取fromindex到toindex的元素
publicclassTest{publicstaticvoidmain(String[] args){ArrayList<String> array=newArrayList<>();ArrayList<String> array2=newArrayList<>();
        array.add("Hello");
        array.add("CSDN");
        array.add("Java");
        array.add("IDEA");

        array2.add("python");
        array2.add("Java");

        array.add(1,"Data");System.out.println("array = "+ array);
        
        array2.addAll(array);System.out.println("array2 = "+ array2);

        array2.remove("Data");System.out.println("array2 = "+ array2);

        array.clear();System.out.println("array = "+ array);System.out.println("Java是否在表中:"+ array2.contains("Java"));System.out.println("array2.indexOf(\"Java\") = "+ array2.indexOf("Java"));System.out.println("array2.lastIndexOf(\"Java\") = "+ array2.lastIndexOf("Java"));System.out.println("array2.subList(1,4) = "+ array2.subList(1,4));}

在这里插入图片描述

4、扩容机制

ArrayList是一个动态类型的顺序表,即,在插入元素的过程中会自动扩容:

Object[] elementData;// 存放元素的空间privatestaticfinalObject[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA={};// 默认空间privatestaticfinalint DEFAULT_CAPACITY=10;// 默认容量大小publicvoidensureCapacity(int minCapacity){// 计算最小的扩容大小int minExpand=(elementData!= DEFAULTCAPACITY_EMPTY_ELEMENTDATA)?0:
                DEFAULT_CAPACITY;// 检测是否需要扩容if(minCapacity> minExpand){ensureExplicitCapacity(minCapacity);}}privatevoidensureExplicitCapacity(int minCapacity){
        modCount++;// 如果minCapacity比数组的容量大,就调用grow进行扩容if(minCapacity- elementData.length>0)grow(minCapacity);}privatestaticfinalint MAX_ARRAY_SIZE=Integer.MAX_VALUE-8;privatevoidgrow(int minCapacity){// 获取旧空间大小int oldCapacity= elementData.length;// 预计按照1.5倍方式扩容int newCapacity= oldCapacity+(oldCapacity>>1);// 如果用户需要扩容大小超过原空间1.5倍,按照用户所需大小扩容if(newCapacity- minCapacity<0)
            newCapacity= minCapacity;// 如果需要扩容大小超过MAX_ARRAY_SIZE,重新计算容量大小if(newCapacity- MAX_ARRAY_SIZE>0)
            newCapacity=hugeCapacity(minCapacity);// 调用copyOf扩容
        elementData=Arrays.copyOf(elementData, newCapacity);}privatestaticinthugeCapacity(int minCapacity){// 如果minCapacity小于0,抛出OutOfMemoryError异常if(minCapacity<0)thrownewOutOfMemoryError();return(minCapacity> MAX_ARRAY_SIZE)?Integer.MAX_VALUE: MAX_ARRAY_SIZE;}
三、模拟实现ArrayList

为了更好的理解和使用ArrayList,对其进行了模拟实现
之前单独写过一篇博客进行模拟:Java——模拟实现ArrayList(动态数组)


推荐阅读
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • 本文介绍了安全性要求高的真正密码随机数生成器的概念和原理。首先解释了统计学意义上的伪随机数和真随机数的区别,以及伪随机数在密码学安全中的应用。然后讨论了真随机数的定义和产生方法,并指出了实际情况下真随机数的不可预测性和复杂性。最后介绍了随机数生成器的概念和方法。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • Java SE从入门到放弃(三)的逻辑运算符详解
    本文详细介绍了Java SE中的逻辑运算符,包括逻辑运算符的操作和运算结果,以及与运算符的不同之处。通过代码演示,展示了逻辑运算符的使用方法和注意事项。文章以Java SE从入门到放弃(三)为背景,对逻辑运算符进行了深入的解析。 ... [详细]
author-avatar
多盟乄丶
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有