详解java中ArrayList

本文详细介绍了Java中的ArrayList,包括其定义、构造方法、常见操作(如添加、获取、设置、遍历)、扩容机制以及一个实例练习,帮助读者掌握ArrayList的基础知识。
摘要由CSDN通过智能技术生成

目录

前言

一、ArrayList是什么

 二、ArrayList使用

1、ArrayList的构造

2 、ArrayList常见操作

3、 ArrayList的遍历

4、 ArrayList的扩容机制

三、来个练习

前言

        当你看到这篇文章我觉得很好笑,因为我开始也不懂ArrayList现在轮到你了,嘻嘻嘻,但是没关系我教你,action!!!

一、ArrayList是什么

通俗点讲ArrayList就是数组

文字解答:ArrayList属于List,List是线性表,线性表有顺序表、链表、栈、队列...,而ArrayList底层代码就是顺序表(数组)

代码解答(重点):

public class MyArrayList {

    public int[] elem;//数组
    public int usedSize;
    // 默认的容量
    public static final int DEFAULT_CAPACITY = 5;
    public MyArrayList() {
        elem = new int[DEFAULT_CAPACITY];//数组初始化
    }

你可能感觉很奇怪,ArrayList底层既然是数组,那为什么不直接写成数组的形式呢,比如这样 

int [] ArrayList={1,2,3};

亦或者是这样:

int [] ArrayList=new int []{1,2,3};

我只能说你对数组的定义没忘,hahaha 

  • 不卖关子了,如果我们这样定义,那好我问你
  • 如果我们想在数组中添加任意类型的元素怎末办?数组在一开始就要定义数组中元素类型了
  • 如果我们想动态的改变数组大小怎么办?
  • 如果我想在数组最后添加元素,普通数组你需要找到数组大小后添加,没有直接的函数,繁琐
  • .....

 二、ArrayList使用

1、ArrayList的构造

第一种方法:

// ArrayList创建,推荐写法
// 构造一个空的列表
List<Integer> list1 = new ArrayList<>();

第二种方法:

// list2构造好之后,与list1中的元素拼接,list1元素插入到了list2后面
ArrayList<Integer> list2 = new ArrayList<>(list1);

特别注意:ArrayList(Collection<? extends E> c) 的意思是new ArrayList<>(list1);小括号内对象的类型必须是继承了Collection,上述list1的类型是List满足这一条件;其次list1的<>必须是现在<>的类型的子类或者相同关系 ,c是定义的变量。

第三种方法:

// 构造一个具有10个容量的列表
List<Integer> list3 = new ArrayList<>(10);
list3.add(1);
list3.add(2);
list3.add(3);
// list3.add("hello"); // 编译失败,List<Integer>已经限定了,list2中只能存储整形元素

2 、ArrayList常见操作

代码解释:

public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    list.add("JavaSE");
    list.add("JavaWeb");
    list.add("JavaEE");
    list.add("JVM");
    list.add("测试课程");
    System.out.println(list);
    // 获取list中有效元素个数
    System.out.println(list.size());
    // 获取和设置index位置上的元素,注意index必须介于[0, size)间
    System.out.println(list.get(1));
    list.set(1, "JavaWEB");
    System.out.println(list.get(1));
    // 在list的index位置插入指定元素,index及后续的元素统一往后搬移一个位置
    list.add(1, "Java数据结构");
    System.out.println(list);
    // 删除指定元素,找到了就删除,该元素之后的元素统一往前搬移一个位置
    list.remove("JVM");
    System.out.println(list);
    // 删除list中index位置上的元素,注意index不要超过list中有效元素数,否则会抛出下标越界异常   
    list.remove(list.size()-1);
    System.out.println(list);

    if(list.contains("测试课程")){
    list.add("测试课程");
    }
    // 查找指定元素第一次出现的位置:indexOf从前往后找,lastIndexOf从后往前找
    list.add("JavaSE");
    System.out.println(list.indexOf("JavaSE"));
    System.out.println(list.lastIndexOf("JavaSE"));
    // 使用list中[0, 4)之间的元素构成一个新的SubList返回,但是和ArrayList共用一个elementData 
       //数组

    List<String> ret = list.subList(0, 4);
    System.out.println(ret);
    list.clear();
    System.out.println(list.size());
    }

3、 ArrayList的遍历

ArrayList 可以使用三方方式遍历: for 循环 + 下标、 foreach 、使用迭代器
public static void main(String[] args) {
    List<Integer> list = new ArrayList<>();
    list.add(1);
    list.add(2);
    list.add(3);
    list.add(4);
    list.add(5);
    // 使用下标+for遍历
    for (int i = 0; i < list.size(); i++) {
    System.out.print(list.get(i) + " ");
    }
    System.out.println();
    // 借助foreach遍历
    for (Integer integer : list) {
    System.out.print(integer + " ");
    }
    System.out.println();
    //使用迭代器
    Iterator<Integer> it = list.listIterator();
    while(it.hasNext()){
    System.out.print(it.next() + " ");
    }
    System.out.println();
}
注意:ArrayList 最长使用的遍历方式是: for 循环 + 下标 以及 foreach

4、 ArrayList的扩容机制

当空间不够时需要扩容,比如:

public void add(int data){
    if(usedSize == elem.length)//usedSize数组中元素个数
        elem=Arrays.copyof(elem,2*elem.length);
    elem[usedSize]=data;
    usedSize++;
}

三、来个练习

解答:
public static List<List<Integer>> generate(int numRows) {
        //建立一个二维数组存储杨辉三角
        List<List<Integer>> mylist = new ArrayList<>();//建立第一维数组
        for (int i = 0; i < numRows; i++) {
            mylist.add(new ArrayList<>());//建立第二维数组
        }
        for (int i = 0; i < numRows; i++) {
            for (int j = 0; j <= i; j++) {
                //每行第一个和最后一个都是1
                if (j == 0 || j == i) mylist.get(i).add(1);
                    //中间行插入值
                else {
                    mylist.get(i).add(mylist.get(i - 1).get(j) + mylist.get(i - 1).get(j - 1));
                }
            }
            System.out.println();
        }
        return mylist;
    }

  • 19
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值