项目优化和List集合

一、项目优化

1.分析情况    

当前情况

2.使用泛型和Object优化项目

import com.qfedu.student.system.myexception.IllegalCapacityException;

import com.qfedu.student.system.myexception.OverflowMaxArraySizeException;

/**

* 自定义数据存储工具,MyList用于存储代码中操作的数据

*

* @author Anonymous

*

* @param 使用泛型满足更多的情况

*/

public class MyList {

/**

* 保存数据的底层Object数组,可以保存任意数据类型,但是在操作方法是会

* 对操作的数据类型,通过泛型进行约束操作

*/

private Object[] elementData = null;

/**

* DEFAULT_CAPACITY 默认容量,这里是一个带有名字的常量

*/

private static final int DEFAULT_CAPACITY = 10;

/**

* 数组最大容量,是int类型最大值 - 8 -8等我给你讲

*/

private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

/**

* 当前底层Object数组中有效元素个数

*/

private int size = 0;

/**

* 无参数构造方法,使用DEFAULT_CAPACITY约束初始化容量

*/

public MyList() {

elementData = new Object[DEFAULT_CAPACITY];

}

/**

* 提供给用户可以指定初始化容量的操作方法

*

* @param initCapacity 用户指定的初始化容量,但是必须在合理范围以内

* @throws IllegalCapacityException 用户指定的初始化容量超出范围

*/

public MyList(int initCapacity) throws IllegalCapacityException {

if (initCapacity < 0 || initCapacity > MAX_ARRAY_SIZE) {

throw new IllegalCapacityException("Input Parameter is Invalid!");

}

elementData = new Object[initCapacity];

}

/**

* 添加方法,添加在创建MyList对象是约束的具体数据类型

*

* @param e 通过泛型约束的具体数据类型

* @return 添加成功返回true, 否则返回false

* @throws OverflowMaxArraySizeException

*/

public boolean add(E e) throws OverflowMaxArraySizeException {

if (size == elementData.length) {

// 添加操作是一个元素,最小容量要求就是在原本的数组容量之上 + 1

grow(size + 1);

}

elementData[size] = e;

size += 1;

return true;

}

/**

* 删除保存在MyList中的指定元素

*

* @param obj 用户指定的元素

* @return 删除成功返回true,否则返回false

*/

public boolean remove(Object obj) {

int index = indexOf(obj);

return remove(index);

}

/**

* 删除指定下标的的元素

*

* @param index 用户指定的下标位置

* @return 删除成功返回true,否则返回false

*/

public boolean remove(int index) {

if (index < 0 || index >= size) {

return false;

}

for (int i = index; i < size - 1; i++) {

elementData[i] = elementData[i + 1];

}

// 原本最后一个有效元素位置赋值为null

elementData[size - 1] = null;

// 有效元素个数 - 1

size -= 1;

return true;

}

/**

* 根据指定元素,找出对应的下标位置,没有找到返回-1

*

* @param obj 用户传入的元素

* @return 找到元素返回值大于等于0,没有找到返回-1

*/

public int indexOf(Object obj) {

int index = -1;

for (int i = 0; i < size; i++) {

if (obj.equals(elementData[i])) {

index = i;

break;

}

}

return index;

}

/**

* 替换修改方法,使用指定元素替换指定下标的元素

*

* @param index 指定的下标位置,约束在合理范围以内

* @param e 泛型约束的指定数据类型,保证数据类型一致化

* @return 被替换掉的元素。如果没有被替换的元素,返回null

*/

public E set(int index, E e) {

if (index < 0 || index >= size) {

return null;

}

// 取出原本的元素

E temp = (E) elementData[index];

elementData[index] = e;

return temp;

}

/**

* 返回当前MyList底层数组中保存有效元素个数是多少个

*

* @return 返回当前MyList底层数组中有效元素个数

*/

public int size() {

return size;

}

/**

* 判断当前MyList中是否为空

*

* @return 如果是空返回true,否则返回false

*/

public boolean isEmpty() {

return 0 == size;

}

/**

* 判断指定元素是否在MyList底层数组中存在

*

* @param obj 用户指定的元素

* @return 存在返回true,不存在返回false

*/

public boolean contains(Object obj) {

return indexOf(obj) > -1;

}

/**

* 根据指定下标位置,获取对应的元素

*

* @param index 指定下标位置

* @return 对应的元素,如果不存在,返回null

*/

public E get(int index) {

return index > -1 && index < size ? (E) elementData[index] : null;

}

/**

* 类内私有化方法,用于在添加元素过程中,出现当前底层数组容量不足的情况下 对底层数组进行扩容操作,满足使用要求

*

* @param minCapacity 添加操作要求的最小容量

* @throws OverflowMaxArraySizeException 数组容量超出最大范围

*/

private void grow(int minCapacity) throws OverflowMaxArraySizeException {

// 1. 获取原数组容量

int oldCapacity = elementData.length;

// 2. 计算得到新数组容量,新数组容量大约是原数组容量的1.5倍

// >> 1 右移一位 该操作是二进制操作 等价于 / 2 效率略高

int newCapacity = oldCapacity + (oldCapacity >> 1);

// 3. 判断新数组容量是否满足最小容量要求

if (minCapacity > newCapacity) {

newCapacity = minCapacity;

}

// 4. 判断当前容量是否超出了MAX_ARRAY_SIZE

if (newCapacity > MAX_ARRAY_SIZE) {

throw new OverflowMaxArraySizeException("Overflow MAX_ARRAY_SIZE");

}

// 5. 创建新数组

Object[] temp = new Object[newCapacity];

// 6. 数据拷贝

for (int i = 0; i < oldCapacity; i++) {

temp[i] = elementData[i];

}

// 7. 使用allStus保存新数组首地址

elementData = temp;

}

}

