数据结构-ArrayList

这篇具有很好参考价值的文章主要介绍了数据结构-ArrayList。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

线性表

顺序表

ArrayList

ArrayList的使用

ArrayList的构造方法

ArrayList的常用方法

ArrayList的遍历

实现简单的ArrayList

洗牌算法

删除公共字符串问题

杨辉三角


线性表

线性表是n个具有相同特性的数据元素的有限序列.线性表是一种在实际中广泛使用的数据结构.常见的线性表有顺序表,链表,栈和队列等等.

线性表在逻辑上是线性结构,也就是说是连续的一条直线.但是在物理结构上并不一定是连续的,线性表在物理上存储的时候,通常是以数组和链式结构的形式存储.

顺序表

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

ArrayList

在集合框架中,ArrayList是一个普通的类,实现了List接口.

数据结构-ArrayList,数据结构

1. ArrayList 实现了 RandomAccess 接口,表明 ArrayList 支持随机访问
2. ArrayList 实现了 Cloneable 接口,表明 ArrayList 是可以 clone
3. ArrayList 实现了 Serializable 接口,表明 ArrayList 是支持序列化的
4. Vector 不同, ArrayList 不是线程安全的,在单线程下可以使用,在多线程中可以选择 Vector或者 CopyOnWriteArrayList
5. ArrayList 底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表

ArrayList的使用

ArrayList的构造方法

数据结构-ArrayList,数据结构

数据结构-ArrayList,数据结构 第二种构造方法,实现了collection接口的都可以传进来.但是需要注意的是E是泛型通配符的上界,只有类型相同是E或者是E的子类的时候,才可以传进来.

当我们调用不带参数的构造方法的时候,只有第一个add的时候,我们才会为其分配大小为10的内存.

扩容是采用1.5倍的扩容方式.如果用户所需大小超过预估的1.5倍大小,则按照用户所需大小进行扩容,并且在真正的扩容之前会检测能否扩容成功,防止太大导致扩容失败.扩容是采用copyOf进行扩容.


ArrayList的常用方法

数据结构-ArrayList,数据结构

subList方法需要注意的是:截取的部分并没有创建新的顺序表,而是新的引用(截取的部分)还是指向了原来的顺序表.所以修改截取部分的内容就是将原来顺序表的内容给修改了.

对于remove需要注意的是,编译器会将我们传入的int类型的值统一认定为是下标而不是实际内容的值.

比如有一个ArrayList:[1,7]两个元素.

public static void main(String[] args) {
    ArrayList<Integer> arrayList = new ArrayList<>();
    arrayList.add(1);
    arrayList.add(7);
    System.out.println(arrayList);
    //我们要删除值为7的元素
    //arrayList.remove(7);//编译器会把7当成下标,而不是实际的值,所以我们执行起来会报越界错.
    //正确的做法是传入一个引用类型
    arrayList.remove(new Integer(7));
}

ArrayList的遍历

ArrayList的遍历有三种:for循环+下标的方式,foreach,和迭代器.

public static void main(String[] args) {
    ArrayList<Integer> arrayList = new ArrayList<>();
    arrayList.add(1);
    arrayList.add(2);
    arrayList.add(3);
    arrayList.add(4);
    //for循环+下标
    for (int i = 0; i < arrayList.size(); i++) {
        System.out.printf(arrayList.get(i)+" ");
    }
    System.out.println();
    //foreach
    for (int x:arrayList) {
        System.out.printf(x+" ");
    }
    System.out.println();
    //使用迭代器
    //必须实现了Iterable接口
    Iterator<Integer> it = arrayList.iterator();
    while (it.hasNext()){
        //it指向上一个数据
        //it.next()会使it访问下一个元素并且向下走一步
        System.out.printf(it.next()+" ");
    }
    System.out.println();
}

实现简单的ArrayList

import java.util.Arrays;

