ArrayList简介
在集合框架中,ArrayList是一个普通的类,实现了List接口,具体框架图如下:
【说明】
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);
}
打印
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()+" ");
}
}
删除
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 + " ");
}
}
}
截取部分 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);
}
练习:删除第一个字符串中出现的第二个字符串中的字符
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);
}
}
模拟发放扑克牌
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);
}
}
复习专用!