java 数据结构ArrayList类

目录

什么是List

线性表

顺序表

ArrayList类

ArrayList无参方法

ArrayList有参方法

?通配符

ArrayList 的remove方法

ArrayList 的subList方法

Iterator:迭代器

使用ArrayList完成杨辉三角


什么是List

在集合框架中,List是一个接口,继承自Collection

注意:List是个接口,并不能直接用来实例化

Collection也是一个接口,该接口中规范了后序容器中常用的一些方法,具体如下所示:

List中提供好了的方法,具体如下:


线性表

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

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

顺序表

其实是一个动态扩容的数组

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

接口的实现:

public class SeqList {
private int[] array;
private int size;
// 默认构造方法
SeqList(){ }
// 将顺序表的底层容量设置为initcapacity
SeqList(int initcapacity){ }
// 新增元素,默认在数组最后新增
    public void add(int data) { }
// 在 pos 位置新增元素
    public void add(int pos, int data) { }
// 判定是否包含某个元素
    public boolean contains(int toFind) { return true; }
// 查找某个元素对应的位置
    public int indexOf(int toFind) { return -1; }
// 获取 pos 位置的元素
    public int get(int pos) { return -1; }
// 给 pos 位置的元素设为 value
    public void set(int pos, int value) { }
//删除第一次出现的关键字key
    public void remove(int toRemove) { }
// 获取顺序表长度
    public int size() { return 0; }
// 清空顺序表
    public void clear() { }
// 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的
    public void display() { }
}


ArrayList类

在集合框架中,ArrayList是一个普通的类,实现了List接口,具体框架图如下:

说明

1. ArrayList是以泛型方式实现的,使用时必须要先实例化

2. ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问

3. ArrayList实现了Cloneable接口,表明ArrayList是可以clone的

4. ArrayList实现了Serializable接口,表明ArrayList是支持序列化的

5. 和Vector不同,ArrayList不是线程安全的,在单线程下可以使用,在多线程中可以选择Vector或者CopyOnWriteArrayList

6. ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表


ArrayList无参方法

无参一开始的时候没有分配内存,当调用add方法的时候才分配内存,因为底层代码进行扩容等一系列操作

    public static void main2(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(0, 99);

        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i) + " ");
        }
        System.out.println();
        System.out.println(list);

结论:

第一次Add的是会分配大小为10的内存

对于ArrayList来说,都是以1.5倍进行扩容


ArrayList有参方法

简单点说把一整个集合的一组内容拿过来填充到link里

    public static void main3(String[] args) {
        LinkedList<Integer> link = new LinkedList<>();
        link.add(1);
        link.add(2);
        link.add(3);

        ArrayList<Number> list2 = new ArrayList<>(link);
        list2.add(21);
        list2.add(22);
        System.out.println(list2);

下面通配符中解释了有参方法的传递以及注意的点

?通配符

?就是你传入的变量的指定的泛型类型就是图中list的Integer

E就是图中的list12的泛型类型Number

c就是List

只要实现了Collection接口的都能传,还有传入的类型得是list12 Number的子类或者本身


ArrayList 的remove方法

在使用 remove(Object o) 方法从列表中移除特定对象时,需要传递一个与要移除的对象逻辑上相等的新对象作为参数。这是因为 remove(Object o) 方法会根据对象的相等性来确定要移除的元素

    public static void main5(String[] args) {
        LinkedList<Integer> link = new LinkedList<>();
        link.add(1);
        link.add(2);
        link.add(3);

        ArrayList<Number> list2 = new ArrayList<>(link);
        list2.add(21);
        list2.add(22);
        System.out.println(list2);

        list2.remove(2);
        list2.remove(new Integer(2));
        System.out.println(list2);

    }


ArrayList 的subList方法

    public static void main7(String[] args) {
        LinkedList<Integer> link = new LinkedList<>();
        link.add(1);
        link.add(2);
        link.add(3);

        //不会产生新的对象
        List<Integer> link1 = link.subList(1, 3);
        System.out.println(link1);
        link1.set(0, 99);
        System.out.println(link1);
        System.out.println(link);
    }

如图所示subList方法不是创建一个新的arraylist对象,subList 返回的对象实际上是原始列表的一个引用,它指向原始列表中指定范围的元素,简单说就是把那一段的地址给到了list1


Iterator:迭代器

public static void main11(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);

        //迭代器
        Iterator<Integer> it = list.iterator();
        //Iterator<Integer> it1 = list.listIterator();
        while (it.hasNext()) {
            System.out.print(it.next() + " ");
        }
        System.out.println();
    }

使用ArrayList完成杨辉三角

public 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);//第一个下标设置为1

            List<Integer> preRow = ret.get(i - 1);//上一行

            //下标从一开始,因为已经设置了第一个下标了
            for (int j = 1; j < i; j++) {
                int val = preRow.get(j) + preRow.get(j - 1);
                curRow.add(val);//存进当前行
            }
            curRow.add(1);//当前行循环结束后,最后一个下标设置为1
            ret.add(curRow);//然后把当前添加到ret二维数组里
        }
        return ret;
    }

  • 22
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值