目录
一、代码思路及初步定义
通过源码进行分析,要想集合可以保存数据,就必须得有另一个数组容器才可。
首先创建一个Object的数组容器obs,任意给定一个数组大小。
//通过源码分析,要想集合可以保存数据,必须得有员工数组容器才可以
Object[] obs = new Object[4];
//元素的个数
int size;
根据jdk中ArrayList具有的功能分析,初步定义获取当前集合元素的个数size()方法、添加元素add()、获取元素get()、修改指定位置的元素set()、根据索引删除元素remove()、删除所有元素removeAll()。
/**
* 获取当前集合中元素的个数
*/
public int size(){
return 0;
}
/**
* 添加元素(考虑如何扩容)
*/
public void add(Object obj){
}
/**
* 获取元素(根据索引获取元素)
*/
public Object get(int index){
return null;
}
/**
* 修改指定位置的元素
*/
public void set(int index,Object value){
}
/**
* 根据索引来删除元素
*/
public void remove(int index){
}
/**
* 删除所有元素
*/
public void removeAll(){
}
二、功能代码具体实现
1、add()
在编写添加元素方法时需要考虑到对数组进行扩容。使用>>将数组扩容到原始数组的1.5倍。
/**
* 添加元素(考虑如何扩容)
*/
public void add(Object obj){
int oldlength = obs.length;
//如果添加元素后的size超出了原始数组长度obs.length,需要考虑要对数组进行扩容
if (size > oldlength){
//进行扩容
//扩容到原始数组长度的1.5倍
int newlength = oldlength + (oldlength >> 1);
//拷贝数组,将旧的数组元素拷贝到新的数组中。
obs = Arrays.copyOf(obs,newlength);
}
//添加元素
obs[size] = obj;
size++;
}
newlength :定义变量存储扩容后的数组长度
copyof()方法:将数组进行复制,在jdk帮助文档中查找到copyof()的使用方法如下:
2、get()
根据索引值获取对应的元素
要注意考虑到数组越界异常问题,通过throw进行异常处理
/**
* 获取元素(根据索引获取元素)
*/
public Object get(int index){
if (index < 0 || index >= size){
throw new IndexOutOfBoundsException("超出数组索引的范围...need:"+size+"param:=>"+index);
}
return obs[index];
}
3、set()
修改指定位置的元素
/**
* 修改指定位置的元素
*/
public void set(int index,Object value){
if (index < 0 || index >= size){
throw new IndexOutOfBoundsException("超出数组索引的范围...need:"+size+"param:=>"+index);
}
obs[index] = value;
}
4、remove()
根据索引来删除元素
/**
* 根据索引来删除元素
*/
public void remove(int index){
//校验参数
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException("超出数组索引的范围...need:"+size+"param:=>"+index);
}
//把当前索引的下一个元素一直到最后一个元素依次前移
for (int i = index; i < size - 1; i++) {
obs[i] = obs[i + 1];
}
size--;
}
5、removeAll()
删除所有元素
/**
* 删除所有元素
*/
public void removeAll(){
//第一种
// size = 0;
// obs = empthArray;
for (int i = 0; i < obs.length; i++) {
obs[i] = null;
}
size = 0;
}
6、size()
获取当前集合中元素的个数
/**
* 获取当前集合中元素的个数
*/
public int size(){
return size;
}
三、主方法实现
public static void main(String[] args) {
MyArrayList myArrayList = new MyArrayList();
myArrayList.add("aa");
myArrayList.add("bb");
myArrayList.add("cc");
myArrayList.add(123);
myArrayList.add(123.123);
int size = myArrayList.size();
System.out.println(size);
Object o = myArrayList.get(3);
System.out.println(o);
//测试数组越界
// System.out.println(myArrayList.get(6));
myArrayList.remove(1);
System.out.println(myArrayList.get(1));
myArrayList.set(0,"abc");
System.out.println(myArrayList.get(0));
myArrayList.removeAll();
System.out.println(myArrayList.size);
// for (int i = 0; i < myArrayList.size; i++) {
// System.out.println(myArrayList.get(i));
// }
System.out.println(myArrayList);
}
四、全部功能代码
package com.icss.demo;
import java.util.ArrayList;
import java.util.Arrays;
/**
* 自定义集合
*/
public class MyArrayList {
//通过源码分析,要想集合可以保存数据,必须得有员工数组容器才可以
Object[] obs = new Object[4];
//默认的空数组
Object[] empthArray = {};
//元素的个数
int size;
public static void main(String[] args) {
MyArrayList myArrayList = new MyArrayList();
myArrayList.add("aa");
myArrayList.add("bb");
myArrayList.add("cc");
myArrayList.add(123);
myArrayList.add(123.123);
int size = myArrayList.size();
System.out.println(size);
Object o = myArrayList.get(3);
System.out.println(o);
//测试数组越界
// System.out.println(myArrayList.get(6));
myArrayList.remove(1);
System.out.println(myArrayList.get(1));
myArrayList.set(0,"abc");
System.out.println(myArrayList.get(0));
myArrayList.removeAll();
System.out.println(myArrayList.size);
// for (int i = 0; i < myArrayList.size; i++) {
// System.out.println(myArrayList.get(i));
// }
System.out.println(myArrayList);
}
/**
* 获取当前集合中元素的个数
*/
public int size(){
return size;
}
/**
* 添加元素(考虑如何扩容)
*/
public void add(Object obj){
//如果size超过原始数组长度
//原始数组的长度
int oldCapacity = obs.length;
if (size >= oldCapacity){
//考虑扩容
//扩容为原始数组长度的1.5倍
int newCapacity = oldCapacity + (oldCapacity >> 1);
//拷贝数组,将旧的数组元素拷贝到新的数组中。
obs = Arrays.copyOf(obs, newCapacity);
}
//添加元素
obs[size] = obj;
//长度需要改变
size++;
}
/**
* 获取元素(根据索引获取元素)
*/
public Object get(int index){
if (index >= size){
throw new IndexOutOfBoundsException("超出数组索引的范围...need:"+size+"param:=>"+index);
}
return obs[index];
}
/**
* 修改指定位置的元素
*/
public void set(int index,Object value){
if (index < 0 || index >= size){
throw new IndexOutOfBoundsException("超出数组索引的范围...need:"+size+"param:=>"+index);
}
obs[index] = value;
}
/**
* 根据索引来删除元素
*/
public void remove(int index){
//校验参数
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException("超出数组索引的范围...need:"+size+"param:=>"+index);
}
//把当前索引的下一个元素一直到最后一个元素依次前移
for (int i = index; i < size - 1; i++) {
obs[i] = obs[i + 1];
}
size--;
}
/**
* 删除所有元素
*/
public void removeAll(){
//第一种
// size = 0;
// obs = empthArray;
for (int i = 0; i < obs.length; i++) {
obs[i] = null;
}
size = 0;
}
@Override
public String toString() {
return "MyArrayList{" +
"obs=" + Arrays.toString(obs) +
", empthArray=" + Arrays.toString(empthArray) +
", size=" + size +
'}';
}
}