【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位置元素设置为element
arrayList.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");
//判断是否存在o
System.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中的方法实现一些算法,下一节讲这些算法嗷~