public class MyArrayList {
    public int[] elem;//数组
    public int usedSize;//记录有效的数据的个数
    public static final int DEFAULT_SIZE = 10;

    public MyArrayList(){
        this.elem = new int[DEFAULT_SIZE];
    }

    // 打印顺序表
    public void display() {
        for (int i = 0;i < this.usedSize; i++){
            System.out.print(this.elem[i]+" ");
        }
        System.out.println();
    }
    // 新增元素,默认在数组最后新增
    public void add(int data) {
        //1.检查当前的顺序表是不是满了
        if (isFull()){
            //2.如果满了就要扩容
            this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
        }
        //3.
        this.elem[usedSize] = data;
        //4.
        usedSize++;
    }

    public boolean isFull(){
        if (this.usedSize > elem.length){
            return true;
        }
        return false;
    }

    // 在 pos 位置新增元素
    //负数下标不可以
    //越过数组的长度不可以
    //不能隔着元素放
    public void add(int pos, int data) throws PosWrongfulException {
        if (isFull()){
            System.out.println("满了!");
            this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
        }
        if (pos < 0 || pos > this.usedSize){
            System.out.println("pos的位置不合法!");
            throw new PosWrongfulException("Pos位置不合法!");
        }

        //pos一定是合法的
        //1.开始挪动数据
        for (int i = this.usedSize-1; i >= pos; i--) {
            this.elem[i+1] = this.elem[i];
        }
        //2.插入数据
        this.elem[pos] = data;
        //3.usedSize++
        usedSize++;
    }
    // 判定是否包含某个元素
    public boolean contains(int toFind) {
        for (int i = 0; i < this.usedSize; i++) {
            if (elem[i] == toFind){
                return true;
            }
        }
        return false;
    }
    // 查找某个元素对应的位置
    public int indexOf(int toFind) {
        for (int i = 0; i < this.usedSize; i++) {
            if (this.elem[i] == toFind){
                return i;
            }
        }
        return -1;
    }
    // 获取 pos 位置的元素
    public int get(int pos) {
        //判空
        if (isEmpty()){
            throw new EmptyException("当前顺序表为空!");
        }
        //判断pos位置的合法性
        if (pos < 0 || pos >= this.usedSize){
            throw new PosWrongfulException("get获取元素的时候,Pos位置不合法!");
        }
        return this.elem[pos];
    }
    //判空
    public boolean isEmpty(){
        return size() == 0;
    }
    // 给 pos 位置的元素更新为 value
    public void set(int pos, int value) {
        //判空
        if (isEmpty()){
            throw new EmptyException("当前顺序表为空!");
        }
        //判断pos位置的合法性
        if (pos < 0 || pos >= this.usedSize){
            throw new PosWrongfulException("pos位置不合法!");
        }
        this.elem[pos] = value;
    }
    //删除第一次出现的关键字key
    public void remove(int key) {
        if (isEmpty()){
            throw new EmptyException("顺序表为空!");
        }
        int index = this.indexOf(key);
        if (index == -1){
            System.out.println("没有这个数字!");
            return;
        }
        // 9 3 4 8 6
        // 0 1 2 3 4
        //usedSize==5,i<4,i最大到3
        //index==4的情况下直接不走循环,usedSize--即可.
        for (int i = index; i <size()-1 ; i++) {
            this.elem[i] = this.elem[i+1];
        }
        usedSize--;
    }
    // 获取顺序表长度
    public int size() { return this.usedSize; }
    // 清空顺序表
    public void clear() {
        this.usedSize = 0;
    }

}

洗牌算法

使用ArrayList实现三个人轮流摸牌的过程.

1.先买一副扑克牌,四种花色,每种花色13张.

2.洗牌

3.揭牌,每人按序摸一张,总共摸五轮.文章来源地址https://www.toymoban.com/news/detail-537614.html

public class Poker {
    //花色
    private String suit;
    //数值
    private int rank;

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

    public void setSuit(String suit) {
        this.suit = suit;
    }

