当前位置: 首页 > news >正文

【Java数据结构】ArrayList类

List接口 

List是一个接口,它继承Collection接口,Collection接口中的一些常用方法

List也有一些常用的方法。List是一个接口,它并不能直接实例化,ArrayList和LinkedList都实现了List接口,它们的常用方法都很相似。

ArrayList

认识ArrayList

        ArrayList是一个类,它实现了List接口。ArrayList内部其实是一个数组,首先会默认一个初始数组容量,如果数组容量不足就需要扩容来存放数据(扩容是当前数组的一倍)。通过一些方法进行存放,它继承类List接口中的所有方法。ArrayList通常都是以泛型的方式实现的,所以使用这个类时要先实例化一个对象(ArrayList arrayList  = new ArrayList())。

        顺序表就是地址连续的一块空间,用来存储数据的线性结构。ArrayList其实就像一个顺序表,它将数据存储在数组中,然后对这个数组(通过一些方法)进行增删改查。

ArrayList的创建

首先需要构造一个对象,可以无参构造(较为常用,在其里初始化一个数组)。

模拟实现ArrayList 

下面我们来分析ArrayList是如何实现的:

        首先我们先了解ArrayList类中有什么,有两个属性一个是数组,还有一个是计数的,还有构造方法,也有一系列方法的实现,我们现在就来模拟一个ArrayList类:

public class MyList {public int[] array;public int size = 0;private static final int CAPACITY = 5;public MyList(){this.array = new int[CAPACITY];this.size = size;}//显示public void disPlay(){for(int i = 0; i < size; i++ ){System.out.print(array[i]+" ");}System.out.println();}//容量是否为满public boolean isFull(){if(size == array.length){return true;}return false;}//增public void add(int data){if (isFull()){//扩容array = Arrays.copyOf(array,2*array.length);}array[size] = data;size++;}//位置是否合法public void isLegal(int pos){if (pos < 0 || pos > size - 1){//System.out.println("位置不合法");throw new PosOutException(pos+"位置不合法");}}//删public void del(int pos){isLegal(pos);for (int i = pos; i < size; i++){array[i] = array[i+1];}size--;}//改public void change(int pos, int data){isLegal(pos);array[pos] = data;}//查找public void find(int data){for (int i = 0; i < size; i++){if(array[i] == data){System.out.println("找到了,下标为"+i);return ;}}System.out.println("该数据找不到");}//置为零public void clear(){size = 0;}
}

一般写完一个方法的时候就先调用一下方法看看是否符合自己所想的,如何调用:就是在主方法里测试。例如下的方法,我使用的是ArrayList自带的方法:

public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);}

ArrayList的遍历

ArrayList中遍历有三种遍历方法,分别是:

1.for循环

//1(循环)遍历
for(int i = 0; i < list.size(); i++){System.out.print(list.get(i)+" ");
}

2.使用增强for循环 

 //2(只)遍历
for(Integer x: list){System.out.print(x+" ");
}

3.使用迭代器 

//3迭代器
Iterator<Integer> it =list.iterator();
while(it.hasNext()){System.out.print(it.next()+" ");
}
System.out.println();

ArrayList常用的方法

构造完就可以对这个对象进行操作(例:增删该查等),使用的话就需要记住常用的方法:

