提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
数据结构里,ArrayList是以数组为基础实现的。以扩容,创建新数组的方法来实现数组添加功能。
一、pandas是什么?
代码如下(示例):
package com.lezijie.collection.list;
/**
* 需求:
* 1:存储任意类型 通过泛型搞定
* 2:存储数据的大小交由用户指定 或者自己指定一个合适的大小
*/
public class ArrayList<E> {
private E[] elementsData; // 实际存储元素的容器
private static final int INIT_CAPACITY = 10; // 指定默认情况下数组的初始长度为10
private int size; // 维护当前数组中的待添加的索引位置 维护当前数组的元素个数
private int capacity; // 维护当前数组中的最大存储容量
/**
* 空构造器 创建一个指定长度的数组对象
*/
public ArrayList(){
this(INIT_CAPACITY);
}
/**
* 创建一个带参构造器 创建用户指定长度的数组对象
* @param capacity 用户指定数组长度
*/
public ArrayList(int capacity){
// 初始化存储数据的数组对象
this.elementsData = (E[]) new Object[capacity];
this.capacity = capacity;
}
/**
* 添加元素到指定的索引位置上
* @param e
* @param index
*/
public void add(E e,int index){
// 判定当前index的合法性
checkIndex(index);
// 判定当前数组是否满了
if (size==capacity)
grow(capacity*2);
// 循环挪动元素
for (int i = size;i>index;i--)
elementsData[i] = elementsData[i-1];
//添加元素到index
elementsData[index] = e;
//维护size
size++;
}
/**
* 数组扩容的方法
* @param newCapacity
*/
private void grow(int newCapacity) {
//定义一个新的数组
E[] newElemenetData = (E[]) new Object[newCapacity];
// 进行数组拷贝
for (int i=0;i<size;i++)
newElemenetData[i] = elementsData[i];
//将对象中的elementsData重新进行指向
this.elementsData = newElemenetData;
//维护capacity的值
this.capacity = newCapacity;
}
/**
* 添加首元素
* @param e
*/
public void addFirst(E e){
add(e,0);
}
/**
* 删除指定索引位置上的元素
* @param index 删除索引
* @return 待删除位置的元素
*/
public E remove(int index){
// 判定索引是否有效
checkIndex(index);
// 获取待删除的元素
E ret = elementsData[index];
// 循环挪动元素
for (int i = index;i<size-1;i++)
elementsData[i] = elementsData[i+1];
// 维护索引
size--;
// 将size指向的元素置为null
elementsData[size] = null;
// 是否缩容
if (size==capacity/4&&capacity/2!=0)
grow(capacity/2);
return ret;
}
/**
* 删除指定元素
* @param e
*/
public void remove(Object e){
// 查找该元素是否存在
int index = indexOf((E)e);
if (index==-1)
throw new IllegalArgumentException("element e:"+e+" is not found");
remove(index);
}
/**
* 删除首元素
* @return
*/
public E removeFirst(){
return remove(0);
}
/**
* 删除尾元素
* @return
*/
public E removeLast(){
return remove(size-1);
}
/**
* 查找元素是否存在 如果存在返回对应的索引 如果不存在返回-1
* @param e
* @return
*/
public int indexOf(E e) {
if (e==null){
for (int i = 0;i<size;i++){
if (elementsData[i]==null)
return i;
}
}else{
for (int i = 0;i<size;i++){
if (e.equals(elementsData[i]))
return i;
}
}
return -1;
}
/**
* 查询元素是否包含在集合中
* @param e
* @return
*/
public boolean contains(E e){
return indexOf(e) != -1;
}
/**
* 查询指定位置的元素
* @param index
* @return
*/
public E get(int index){
checkIndex(index);
return elementsData[index];
}
/**
* 修改指定位置上的元素
* @param index
* @param e
*/
public void set(int index,E e){
checkIndex(index);
elementsData[index] = e;
}
/**
* 判定index的合法性
* @param index
*/
private void checkIndex(int index) {
if (index<0 || index>size)
throw new IllegalArgumentException("index out of bounds index:"+index);
}
/**
* 添加元素E到当前的集合中的末尾
* @param e
*/
public void add(E e){
addLast(e);
}
/**
* 添加元素到当前集合中的末尾
* @param e
*/
public void addLast(E e){
if (size==capacity)
grow(capacity*2);
elementsData[size] = e;// 将元素e添加到size指向的索引位置
size++; //维护一下size即可
}
/**
* 查看当前集合是否为空
* @return
*/
public boolean isEmpty(){
return size == 0;
}
/**
* 查询当前集合中的元素个数
* @return
*/
public int getSize(){
return size;
}
public String toString(){
StringBuilder retStr = new StringBuilder();
retStr.append("size:"+size+" [");
for (int i = 0;i<size;++i){
retStr.append(elementsData[i]);
if (i!=size-1)
retStr.append(",");
}
retStr.append("] capacity:"+capacity);
return retStr.toString();
}
}
总结
就是这样,都有注释,大家看代码,一起敲就好了。