    public void setRank(int rank) {
        this.rank = rank;
    }

    public String getSuit() {
        return suit;
    }

    public int getRank() {
        return rank;
    }

    @Override
    public String toString() {
        return "["+"suit= " + suit + ", rank=" + rank +"]";
    }
}
import java.util.ArrayList;
import java.util.List;
import java.util.Random;



//1.买一副扑克牌
//2.洗牌
//3.三个人轮流揭牌,每个人揭5次
public class Pokers {
    public static final String[] SUITS = {"♥","♠","♣","♦"};

    /**
     *买一副扑克牌
     */

    public static List<Poker> bugPokers(){
        List<Poker> pokerList = new ArrayList<>();
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 13; j++) {
                String suit = SUITS[i];
                int rank = j;
                Poker poker = new Poker(suit,rank);
                pokerList.add(poker);
            }
        }
        return pokerList;
    }
    //洗牌
    public static void shuffle(List<Poker> list){
        Random random = new Random();
        for (int i = list.size()-1; i > 0 ; i--) {
            int index = random.nextInt(i);
            swap(list,i,index);
        }
    }

    private static void swap(List<Poker> list, int i, int index) {
        Poker tmp = list.get(i);
        list.set(i,list.get(index));
        list.set(index,tmp);
    }

    public static void main(String[] args) {
        List<Poker> list = bugPokers();
        System.out.println("买牌:"+list);
        //洗牌
        shuffle(list);
        System.out.println("洗牌:"+list);
        //揭牌 3个人 每个人轮流抓五张牌
        //1.如何描述3个人
        List<Poker> hand1 = new ArrayList<>();
        List<Poker> hand2 = new ArrayList<>();
        List<Poker> hand3 = new ArrayList<>();
        //2.如何区分往哪个人手里送牌
        List<List<Poker>> hand = 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++) {
                List<Poker> handTmp = hand.get(j);
                handTmp.add(list.remove(0));
            }
        }
        for (int i = 0; i < hand.size(); i++) {
            System.out.println("第"+(i+1)+"个人的牌是:"+hand.get(i));
        }
        System.out.println("剩余的牌是: "+ list);
    }
}

删除公共字符串问题

//删除第一个字符串当中出现的第二个字符串中的字符,使用集合
//str1:welcome to bit
//str2:come
//输出wel t bit
//需要注意的是contains方法传的是一个字符串,字符+""就是将字符传为字符串,也可以字符包装类的toString方法将一个字符转为字符串
public static void main(String[] args) {
    String s1 = "welcome to bit";
    String s2 = "come";
    ArrayList<Character> arrayList = new ArrayList<>();
    for (int i = 0; i < s1.length(); i++) {
        if (!s2.contains(s1.charAt(i)+"")){
            arrayList.add(s1.charAt(i));
        }
    }
    for (Character a:arrayList) {
        System.out.printf(a.toString());
    }
}

杨辉三角

public List<List<Integer>> generate(int numRows) {
    List<List<Integer>> ret = new ArrayList<>();
    List<Integer> list1 = new ArrayList<>();
    list1.add(1);
    ret.add(list1);
    for (int i = 1; i <numRows ; i++) {
        //当前行
        List<Integer> curRow = new ArrayList<>();
        curRow.add(1);//一行中开始的1
        //前一行
        List<Integer> prevRow = ret.get(i-1);
        //中间位置需要计算
        for (int j = 1; j < i; j++) {
            int num = prevRow.get(j)+prevRow.get(j-1);
            curRow.add(j,num);
        }
        curRow.add(1);//一行中最后的那个1
        ret.add(curRow);
    }
    return ret;
}