我们现在一个一个实现

  • boolean add(E e);//尾插
    public static void main(String[] args) {ArrayList<Integer> arraylist = new ArrayList<>();arraylist.add(12);//将12插入到数组末尾//arraylist.add("abcd");//泛型为Integer,将这个对象限制在这个类型了arraylist.add(23);System.out.println(arraylist);//结果为[12, 23];}
  • void add(int index, E e);//将e插入到index位置 
    public static void main(String[] args) {ArrayList<Integer> arraylist = new ArrayList<>();//将index下标的插入element数据arraylist.add(0, 12);arraylist.add(0,23);//arraylist.add(2,23);//该数组中只存在0和1下标位置的数组,超过了就会出现数组越界System.out.println(arraylist);//结果为[12, 23];}
  •  boolean addAll(Collection<? extend E>);//尾插c中的元素
    public static void main(String[] args) {//创建顺序表ArrayList<Integer> arraylist1 = new ArrayList<>();arraylist1.add(12);arraylist1.add(23);//创建一个新的顺序表,将新的所有数据都尾插到原来顺序表中ArrayList<Integer> arraylist2 = new ArrayList<>();arraylist2.add(34);arraylist2.add(56);arraylist1.addAll(arraylist2);System.out.println(arraylist1);//结果为[12, 23];}
  • E remove(int index);//删除index位置的元素
    public static void main(String[] args) {ArrayList<Integer> arraylist = new ArrayList<>();arraylist.add(12);arraylist.add(23);//删除下标为0数,arraylist.remove(0);System.out.println(arraylist);//结果为[23];}
  • boolean remove(Object o);//删除遇到第一个o
    public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<>();arrayList.add("111");arrayList.add("aaa");arrayList.add("12");arrayList.add("aaa");//删除遇到的第一个o,相反没有遇到就不删除arrayList.remove("aaa");arrayList.remove("1");System.out.println(arrayList);}
  • E get(int index);//获取下标index位置元素
    public static void main(String[] args) {ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(12);arrayList.add(23);//获取下标index位置元素System.out.println(arrayList.get(1));//结果是[23]}
  • E set(int index, E element);//将下标index位置元素设置为element
    public static void main(String[] args) {ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(12);arrayList.add(23);arrayList.add(34);//将下表index位置元素设置为elementarrayList.set(2,555);System.out.println(arrayList);//结果为[12, 23, 555]}
  • void clear();//清空
    public static void main(String[] args) {ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(12);arrayList.add(23);arrayList.add(34);//清空arrayList中所有数据arrayList.clear();System.out.println(arrayList);//结果为[]}
  • boolean contains(Object o);//判断o是否在线性表中
    public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<>();arrayList.add("hello ");arrayList.add("world ");arrayList.add("coming");//判断是否存在oSystem.out.println(arrayList.contains("come"));System.out.println(arrayList.contains("coming"));System.out.println(arrayList);//结果为[hello, world , coming]}
  • int indexOf(Object o);//返回第一个o所在下标
  • int lastIndexOf(Object o);//返回最后一个o的下标
    public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<>();arrayList.add("hello ");arrayList.add("world ");arrayList.add("coming");arrayList.add("hello ");//返回下标System.out.println(arrayList.indexOf("hello "));//返回第一次遇到o的下标System.out.println(arrayList.lastIndexOf("hello "));//返回最后一个遇到o的下标System.out.println(arrayList);//结果为[hello, world , coming, hello ]}

  • List<E> subList(int fromIndex, int toIndex);//截取部分链表,从fromIndex到toIndex
    public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<>();arrayList.add("hello ");arrayList.add("world ");arrayList.add("coming");arrayList.add("hello ");//List<String> arrayList1 =  arrayList.subList(1,2);//截取从1到2的下标,且满足左闭右开System.out.println(arrayList1);//结果是[world ]}

以上就是ArrayList中常见的方法,我们可以通过ArrayList中的方法实现一些算法,下一节讲这些算法嗷~

 

http://www.lryc.cn/news/507338.html

相关文章:

  • HDR视频技术之十:MPEG 及 VCEG 的 HDR 编码优化
  • 71 mysql 中 insert into ... on duplicate key update ... 的实现
  • 计算机网络-GRE Over IPSec实验
  • 你的第一个博客-第一弹
  • 若依启动项目时配置为 HTTPS 协议
  • 学习思考:一日三问(学习篇)之匹配VLAN
  • [WiFi] WiFi 802.1x介绍及EAP认证流程整理
  • 用C#(.NET8)开发一个NTP(SNTP)服务
  • Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别
  • ABAP SQL 取日期+时间最新的一条数据
  • 【Rust自学】4.3. 所有权与函数
  • 【Redis分布式锁】高并发场景下秒杀业务的实现思路(集群模式)
  • 用docker快速安装电子白板Excalidraw绘制流程图
  • 使用Turtle库实现,鼠标左键绘制路径,用鼠标右键结束绘制,小海龟并沿路径移动
  • 人工智能入门是先看西瓜书还是先看花书?
  • winform中屏蔽双击最大化或最小化窗体(C#实现),禁用任务管理器结束程序,在需要屏蔽双击窗体最大化、最小化、关闭
  • 进程内存转储工具|内存镜像提取-取证工具
  • 数据结构day5:单向循环链表 代码作业
  • (OCPP服务器)SteVe编译搭建全过程
  • Mybatis分页插件的使用问题记录
  • 36. Three.js案例-创建带光照和阴影的球体与平面
  • CentOS 7 安装、测试和部署FastDFS
  • 全志H618 Android12修改doucmentsui选中图片资源详情信息
  • 【083】基于51单片机智能烘手器【Proteus仿真+Keil程序+报告+原理图】
  • uniApp使用腾讯地图提示未添加maps模块
  • 未来趋势系列 篇五:自主可控科技题材解析和股票梳理
  • Springboot 学习 之 logback-spring.xml 日志压缩 .tmp 临时文件问题
  • maven-resources-production:ratel-fast: java.lang.IndexOutOfBoundsException
  • K8s docker-compose的入门
  • 去雾Cycle-GAN损失函数