浅学一下算法

这篇博客探讨了数组的基本概念,包括其长度固定和二维数组的本质。此外,文章详细介绍了方法调用的顺序,并提及ArrayList在存储数组方面的优势,如隐藏底层复杂性并支持泛型。最后,提到了final关键字在方法和变量修饰中的作用。
摘要由CSDN通过智能技术生成

数组、二维数组、可变参数、稀疏数组

数组定义:通过连续的存储空间,存储相同类型(内存宽度相同)元素的集合

数组的长度一旦指定不可以改变

二维数组本质上就是一维数组

关于方法调用的顺序

1:类型完全匹配

2:顺序最近优先

3:顺序包装类

4:顺序可变参数

ArrayList

数组:

size=length

0≤索引≤length-1

元素的地址=首元素地址+(索引×元素宽度)

ArrayList:构建一个集合,用来存储数组

1:可以屏蔽掉底层存储的复杂度

2:实际存储选择使用数组进行

集合可以存储任意类,可以用泛型<E>来解决此问题

final关键词:

修饰方法后,此方法不可被继承;

修饰变量后,如果是基本数据变量则变量不能改变;如果是引用型数据变量则在对其初始化之后便不能再让其指向另一个对象

ArrayList类:

package com.collection.list;

/**
 * 需求:
 *      1:存储任意类型 通过泛型搞定
 *      2:存储数据的大小交由用户指定 或者自己指定一个合适的大小
 */
public class ArrayList<E> {

    private E[] elementsData; // 实际存储元素的容器
    private static final int INIT_CAPACITY = 10; // 指定默认情况下的初始长度为10
    private int size; // 维护当前数组中待添加的索引位置 维护当前数组的元素个数

    /**
     * 空构造器 创建一个指定长度的数组对象
     */
    public ArrayList(){
        this(INIT_CAPACITY);
    }

    /**
     * 创建一个带参数的构造器 创建用户指定长度的数组对象
     * @param capacity
     */
    public ArrayList(int capacity){
        // 初始化存储数据的数组对象
        this.elementsData = (E[]) new Object[capacity];
    }

    /**
     * 添加元素E到当前的集合中(末尾)
     * @param e
     */
    public void add(E e){
        addLast(e);
    }

    /**
     * 添加元素E到集合的指定(index)位置
     * @param e
     * @param index
     */
    public void add(E e,int index){
        checkIndex(e,index);
        // 将要添加的位置后元素整体向后移动
        for (int i=size;i>index;i--)
            elementsData[i] = elementsData[i-1];
        // 指定位置添加元素
        elementsData[index] = e;
        // 维护size
        size++;
    }

    /**
     * 添加元素E到集合的指定(index)位置
     * @param e
     * @param index
     */
    public void checkIndex(E e,int index){
        /**
         * 判断index索引是否合法
         * 1:index不能小于0
         * 2:index不能大于size【防止数组中出现内存碎片】,
         * 更不能大于capacity(数组长度)【防止下标越界】
         */
        if (index < 0 || index > size){
            throw new IllegalArgumentException("index out of bounds index" + index);
        }
    }


    /**
     * 添加元素E到当前的集合末尾
     * @param e
     */
    public void addLast(E e){
        elementsData[size] = e; // 将元素e添加到size指向的索引位置
        size++; // 维护一下size即可
    }

    /**
     * 查看当前集合是否为空
     * @return
     */
    public boolean isEmpty(){
        return size == 0;
    }

    /**
     * 查询当前集合中的元素个数
     * @return
     */
    public int getSize(){
        return size;
    }

    public String toString(){
        StringBuffer retStr = new StringBuffer();
        retStr.append("size:"+size+"  [");
        for (int i=0;i<size;i++){
            retStr.append(elementsData[i]);
            if (i != size-1)
                retStr.append(",");
        }
        retStr.append("]");
        return retStr.toString();
    }

    public static void main(String[] args) {
        /**
         * 测试ArrayList类
         */
        ArrayList a = new ArrayList(5);
        System.out.println(a.isEmpty());
        a.add(1);
        a.add(2);
        a.add(3);
        System.out.println(a.isEmpty());
        System.out.println(a.getSize());
        System.out.println(a.toString());
        a.add(4,1);
        System.out.println(a.toString());
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值