目录
前言
一、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++) {//每行第一个和最后一个都是1if (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;}