目录
1. ArrayList 顺序表简介
上一篇的博客我们简单的介绍了顺序表,就顺序表的增删查改我们也自主实现了他的功能,但是上篇的博客是我们对顺序表的方法的自己的展现,这篇我们主要来讲解ArrayList的自己的方法.主要是通过源码去认识
首先对于我们的ArrayList,它有自己的三个构造方法,那么第一个为什么说它的初始容量是10呢?
数组类型是object类型的.
public class Test2 {
public static void main(String[] args) {
ArrayList<Integer> arrayList = new ArrayList<>();
arrayList.add(1);
arrayList.add(2);
System.out.println(arrayList);
}
}
当我们在写一个ArrayList时候,当直接输出的时候,我们发现输出的不是我们的写的元素的地址,输出的直接就我们的元素
之前我们说要是没有我们的toString方法,那么返回的就是地址
我们在我们的ArrayList的父类中找到有这样的方法,子类继承父类,可以调用父类的方法
那么输出的两个顺序表的元素应该是一致的
2. ArrayList常见操作
int lastIndexOf(Object o) | |
上面的方法就是我们的顺序表的一些操作,当然我们在前面的博客中给大家都展示过了,当时我是自己写方法去模拟实现的.
那么有一个subList没有给大家实现过,那么就来操作一下这个方法
public static void main(String[] args) {
ArrayList<Integer> arrayList = new ArrayList<>();
arrayList.add(1);
arrayList.add(2);
arrayList.add(3);
arrayList.add(4);
for (int i = 0; i < arrayList.size(); i++) {
System.out.print(arrayList.get(i)+" ");
}
System.out.println();
for (Integer integer:arrayList) {
System.out.print(integer+" ");
}
Iterator<Integer> it = arrayList.listIterator();
while(it.hasNext()){
System.out.print(it.next() + " ");
}
}
3. ArrayList的扩容机制
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 100; i++) {
list.add(i);
}
}
这样的一段代码,我们是在顺序表中存储0--99这100个元素,那么在我们的顺序表中,初始的空间大小是10,那么此时我们的顺序表就需要去扩容,那么我们来看看它的扩容机制是怎么样的
那么问题来了:初始的容量是10,那我需要11个呢?那你是不是扩容就是15个,其他的14个我用不到,是不是就浪费了.所以这就是顺序表的一个不好处,会产生空间的浪费.
4. 使用示例
1.扑克牌
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class PlayCards {
public static final String[] SUITS = {"♠", "♥", "♣", "♦"};//四个花色
// 买一副牌
private static List<PlayCard> buyDeck() {
List<PlayCard> deck = new ArrayList<>(52);
for (int i = 0; i < 4; i++) {
for (int j = 1; j <= 13; j++) {
String suit = SUITS[i];
int rank = j;
PlayCard playCard = new PlayCard();
playCard.rank = rank;
playCard.suit = suit;
deck.add(playCard);
}
}
return deck;
}
private static void swap(List<PlayCard> deck, int i, int j) {
PlayCard playCard = deck.get(i);
deck.set(i, deck.get(j));
deck.set(j, playCard);
}
private static void shuffle(List<PlayCard> deck) {
Random random = new Random(20190905);
for (int i = deck.size() - 1; i > 0; i--) {
int r = random.nextInt(i);
swap(deck, i, r);
}
}
public static void main(String[] args) {
List<PlayCard> deck = buyDeck();
System.out.println("刚买回来的牌:");
System.out.println(deck);
shuffle(deck);
System.out.println("洗过的牌:");
System.out.println(deck);
// 三个人,每个人轮流抓 5 张牌
List<List<PlayCard>> hands = new ArrayList<>();
hands.add(new ArrayList<>());
hands.add(new ArrayList<>());
hands.add(new ArrayList<>());
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 3; j++) {
hands.get(j).add(deck.remove(0));
}
}
System.out.println("剩余的牌:");
System.out.println(deck);
System.out.println("A 手中的牌:");
System.out.println(hands.get(0));
System.out.println("B 手中的牌:");
System.out.println(hands.get(1));
System.out.println("C 手中的牌:");
System.out.println(hands.get(2));
}
}
public class PlayCard {
public int rank; // 牌面值
public String suit; // 花色
@Override
public String toString() {
return "{" + rank +
", " + suit +
'}';
}
}
扑克牌就是对我们的顺序表的一个应用,能更好的帮助我们熟悉顺序表
那么我们的顺序表到此就结束了,前面我有提到一个问题,就是我们的顺序表在有些时候会浪费我们的空间,并且在我们进行增删的时候,我们的代码的空间复杂度也比较大,当插入一个元素的时候,我们的后面的其他元素也要进行移动,比较麻烦,那么要解决这样的一个问题,我们的有了我们的列表,那么列表的知识将会在未来的两三天时间给大家写出,敬请期待.