ArrayList与顺序表

目录

ArrayList简介

在集合框架中,ArrayList是一个普通的类,实现了List接口,具体框架图如下:
ArrayList与顺序表【说明】
1. ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问
2. ArrayList实现了Cloneable接口,表明ArrayList是可以clone的
3. ArrayList实现了Serializable接口,表明ArrayList是支持序列化的
3. 和Vector不同,ArrayList不是线程安全的,在单线程下可以使用,在多线程中可以选择Vector或者
CopyOnWriteArrayList
4. ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表

ArrayList的构造

方法 解释
ArrayList() 无参构造
ArrayList(Collection<? extends E> c) 利用其他 Collection 构建 ArrayList
ArrayList(int initialCapacity) 指定顺序表初始容量
public static void main(String[] args) { 
// ArrayList创建,推荐写法 
// 构造一个空的列表
 List<Integer> list1 = new ArrayList<>();

**注:**当调用这个方法时,顺序表大小是0;当第一次add的时候,会变成10,扩容是1.5倍扩容。

// 构造一个具有10个容量的列表
 List<Integer> list2 = new ArrayList<>(10);
  list2.add(1);
   list2.add(2);
    list2.add(3);
     // list2.add("hello"); // 编译失败,List<Integer>已经限定了,list2中只能存储整形元素

**注:**扩容还是1.5倍。

    public static void main6(String[] args) {
        ArrayList<String> list1 = new ArrayList<>();//初始的大小是几?答案是0
        list1.add("haha!");//当第一次存放数据元素的时候,顺序表被分配大小为10
        System.out.println(list1);
        ArrayList<String> list2 = new ArrayList<>(13);//初始大小是指定的13
    }

// list3构造好之后,与list中的元素一致 
ArrayList<Integer> list3 = new ArrayList<>(list);
// 避免省略类型,否则:任意类型的元素都可以存放,使用时将是一场灾难
 List list4 = new ArrayList(); 
 list4.add("111"); 
 list4.add(100);

ArrayList常见操作

尾插

public static void main(String[] args) {

        ArrayList<String> list2 = new ArrayList<>();
        list2.add("hello");
        list2.add("world");
        list2.add("haha");
        System.out.println(list2);
    }

ArrayList与顺序表

打印

public static void main(String[] args) {
        ArrayList<String> list2 = new ArrayList<>();
        list2.add("hello");
        list2.add("world");
        list2.add("haha");
        System.out.println(list2);
        System.out.println("================");
        for(int i = 0; i< list2.size();i++) {
            System.out.print (list2.get(i)+" ");
        }
        System.out.println();
        System.out.println("==================");
        for (String s : list2) {
            System.out.print(s+" ");
        }
        System.out.println();
        System.out.println("========迭代器打印==========");
        Iterator<String> it = list2.iterator();
        while (it.hasNext()) {
            System.out.print(it.next()+" ");
        }

        System.out.println();
        System.out.println("========迭代器List相关打印==========");
        ListIterator<String> it2 = list2.listIterator();
        while (it2.hasNext()) {
            System.out.print(it2.next()+" ");
        }
    }

ArrayList与顺序表

删除

public static void main(String[] args) {
        ArrayList<String> list2 = new ArrayList<>();
        list2.add("hello");
        list2.add("world");
        list2.add("haha");
        Iterator<String> it = list2.iterator();
        while (it.hasNext()) {
            String ret = it.next();
            if(ret.equals("hello")) {
                it.remove();//首先需要使用next方法迭代出集合中的元素 ,然后才能调用remove方法
            }else {
                System.out.print(ret + " ");
            }
        }

        System.out.println();
        System.out.println("========迭代器List相关打印==========");
        ListIterator<String> it2 = list2.listIterator();
        while (it2.hasNext()) {
            String ret = it2.next();
            if(ret.equals("hello")) {
                it2.remove();//首先需要使用next方法迭代出集合中的元素 ,然后才能调用remove方法
            }else {
                System.out.print(ret + " ");
            }
        }
    }

ArrayList与顺序表

截取部分 list

 public static void main(String[] args) {
        ArrayList<String> list2 = new ArrayList<>();
        list2.add("a");
        list2.add("c");
        list2.add("g");
        list2.add("a");
        list2.add("o");
        List<String> sub = list2.subList(1, 3);
        System.out.println(sub);
        System.out.println(list2);
        System.out.println("==================");
        sub.set(0, "p");
        System.out.println(sub);
        System.out.println(list2);
    }

ArrayList与顺序表

练习:删除第一个字符串中出现的第二个字符串中的字符

 public static void main(String[] args) {
        String str1 = "welcome to china";
        String str2 = "come";
        System.out.println(str1);
        ArrayList<Character> list = new ArrayList<>();
        for (int i = 0; i < str1.length(); i++) {
            char ch = str1.charAt(i);
            if (!str2.contains(ch + "")) { 
                list.add(ch);
            }
        }

        for (char ch : list) {
            System.out.print(ch);
        }
    }

ArrayList与顺序表

模拟发放扑克牌

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 "[ "+this.suit+":"+this.rank+" ]";
    }
}

