目录
前言
一、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;
}