顺序表(ArrayList)
线性表
线性表:具有n个相同特性数据元素的有限序列
常见的线性表:顺序表、链表、栈、队列……
线性表逻辑结构是线性结构(一条直线),物理结构不一定连续,物理存储通常数组+链式结构
顺序表
顺序表是⽤⼀段物理地址连续的存储单元依次存储数据元素的线性结构
public interface IList {void add(int data) ;void add(int pos, int data);boolean contains(int toFind);int indexOf(int toFind);int get(int pos);void set(int pos, int value);void remove(int toRemove) ;void clear();int size();void display();boolean isFull();boolean isEmpty(); }
import java.util.Arrays; public class MyArrayList implements IList{public int[] array;public int size;//size表示当前列表中实际存储的元素个数public static final int DEFALUT_CAPACITY=3;public MyArrayList(){array=new int[DEFALUT_CAPACITY];}@Overridepublic void add(int data) {if(isFull()){grow(2);}array[size]=data;size++;}public boolean isFull(){return array.length==size;}private void grow(int growNumber){array= Arrays.copyOf(array,growNumber*array.length);}@Overridepublic void add(int pos, int data) {checkPos(pos);if(isFull()){grow(2);}for (int i = size-1; i>=pos ; i--) {array[i+1]=array[i];}array[pos]=data;size++;}private void checkPos(int pos){if(pos<0||pos>size){throw new PosOutOfBoundsException("插入元素时位置异常"+pos);}}@Overridepublic boolean contains(int toFind) {for (int i = 0; i <size ; i++) {if(array[i]==toFind){return true;}}return false;}@Overridepublic int indexOf(int toFind) {for (int i = 0; i <size ; i++) {if(array[i]==toFind){return i;}}return -1;}@Overridepublic int get(int pos) {if (isEmpty()){throw new EmptyException("获取元素顺序表为空");}checkPosByGetOrSet(pos);return array[pos];}private void checkPosByGetOrSet(int pos){if(pos<0||pos>=size){throw new PosOutOfBoundsException("获取元素时位置异常"+pos);}}public boolean isEmpty(){return size==0;}@Overridepublic void set(int pos, int value) {checkPosByGetOrSet(pos);array[pos]=value;}@Overridepublic void remove(int toRemove) {int index=indexOf(toRemove);if(index==-1){System.out.println("顺序表中无要查找的数据");return;}for (int i = 0; i <size-1 ; i++) {array[i]=array[i+1];}size--;}public int size(){return size;}@Overridepublic void clear() {size=0;}@Overridepublic void display() {for (int i = 0; i <size ; i++) {System.out.print(array[i]+" ");}} }
public class EmptyException extends RuntimeException{public EmptyException() {}public EmptyException(String message) {super(message);} }
public class PosOutOfBoundsException extends RuntimeException{public PosOutOfBoundsException() {}public PosOutOfBoundsException(String message) {super(message);} }
public class Test {public static void main(String[] args) {MyArrayList list=new MyArrayList();list.add(100);list.add(11);list.add(22);list.add(33);list.add(44);list.add(55);list.add(66);list.remove(100);list.display();}public static void main4(String[] args) {MyArrayList list=new MyArrayList();list.add(100);list.add(11);list.add(22);list.add(33);list.add(44);list.add(55);list.add(66);list.display();System.out.println();list.set(0,0);list.display();}public static void main3(String[] args) {MyArrayList list=new MyArrayList();list.add(11);list.add(22);list.add(33);list.add(44);list.add(55);list.add(66);System.out.println(list.indexOf(66));System.out.println(list.indexOf(5));System.out.println(list.contains(11));System.out.println(list.contains(1));}public static void main2(String[] args) {MyArrayList list=new MyArrayList();list.display();System.out.println(list.get(0));}public static void main1(String[] args) {MyArrayList list=new MyArrayList();list.add(1);list.add(2);list.add(3);list.add(4);try {list.add(7,5);}catch (PosOutOfBoundsException e){e.printStackTrace();list.add(3,5);}list.add(0,0);list.display();System.out.println();System.out.println("获取元素位置"+list.get(0));System.out.println("获取元素位置"+list.get(5));} }
ArrayList
ArrayList简介
1. ArrayList 是泛型实现的,使用前需实例化
2. 实现了 RandomAccess 接口,支持随机访问
3. 实现了 Cloneable 接口,支持克隆
4. 实现了 Serializable 接口,支持序列化
5. 与 Vector 不同,ArrayList 非线程安全,单线程可用,多线程可选择 Vector 或 CopyOnWriteArrayList
6. 底层是连续空间,支持动态扩容,是动态顺序表
ArrayList使用
创建 ArrayList 对象
添加元素
import java.util.ArrayList; public class MyArrayList {public static void main(String[] args) {ArrayList<String> fruits = new ArrayList<>();// 尾插元素fruits.add("Apple");fruits.add("Banana");// 将元素插入到指定位置(下标从0开始)fruits.add(1, "Cherry");for (int i = 0; i < fruits.size(); i++) {//获取元素System.out.println(fruits.get(i));}} }
获取元素
import java.util.ArrayList; public class MyArrayList {public static void main(String[] args) {ArrayList<Integer> numbers = new ArrayList<>();numbers.add(10);numbers.add(20);numbers.add(30);int num = numbers.get(1);System.out.println(num);// 获取下标为1的元素,结果是20} }
删除元素
import java.util.ArrayList; public class MyArrayList {public static void main(String[] args) {ArrayList<String> colors = new ArrayList<>();colors.add("Red");colors.add("Green");colors.add("Blue");// 删除指定元素,删除遇到的第一个匹配元素colors.remove("Green");// 删除指定下标的元素colors.remove(0);for (int i = 0; i < colors.size(); i++) {//获取元素System.out.println(colors.get(i));}} }
修改元素
import java.util.ArrayList; public class MyArrayList {public static void main(String[] args) {ArrayList<String> names = new ArrayList<>();names.add("Alice");names.add("Bob");names.set(0, "Charlie"); // 将下标为0的元素修改为Charliefor (int i = 0; i < names.size(); i++) {System.out.println(names.get(i));}} }
判断元素是否存在
import java.util.ArrayList; public class MyArrayList {public static void main(String[] args) {ArrayList<String> animals = new ArrayList<>();animals.add("Dog");animals.add("Cat");boolean hasDog = animals.contains("Dog");System.out.println(hasDog);} }
获取元素下标
import java.util.ArrayList; public class MyArrayList {public static void main(String[] args) {ArrayList<String> words = new ArrayList<>();words.add("hello");words.add("world");words.add("hello");int firstIndex = words.indexOf("hello");int lastIndex = words.lastIndexOf("hello");System.out.println(firstIndex);System.out.println(lastIndex);} }
清空列表
import java.util.ArrayList; public class MyArrayList {public static void main(String[] args) {ArrayList<Integer> scores = new ArrayList<>();scores.add(80);scores.add(90);scores.clear();for (int i = 0; i <scores.size() ; i++) {System.out.println(scores.get(i));}} }
截取部分列表
import java.util.ArrayList; import java.util.List; public class MyArrayList {public static void main(String[] args) {ArrayList<String> days = new ArrayList<>();days.add("Monday");days.add("Tuesday");days.add("Wednesday");days.add("Thursday");days.add("Friday");List<String> subDays = days.subList(1, 4);System.out.println(subDays); } }
subList
返回的是 List
接口的实例,应使用 List
类型接收
ArrayList的遍历输出
直接输出
import java.util.ArrayList;public class Test {public static void main(String[] args) {ArrayList<Integer> arrayList=new ArrayList<>();arrayList.add(1);arrayList.add(2);arrayList.add(3);arrayList.add(4);arrayList.add(5);System.out.println(arrayList);} }
for循环下标
import java.util.ArrayList;public class Test {public static void main(String[] args) {ArrayList<Integer> arrayList=new ArrayList<>();arrayList.add(1);arrayList.add(2);arrayList.add(3);arrayList.add(4);arrayList.add(5);for (int i = 0; i <arrayList.size() ; i++) {System.out.print(arrayList.get(i)+" ");}} }
foreach
import java.util.ArrayList;public class Test {public static void main(String[] args) {ArrayList<Integer> arrayList=new ArrayList<>();arrayList.add(1);arrayList.add(2);arrayList.add(3);arrayList.add(4);arrayList.add(5);for (Integer x:arrayList) {System.out.print(x+" ");}} }
迭代
import java.util.ArrayList; import java.util.Iterator;public class Test {public static void main(String[] args) {ArrayList<Integer> arrayList=new ArrayList<>();arrayList.add(1);arrayList.add(2);arrayList.add(3);arrayList.add(4);arrayList.add(5);Iterator<Integer> iterator= arrayList.iterator();while(iterator.hasNext()){System.out.print(iterator.next()+" ");}} }
import java.util.ArrayList; import java.util.Iterator; import java.util.ListIterator;public class Test {public static void main(String[] args) {ArrayList<Integer> arrayList=new ArrayList<>();arrayList.add(1);arrayList.add(2);arrayList.add(3);arrayList.add(4);arrayList.add(5);ListIterator<Integer> listIterator=arrayList.listIterator();while (listIterator.hasNext()){System.out.print(listIterator.next()+" ");}System.out.println();System.out.println("========================");ListIterator<Integer> listIterator1=arrayList.listIterator(1);//下标1的位置开始遍历while (listIterator1.hasNext()){System.out.print(listIterator1.next()+" ");}} }
import java.util.ArrayList; import java.util.Iterator; import java.util.ListIterator;public class Test {public static void main(String[] args) {ArrayList<Integer> arrayList=new ArrayList<>();arrayList.add(1);arrayList.add(2);arrayList.add(3);arrayList.add(4);arrayList.add(5);ListIterator<Integer> listIterator=arrayList.listIterator(arrayList.size());while (listIterator.hasPrevious()){System.out.print(listIterator.previous()+" ");}} }
杨辉三角
import java.util.ArrayList; import java.util.Iterator; import java.util.ListIterator; import java.util.Scanner;public class Test {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int numRows = scanner.nextInt();ArrayList<ArrayList<Integer>> result = new ArrayList<>();ArrayList<Integer> arrayList1 = new ArrayList<>();arrayList1.add(1);result.add(arrayList1);for (int i = 1; i < numRows; i++) {ArrayList<Integer> curRow = new ArrayList<>();curRow.add(1);ArrayList<Integer> preRow = result.get(i - 1);for (int j = 1; j < i; j++) {int val = preRow.get(j - 1) + preRow.get(j);curRow.add(val);}curRow.add(1);result.add(curRow);}System.out.println(result);} }