到了这里,关于数据结构-ArrayList的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [JAVA数据结构]顺序表ArrayList

    目录 1.线性表 2.顺序表 3.ArrayList简介 4.ArrayList的使用  4.1ArrayList的构造方法 4.2ArrayList的常用操作 4.3ArrayList的遍历方法 4.4ArrayList的扩容机制 5.ArrayList的具体运用 ArrayList是一种基于数组的数据结构,是线性表的一种,也是顺序表。 通俗来说,线性表是一种线性结构,在逻辑上

    2023年04月26日
    浏览(40)
  • 【数据结构(二)】顺序表与ArrayList

    ❣博主主页: 33的博客❣ ▶文章专栏分类:数据结构◀ 🚚我的代码仓库: 33的代码仓库🚚 🫵🫵🫵 关注我带你学更多数据结构知识 在计算机科学中,数据结构是处理和组织数据的方法和技术。顺序表是一种常见的线性表数据结构,它基于数组实现,提供了快速的随机访问能力

    2024年04月12日
    浏览(38)
  • 【数据结构】从顺序表到ArrayList类

    线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列… 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,

    2024年01月24日
    浏览(46)
  • Java 中数据结构ArrayList的用法

    ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。 ArrayList 继承了 AbstractList ,并实现了 List 接口。 add() 将元素插入到指定位置的 arraylist 中 addAll() 添加集合中的所有元素到 arraylist 中 clear() 删除 arraylist 中的所

    2024年02月10日
    浏览(42)
  • 数据结构 之 顺序表 ArrayList (Java)

    🎉欢迎大家观看AUGENSTERN_dc的文章(o゜▽゜)o☆✨✨ 🎉感谢各位读者在百忙之中抽出时间来垂阅我的文章,我会尽我所能向的大家分享我的知识和经验📖 🎉希望我们在一篇篇的文章中能够共同进步!!! 🌈个人主页: AUGENSTERN_dc 🔥个人专栏: C语言  |  Java | 数据结构 ⭐个

    2024年03月17日
    浏览(34)
  • Collection与数据结构 顺序表与ArrayList

    线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表: 顺序表、链表、栈、队列… 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,

    2024年04月13日
    浏览(42)
  • 数据结构(Java实现)-ArrayList与顺序表

    什么是List List是一个接口,继承自Collection。 List的使用 List是个接口,并不能直接用来实例化。 如果要使用,必须去实例化List的实现类。在集合框架中,ArrayList和LinkedList都实现了List接口。 线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 常见的线性表

    2024年02月11日
    浏览(36)
  • 探索Java集合框架—数据结构、ArrayList集合

    Java集合的使用相信大家都已经非常得心应手,但是我们怎么做到知其然,更知其所以然这种出神入化的境界呢?我们揭开集合框架底层神秘面纱来一探究竟 目录 一、背景介绍 二、思路方案 数据结构是什么? 数据结构可以分为线性和非线性两种数据结构 线性数据结构: 非

    2024年02月10日
    浏览(39)
  • [java数据结构] ArrayList和LinkedList介绍与使用

    (一) 线性表 (二) ArrayList 1. ArrayList的介绍 2. ArrayList的常见方法和使用 3. ArrayList的遍历 4. ArrayList的模拟实现 5. ArrayList的优缺点 (三) LinkedList 1. LinkedList的介绍 2. LinkedList的常见方法和使用 3. LinkedList的遍历 4. LinkedList的模拟实现 5. LinkedList的优缺点 (四) ArrayList和LinkedList的区别

    2024年01月21日
    浏览(44)
  • 【数据结构与算法】1、学习动态数组数据结构(基本模拟实现 Java 的 ArrayList 实现增删改查)

    🍃 数据结构是 计算机 存储 、 组织 数据的方式 🎉 线性 结构 线性表(数组、链表、栈、队列、哈希表) 🎉 树形 结构 二叉树 AVL 树 红黑树 B 树 堆 Trie 哈夫曼树 并查集 🎉 图形 结构 邻接矩阵 邻接表 🎁 线性表是具有 n 个 相同类型元素 的有限 序列 (n = 0) a1 是首节点

    2024年02月10日
    浏览(75)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包