//没有大小王:1 2 3 。。。。。。10 11 12 13
public class TestDemo2 {

    private static final String[] suits = {"♥","♠","♣","♦"};

    public static List<Card> buyCard() {
        ArrayList<Card> cards = new ArrayList<>();
        for (int i = 0; i < 4; i++) {
            for (int j = 1; j <= 13; j++) {
                /*String suit = suits[i];
                int rank = j;
                Card card = new Card(rank,suit);
                cards.add(card);*/
                cards.add(new Card(j,suits[i]));
            }
        }
        return cards;
    }

    private static void swap(List<Card> cards,int i,int j) {
        //Card tmp = cards[i];
        Card tmp = cards.get(i);
        //cards[i] = cards[j];
        cards.set(i,cards.get(j));
        //cards[j] = tmp;
        cards.set(j,tmp);
    }

    public static void shuffle(List<Card> cards) {
        int size = cards.size();
        for (int i = size-1; i > 0 ; i--) {
            Random random = new Random();
            int rand = random.nextInt(i);
            swap(cards,i,rand);
        }
    }

    public static void main(String[] args) {
        List<Card> cards = buyCard();
        System.out.println("买牌:"+cards);
        shuffle(cards);
        System.out.println("洗牌:"+cards);

        System.out.println("揭牌:3个人每个人轮流揭5张牌");

        ArrayList<List<Card>> hand = new ArrayList<>();

        List<Card> hand1 = new ArrayList<>();
        List<Card> hand2 = new ArrayList<>();
        List<Card> hand3 = new ArrayList<>();

        hand.add(hand1);
        hand.add(hand2);
        hand.add(hand3);
        //每个人,轮流揭牌
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 3; j++) {
                Card card = cards.remove(0);
                hand.get(j).add(card);
            }
        }
        System.out.println("第1个人的牌:"+hand1);
        System.out.println("第2个人的牌:"+hand2);
        System.out.println("第3个人的牌:"+hand3);
        System.out.println("剩下的牌:"+cards);
    }

    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> ret = new ArrayList<>();
        //第一行:
        List<Integer> list1 = new ArrayList<>();
        list1.add(1);
        ret.add(list1);//才把第一行的数据存放到了ret当中
        for (int i = 1; i < numRows; i++) {
            List<Integer> list = new ArrayList<>();
            list.add(1);//每一行的开始都是1
            List<Integer> preRow = ret.get(i-1);//上一行
            for (int j = 1; j < i ; j++) {
                //中间的情况
                int num1 = preRow.get(j)+preRow.get(j-1);
                list.add(num1);
            }
            list.add(1);//每一行的结尾都是1
            ret.add(list);
        }
        return ret;
    }

    public static void main1(String[] args) {
        Card card = new Card(3,"♥");
        System.out.println(card);
    }
}

ArrayList与顺序表复习专用!

上一篇:【leetcode】两个列表的最小索引总和 c++


下一篇:Java List和Array之间的转换