ArrayList与顺序表

ArrayList与顺序表

文章目录

线性表

1.顺序表

​ 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。

2.ArrayList的简介

3.ArrayList的使用

各种方法:

方法名 作用
add(E) 尾插
add(int, E) 在任意位置插入
remove(int) 删除任意位置的值
set(int,E) 改变任意位置的值
get(int) 获得任意位置的值
contain(Object) 判断是否包含这个参数
indexof(Object) 通过参数值找到该值的下标
size() 求当前顺序表的大小
subList(int,int) 截取顺序表

注意subList:这里的截取只是把要截取的顺序表下标的地址拿去了,操作的就是原来的顺序表,所以对截取后的顺序表的任何操作对原来的顺序表都有影响。

4.ArrayList的遍历

java 复制代码
        ArrayList<String> arrayList = new ArrayList<>();
        arrayList.add("刘宇豪");
        arrayList.add("今年");
        arrayList.add("20岁啦!");
        System.out.println(arrayList);

        System.out.println("==========================");
        //for遍历
        for (int i = 0; i < arrayList.size(); i++) {
            System.out.println(arrayList.get(i));
        }
        System.out.println("==========================");
        //foreach遍历
        for (String e: arrayList) {
            System.out.println(e);
        }
        System.out.println("==========================");
        //迭代器 iterator用的多一些
        Iterator<String> it = arrayList.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }
        ListIterator<String> it2 = arrayList.listIterator();
        while(it2.hasNext()){
            System.out.println(it2.next());
        }

5.ArrayList的扩容机制

去看源码

【总结】

  1. 检测是否真正需要扩容,如果是调用grow准备扩容
  2. 预估需要库容的大小
    • 初步预估按照1.5倍大小扩容
    • 如果用户所需大小超过预估1.5倍大小,则按照用户所需大小扩容
    • 真正扩容之前检测是否能扩容成功,防止太大导致扩容失败
  3. 使用copyOf进行扩容

6.使用示例

6.1扑克牌

java 复制代码
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;

//抽象牌
class Card{
    private int rank;
    private String suit;

    public Card(int rank, String suit){
        this.rank = rank;
        this.suit = suit;
    }

    @Override
    public String toString() {
        return "" + suit + " " + rank;
    }
}
public class CardDemo {
    private String[] suit = {"❤","♠","♣","♦"};
    //准备一副牌
    public List<Card> buyCards(){
        List<Card> cards = new ArrayList<>(52);
        for (int i = 1; i < 14; i++) {
            for (int j = 0; j < 4; j++) {
                String s = suit[j];
                Card card = new Card(i,s);
                cards.add(card);
            }
        }
        return cards;
    }
    private void swap(List<Card> cards, int i, int j){
        Card tmp = cards.get(i);
        cards.set(i,cards.get(j));
        cards.set(j,tmp);
    }
    //洗牌
    public void shuffle(List<Card> cards){
        Random random = new Random();
        for (int i = cards.size()-1; i > 0 ; i--) {
            int index = random.nextInt(i);
            swap(cards,i,index);
        }
    }
    //揭牌
    public void test(List<Card> cards){
        List<Card> hand1 = new ArrayList<>();
        List<Card> hand2 = new ArrayList<>();
        List<Card> hand3 = new ArrayList<>();

        List<List<Card>> hands = new ArrayList<>();
        hands.add(hand1);
        hands.add(hand2);
        hands.add(hand3);
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 3; j++) {
                Card card = cards.remove(0);
                hands.get(j).add(card);
            }
        }
        for (int i = 0; i < hands.size(); i++) {
            System.out.println("第"+ (i+1) + "个人的牌");
            System.out.println(hands.get(i));
        }
        System.out.println("剩余的牌 ");
        for (int i = 0; i < cards.size(); i++) {
            System.out.print(cards.get(i)+" ");
        }
    }
}

6.2杨辉三角

java 复制代码
    public static List<List<Integer>> generate(int numRows) {
        List<List<Integer>> ret = new ArrayList<>();

        ArrayList<Integer> list1 = new ArrayList<>();
        list1.add(1);//每行第一列元素都是1
        ret.add(list1);//第一行元素
        //从第二行开始
        for (int i = 1; i < numRows; i++) {
            ArrayList<Integer> list2 = new ArrayList<>();
            list2.add(1);//每行第一个元素准备
            //准备前一行
            List<Integer> prevRow = ret.get(i-1);
            //从每行第二列开始
            for (int j = 1; j < i; j++) {
                //从第三行第二列开始,每列等于上一行的同一列的值+前一列的值
                list2.add(prevRow.get(j)+prevRow.get(j-1));
            }
            //每行最后一列元素都是1
            list2.add(1);
            ret.add(list2);
        }
        return ret;
    }

[118. 杨辉三角 - 力扣(LeetCode)]()

7.心得

d(1);

ret.add(list2);

}

return ret;

}

[[118. 杨辉三角 - 力扣(LeetCode)](https://leetcode.cn/problems/pascals-triangle/submissions/)]()

## 7.心得

顺序表适合用于查找数据,对于查找时间复杂度是O(1),是一个简单的哈希表。
相关推荐
xlsw_2 小时前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
神仙别闹2 小时前
基于java的改良版超级玛丽小游戏
java
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭3 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
暮湫3 小时前
泛型(2)
java
超爱吃士力架3 小时前
邀请逻辑
java·linux·后端
南宫生3 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
转码的小石3 小时前
12/21java基础
java
李小白664 小时前
Spring MVC(上)
java·spring·mvc
GoodStudyAndDayDayUp4 小时前
IDEA能够从mapper跳转到xml的插件
xml·java·intellij-idea
菜鸡中的奋斗鸡→挣扎鸡4 小时前
滑动窗口 + 算法复习
数据结构·算法