二、List接口

1.List接口概述

    List接口特征:1.数据存储可重复。2.有序,添加顺序和保存顺序一致。

    --|    ArrayList    可变长数组

    --|    LinkedList    双向链表

    --|    Vector     线程安全的课变长数组

2.List常用方法

    增:

        boolean add(E e);    List接口继承Collection接口 add方法,使用操作和Collection一致,并且这里采用的添加方式是【尾插法】。

        boolean add(int index, E e);    List接口【特有方法】,在指定位置添加指定元素。

        boolean addAll(Collection c);    List接口继承Collection接口 addAll方法,使用操作和Collection一致,并且这里采用的添加方式是【尾插法】。

        boolean addAll(int index, Collection c);    List接口【特有方法】,在指定下标位置,添加另一个集合中所有内容

    删:

        E remove(int index);    List接口【特有方法】,获取指定下标位置的元素。

        boolean remove(Object obj);    List接口继承Collection接口方法。删除集合中的指定元素

        boolean removeAll(Collection c);    List接口继承Collection接口方法。删除当前集合中和参数集合重复元素。

        boolean retainAll(Collection c);    List接口继承Collection接口方法。保留当前集合中和参数集合重复元素。

        clear();    List接口继承Collection接口方法。清空整个集合中的所有元素。

    改:

        E set(int index, E e);    List接口【特有方法】,使用指定元素替代指定下标的元素,返回值是被替换的元素。

    查:

        int size();    List接口继承Collection接口方法。获取集合中有效元素个数

        boolean isEmpty();    List接口继承Collection接口方法。判断当前集合是否为空

        boolean contains(Object obj);    List接口继承Collection接口方法。判断指定元素是否包含在当前集合中

        boolean containsAll(Collection c);    List接口继承Collection接口方法。判断参数集合是不是当前集合在子集合

        Object[] toArray();    List接口继承Collection接口方法。获取当前集合中所有元素Object数组

        E get(int index);    List接口【特有方法】。获取指定下标对应的元素

        List subList(int fromIndex, int toIndex);    List接口【特有方法】。获取当前集合指定子集合,从fromIndex开始,到toIndex结束。fromIndex <= 范围 < toIndex

        int indexOf(Object obj);    List接口【特有方法】。获取指定元素在集合中第一次出现位置

        int lastIndexOf(Object obj);    List接口【特有方法】。获取指定元素在集合中最后一次出现的位置

3.List接口常用方法演示

演示
演示

三、ArrayList

    1.ArrayList概述    

        ArrayList是在Java中集合非常重要的一个组装,基于数组玩横的数据结构。可边长数组操作!

        底层保存数据的是一个Object类型数组。

        ArrayList使用的方法都是List接口中的方法,有两个需要了解的成员方法;

            ensureCapacity();  判断方法,用于确定当前底层数组的容量是否满足当前操作的需求。

            trimToSize();  节省空间,将底层数组的容量所溶质有效元素个数

            需要掌握的是关于ArrayList效率相关的问题和细节问题。

    2.效率问题

图例

    3.内存地址

        内存地址概念 : 计算机中为了更好的使用内存,操作程序,完成代码。将内存按照最小单位,进行编号处理。最小单位: 字节 byte。从编号为0内存开始,到内存的最大值。地址的展示方式是十六进制。

    4.内存地址对于CPU有什么关系

        CPU就是根据内存地址,可以直达内存所在区域,执行对应代码。精准而优雅,速度非常快!!!

    5.数组空间地址关系

分析图

    6.null到底是什么

        null是计算机中非常特殊的一块内存,该内存编号 0x0000 0000

        该内存收到系统保护    不只是电脑,包裹手机,ipad,智能设备,只要存在计算机基本结构的设备上都存在null编号为0x0内存。大小一个字节

        不能读取该内存的任何数据,也不能写入任何数据。一旦操作,程序直接被系统杀死kill-9

        一般用于引用数据类型的初始化,利用开发中关于null的异常,辅助找出代码中的错误。

        NullPointerException

你可能感兴趣的:(项目优化和List集合)