1. ArrayList简介
在集合框架中,
ArrayList
是一个普通的类,实现了
List
接口。
2. ArrayList使用
// 构造一个空的列表
List<Integer> list1 = new ArrayList<>();//接口引用对象
// 构造一个具有10个容量的列表
List<Integer> list2 = new ArrayList<>(10);
3.ArrayList的扩容机制
- ArrayList是一个动态类型的顺序表,顺序表底层是一个数组,即:在插入元素的过程中会自动扩容:检测是否真正需要扩容,如果是调用grow准备扩容
- 预估需要库容的大小
- 初步预估按照1.5倍大小扩容
- 如果用户所需大小超过预估1.5倍大小,则按照用户所需大小扩容
- 真正扩容之前检测是否能扩容成功,防止太大导致扩容失败
3. 使用copyOf进行扩容
4.Arraylist的遍历:
public static void main(String[] args) {
ArrayList<Integer> list=new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
System.out.println(list);//直接打印
for (int i = 0; i < list.size(); i++) {//for循环
System.out.print(list.get(i));//get获取下标index元素
}
for (Integer x: list) {//for-each方法
System.out.print(x);
}
}
5. ArrayList的模拟实现
class MyArraylist {//顺序表
public int[] elem;//底层是一个数组
public int usedSize;//标记数组当中有效变量有几个
public MyArraylist() {//构造方法
this.elem = new int[5];//分配内存
}
-
新增元素,默认在数组最后新增 add
//一、新增元素,默认在数组最后新增
public void add(int data) {
//1.判断是不是满的
if (isFull()) {
//2.如果是满的就进行扩容
this.elem = copyOf(this.elem, 2 * this.elem.length);//给这个数组扩容2倍,重新赋给elem
}
this.elem[this.usedSize] = data;//将data元素放到usedSize位置
usedSize++;
}
public boolean isFull() {//判断你的数组是不是满的,是否可以存放数据
if (this.usedSize == this.elem.length) {
return true;//满的
}
return false;
}
-
打印顺序表
//二、打印顺序表
public void MyToString() {
for (int i = 0; i < this.usedSize; i++) {
System.out.print(this.elem[i] + " ");
}
}
-
在 pos 位置新增元素
//三、在 pos 位置新增元素
public void add(int pos, int data) {
//0.对pos位置进行判断
if (pos < 0 || pos > this.usedSize) {
System.out.println("pos位置不合法");
return;
}
//1.判断是不是满的
if (isFull()) {
//2.如果是满的就进行扩容
this.elem = copyOf(this.elem, 2 * this.elem.length);//给这个数组扩容2倍,重新赋给elem
}
//2.插入
for (int i = usedSize - 1; i >= pos; i--) {
this.elem[i + 1] = this.elem[i];
}
this.elem[pos] = data;
this.usedSize++;
}
-
判定是否包含某个元素查找某个元素对应的位置contains
//四、判定是否包含某个元素
public boolean contains(int toFind) {
for (int i = 0; i < this.usedSize; i++) {
if (toFind == this.elem[i]) {
return true;
}
}
return false;
}
-
查找某个元素对应的位置indexOf
//五、查找某个元素对应的位置
public int indexOf(int toFind) {
for (int i = 0; i < this.usedSize; i++) {
if (this.elem[i]==toFind){
return i;
}
}
return -1;
}
-
获取 pos 位置的元素 get
//六、获取 pos 位置的元素
public int get(int pos) {
if (pos<0||pos>=this.usedSize){//判断pos位置
System.out.println("pos位置不合法");
throw new RuntimeException("pos位置不合法");//需要抛异常,自定义异常
}
return this.elem[pos];
}
-
给 pos 位置的元素设为 value
//七、给 pos 位置的元素设为 value
public void set(int pos, int value) {
if (pos<0||pos>=this.usedSize){//判断pos位置
System.out.println("pos位置不合法");
}
value=this.elem[pos];//覆盖原来的值
}
-
删除第一次出现的关键字key——remove
//九、删除第一次出现的关键字key
public void remove(int key) {
if (isEmpty()){
System.out.println("空的");
return;
}
int index=indexOf(key);
for (int i =index; i<this.usedSize-1; i++) {
this.elem[i] =this.elem[i+1];
}
this.usedSize--;
// this.elem[this.usedSize]=null;如果是引用数据类型一定要置为空
}
public boolean isEmpty(){
if(this.usedSize==0){
return true;
}
return false;
}
}
-
获取顺序表长度
// 八、获取顺序表长度
public int size() {
return this.usedSize;
}
// 十、清空顺序表
public void clear() {
this.usedSize=0;
/*for (int i = 0; i < this.usedSize; i++) {如果是引用类型,需要置为null;
this.elem[i]=null;//一个对象要被回收,必须是没有人再引用他了,置为null
this.usedSize=0;*/
}
}
public class ArraylistDome {
public static void main(String[] args) {
MyArraylist myArraylist = new MyArraylist();
myArraylist.add(1);
myArraylist.add(2);
myArraylist.add(3);
myArraylist.add(4);
myArraylist.add(5);
myArraylist.add(6);
myArraylist.MyToString();//1
myArraylist.add(0, 70);//2
myArraylist.MyToString();
System.out.println(myArraylist.contains(3));//3
System.out.println(myArraylist.indexOf(70));//4
System.out.println(myArraylist.get(2));
try{
System.out.println(myArraylist.get(10));
}catch (RuntimeException e){
e.printStackTrace();
}
System.out.println("kkkkk");
myArraylist.get(2);
myArraylist.remove(4);
myArraylist.MyToString();
}
}
6.应用
-
扑克牌
import java.util.*;
class CardDome {//找对象 创建对象 使用对象
private int rank;//牌面值
private String suit;//花色
public CardDome(int rank, String suit) {
this.rank = rank;
this.suit = suit;
}
@Override
public String toString() {
return "花色" + suit + "数字" + rank;
}
}
public class SomeCard {
private static final String[] SUITS = {"♥", "♠", "♦", "♣",};//花色都是不变的,定义为常量
public static ArrayList<CardDome> buyCard() {//买牌 返回值ArrayList<CardDome>
ArrayList<CardDome> cards = new ArrayList<>();//52张牌用Arraylist存放,
for (int i = 0; i < 4; i++) {//4种花色
for (int j = 1; j <= 13; j++) {//一次抽取13张牌
String suit = SUITS[i];//实例化对象第一个有花色
int rank = j;//牌数
CardDome card=new CardDome(rank, suit);
cards.add(card);//每张牌都放在cards中
//cards.add(new Card(SUITS[i],j);
}
}
return cards;
}
public static void shuffle( ArrayList<CardDome> cards){//洗牌,洗上面那副牌
Random random=new Random();
for (int i = cards.size()-1; i >0 ; i--) {
int index=random.nextInt(i);//生成一个随机数
CardDome tmp=cards.get(i);//get获取i下标的值
cards.set(i,cards.get(index));//获取到Index的值;set:将获取的值放到i下标
cards.set(index,tmp);//设置index的值等于tmp
}
}
public static void main(String[] args) {
ArrayList<CardDome> cardlist=buyCard();//接收buyCard方法
System.out.println(cardlist);
shuffle(cardlist);
System.out.println("洗牌" + cardlist);
System.out.println("揭牌 ");
ArrayList<ArrayList<CardDome>> hands=new ArrayList();//hands是ArrayList<CardDome>,再放到ArrayList中
ArrayList<CardDome> hand1=new ArrayList<>();
ArrayList<CardDome> hand2=new ArrayList<>();
ArrayList<CardDome> hand3=new ArrayList<>();
hands.add(hand1);
hands.add(hand2);
hands.add(hand3);
for (int i = 0; i < 5; i++) {//5轮揭牌
for (int j = 0; j < 3; j++) {//3个人
CardDome card=cardlist.remove(0);//每次都揭走0下标的牌,删除
hands.get(j).add(card);//j为0是第一个人揭牌,add一张牌
}
}
System.out.println("第1个人的牌"+hand1);
System.out.println("第2个人的牌"+hand2);
System.out.println("第3个人的牌"+hand3);
System.out.println("剩下的牌"+cardlist);
}
}
-
杨辉三角形
import java.util.*;
class Test {
public static List<List<Integer>> generate(int numRows) {
List<List<Integer>> ret = new ArrayList<>();//总的数据
List<Integer> list = new ArrayList<>();//第一行
list.add(1);
ret.add(list);//拿到第一行
for (int i = 1; i < numRows; i++) {
List<Integer> curRow = new ArrayList<>();//当前行
curRow.add(1);
for (int j = 1; j < i; j++) {
List<Integer> perRow = ret.get(i - 1);//拿到上一行
int val = perRow.get(j) + perRow.get(j - 1);
curRow.add(val);
}
curRow.add(1);//最后一个数字
ret.add(curRow);
}
return ret;
}
public static void main(String[] args) {
List<List<Integer>> triangle = generate(5);
System.out.println(triangle);
}
}
//结果:[[1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1]]
i | 三角形 | |||
1 | list | |||
1 | 1 | 1 | curRow | |
2 | 1 | 2 | 1 | |
j | 1 | 2 |