目录
- 1.介绍
- 2.顺序表实现
- 2.1 代码简单实现顺序表
- 2.2 List接口实现顺序表
- 3.ArrayList常用方法
- 4.ArrayList的遍历
- 4.1 直接打印
- 4.2 for循环或for-each
- 4.3 迭代器
1.介绍
线性表(一种广泛使用的数据结构),是n个具有相同特征的数据元素的有限序列,在逻辑上线性表是线性结构(连续的一条直线),在物理结构上不一定连续,通常以数组和链式结构的形式存储。而顺序表就是线性表的一种,它是一段物理地址连续的存储单元依次存储数据元素的线性结构,一般采用数组来存储
2.顺序表实现
顺序表的实现可以通过自己写代码实现(主要为了理解顺序表,需要使用顺序表时不推荐使用自己实现的),或直接使用List接口来实现
2.1 代码简单实现顺序表
import java.util.Arrays;
public class MyArrayList {public int[] elem;public int usedSize;public static final int DEFAULT_SIZE= 10;public MyArrayList() {this.elem = new int[DEFAULT_SIZE];}public void display() { //打印顺序表System.out.println(Arrays.toString(elem));}public void add(int data) { //在数组最后新增元素(尾插)if(isFull()) {this.elem=Arrays.copyOf(elem,elem.length*2);}this.elem[usedSize]=data;this.usedSize++;}public boolean isFull() { //判断数组元素是否已满return this.usedSize==this.elem.length;}private boolean checkPosInAdd(int pos) { //判断新增元素时pos值是否合法if(pos<0||pos>usedSize) {return false;}return true;}public void add(int pos, int data) { //在pos位置新增元素if(!checkPosInAdd(pos)) {throw new PosException("pos的值不合法:"+pos);}if(isFull()) {this.elem=Arrays.copyOf(elem,elem.length*2);}for(int i=usedSize-1;i>=pos;i--) {this.elem[i+1]=this.elem[i];}this.elem[pos]=data;this.usedSize++;}public boolean contains(int toFind) { //判断是否包含某个元素for (int i = 0; i < usedSize; i++) {if (toFind == elem[i]) {return true;}}return false;}public int indexOf(int toFind) { //查找某个元素对应的位置for (int i = 0; i < usedSize; i++) {if (toFind == elem[i]) {return i;}}return -1;}public boolean checkPosInGetAndSet(int pos){ //判断设置元素和获取元素时pos值是否合法if(pos<0||pos>=usedSize) {return false;}return true;}public int get(int pos) { //获取pos位置的元素if(!checkPosInGetAndSet(pos)) {throw new PosException("pos值不合法:"+pos);}if(isEmpty()) {throw new EmptyException("顺序表为空");}return this.elem[pos];}private boolean isEmpty() { //判断数组是否没有元素return this.usedSize==0;}public void set(int pos, int value) { //给pos位置的元素设为valueif(!checkPosInGetAndSet(pos)) {throw new PosException("pos的值不合法");}if(isEmpty()) {throw new EmptyException("顺序表为空");}this.elem[pos]=value;}public void remove(int key) { //删除第一次出现的关键词keyif(isEmpty()) {throw new EmptyException("顺序表为空");}int index=indexOf(key);for(int i=index;i<usedSize-1;i++) {this.elem[i]=this.elem[i+1];}this.usedSize--;}public int size() { //获取顺序表长度return this.usedSize;}public void clear() { //清空顺序表usedSize=0;}
}
2.2 List接口实现顺序表
import java.util.ArrayList;
import java.util.List;
public class Main {public static void main(String[] args) {//ArrayList是一个普通的类,实现了List接口(以下两种实现方式都可以,根据创建的list的类型进行选择)ArrayList<Integer> list = new ArrayList<>();List<Integer> list1 = new ArrayList<>();}
}
3.ArrayList常用方法
方法 | 解释 |
---|---|
boolean add(E e) | 尾插e |
void add(int index,E element) | 将e插入到index位置 |
boolean addAll(Collection<? extends E> c) | 尾插c中的元素 |
E remove(int index) | 删除index位置元素 |
boolean remove(Object o) | 删除遇到的第一个o |
E get(int index) | 获取下标index位置元素 |
E set(int index,E element | 将下标index为止元素设置为element |
void clear( ) | 清空 |
boolean contains(Object o) | 判断o是否在线性表中 |
int indexOf(Object o) | 返回第一个o所在下标 |
int lastIndexOf(Object o) | 返回最后一个o的下标 |
List<E> subList(int fromIndex,int toIndex) | 截取部分list(截取的list仍指向原list) |
4.ArrayList的遍历
4.1 直接打印
ArrayList类重写了toString方法,我们可以使用System.out.println( )直接打印顺序表
import java.util.ArrayList;
public class Main {public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();list.add(1);list.add(2);System.out.println(list);}
}
4.2 for循环或for-each
ArrayList使用数组进行存储,我们可以使用for循环或for-each(两者基本相同)遍历顺序表
import java.util.ArrayList;
public class Main {public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();list.add(1);list.add(2);for (int i = 0; i < list.size(); i++) { //for循环System.out.println(list.get(i));}for (int elem : list) { //for-eachSystem.out.println(elem);}}
}
4.3 迭代器
ArrayList实现了Iterable接口,我们可以创建迭代器对象来打印顺序表
import java.util.ArrayList;
import java.util.Iterator;
public class Main {public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();list.add(1);list.add(2);Iterator<Integer> iterator = list.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}}
}