1.线性表
线性表(Linear List)是一种基本的数据结构,它是由n(n≥0)个具有相同类型的数据元素组成的有限序列。 线性表是⼀种在实际中⼴泛使⽤ 的数据结构,常⻅的线性表:顺序表、链表、栈、队列...
线性表在逻辑上是线性结构,也就说是连续的⼀条直线。但是在物理结构上并不⼀定是连续的,线性 表在物理上存储时,通常以数组和链式结构的形式存储。
2.顺序表
顺序表(Sequential List)是线性表的一种最常用的存储方式,它利用一组连续的存储单元依次存储线性表中的各个元素,从而使得逻辑上相邻的元素在物理位置上也相邻。⼀般情况下采⽤数组存储。 在数组上完成数据的增删查改。
3.ArrayList简介
ArrayList
是Java集合框架中一个非常常用的类,它实现了 List
接口,是一个动态数组,即长度可以自动增长的数组。以下从多个方面对 ArrayList
进行详细介绍:
3.1特点
- 动态数组:与普通的固定长度数组不同,
ArrayList
的长度是可以动态变化的。当向ArrayList
中添加元素时,如果当前容量不足,它会自动扩容,以容纳更多的元素。 - 有序性:
ArrayList
会按照元素添加的顺序来存储元素,这意味着可以通过索引来精确地访问和操作元素,支持随机访问。例如,可以使用get(int index)
方法快速获取指定索引位置的元素。 - 允许重复元素:
ArrayList
允许存储重复的元素,这使得在需要存储多个相同元素的场景下非常方便。 - 可存储多种类型元素:
ArrayList
是一个泛型类,可以存储各种类型的对象(包括自定义对象),但不能存储基本数据类型(如int
、double
等),不过可以使用对应的包装类(如Integer
、Double
)。
3.2实现原理
- 内部存储结构:
ArrayList
内部是通过一个数组来存储元素的。这个数组会在ArrayList
创建时被初始化,并随着元素的添加和删除而动态调整大小。 - 扩容机制:当
ArrayList
中的元素数量达到当前容量时,它会进行扩容。扩容的过程通常是创建一个新的更大的数组,将原数组中的所有元素复制到新数组中,然后将新元素添加到新数组中。一般来说,新数组的容量是原数组容量的 1.5 倍(不同版本可能略有差异)。
注意:ArrayList是以泛型方式实现的,使用时必须要先实例化。
4.ArrayList的使用
4.1ArrayList的构造
4.2ArrayList常见操作
4.3Arraylist的遍历
遍历ArrayList的三种方式:for循环+下标,foreach循环,使用迭代器循环。
5.ArryList的具体使用方法
5.1杨辉三角
5.2洗牌
public class Card {public int rank; //牌面值public String suit; //花色public Card(int rank, String suit) {this.rank = rank;this.suit = suit;}@Overridepublic String toString() {return String.format("[%s %d]", suit, rank);}}
public class CardDemo {public static final String[] SUITS={"♠", "♥", "♣", "♦"};//牌的花色public static List<Card> buyCard(){List<Card> cardList=new ArrayList<>();for (int i = 0; i < SUITS.length; i++) {for (int j = 1; j <=13; j++) {Card card=new Card(j,SUITS[i]);//生成52张牌cardList.add(card);//存放到顺序表cardList中}}return cardList;}public static void shuffle(List<Card> cardList){for (int i = cardList.size()-1; i >0 ; i--) {Random random=new Random();int index=random.nextInt(i);//获取一个0—i的随机值swap(cardList,i,index);//交换每一张牌的顺序}}private static void swap(List<Card> cardList,int x,int y){Card tmp=cardList.get(x);cardList.set(x,cardList.get(y));cardList.set(y,tmp);}public static void main(String[] args) {List<Card> cardList=buyCard();System.out.println(cardList);System.out.println("洗牌");shuffle(cardList);System.out.println(cardList);List<Card> hand0=new ArrayList<>();List<Card> hand1=new ArrayList<>();List<Card> hand2=new ArrayList<>();//定义存放牌的三个顺序表List<List<Card>> hands=new ArrayList<>();//定义一个二维顺序表hands.add(hand0);hands.add(hand1);hands.add(hand2);//将三个顺序表存放到二维顺序表中for (int i = 0; i < 5; i++) {for (int j = 0; j < 3; j++) {//每个人抽五张牌Card card=cardList.remove(0);//将顺序表中第一个元素拿出,并删除第一个元素,持续拿删hands.get(j).add(card);//将取出的元素放到一维顺序表中}}System.out.println(hand0);System.out.println(hand1);System.out.println(hand2);System.out.println("剩余牌");System.out.println(cardList);}
}