自定义ArrayList类,自定义arraylist
分享于 点击 32373 次 点评:59
自定义ArrayList类,自定义arraylist
自定义动态数组MyArrayList,实现ArrayList的部分方法,理解ArrayList的方法原理。
一,定义MyArrayList
//初始数组名
private Object[] array ;
//默认容量大小
private static final int defaule_capacity = 10;
//MyArrayList中包含的元素的数量
private int size;
//数组的初始长度
private int initialCapacity;
构造函数
写了两个构造函数,第一个构造函数没有参数,实例化后默认大小为10;第二个构造函数带有大小参数,实例化为指定大小。
//构造方法1
public MyArrayList() {
this.initialCapacity = defaule_capacity;
array = new Object[defaule_capacity];
}
//构造方法2
public MyArrayList(int initialCapacity) {
if(initialCapacity > 0) {
this.initialCapacity = initialCapacity;
array = new Object[initialCapacity];
}
else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
方法一:public int size()
//返回array中所含元素的个数
public int size() {
return size;
}
方法二:public E get(int index)
//返回array下标为index的元素的值
public E get(int index){
//这里用的不是initialCapacity,因为size才表示存储的元素的个数,
//initialCapacity仅仅是开辟的数组的空间大小,后面一部分多出来的内容自然是没有存数据的
if(index<0 || index>=size) {
throw new IndexOutOfBoundsException();
//否则return null
}
//这里需要强制转换为E类型
return (E)array[index];
}
方法三:public E set(int index,E e)
//自定义更改下标为index的元素值的方法
public E set(int index,E e) {
//这里需要进行强制类型转换
E oldvalue = (E) array[index];
if(index<0 || index>=size) {
throw new IndexOutOfBoundsException();
//否则return null
}
array[index] = e;
return oldvalue;
}
方法四:public void add(E e)
//自定义添加元素的方法
public void add(E e) {
if(size < initialCapacity) {
//size指的是array中元素的个数
//这里从下标0~size-1表示的是size个元素,那么新添加进去的元素应该处于下标为size的位置上
array[size] = e;
size++;
}else {
//容量扩大一倍
Object newArray[] = new Object[2*initialCapacity];
//将array中的元素重新存入更新容量后的newArray数组中去
for(int i = 0;i<size;i++) {
newArray[i] = array[i];
}
newArray[size] = e;
initialCapacity = initialCapacity*2;
array = newArray;
size++;
}
}
方法五:public E remove(int index)
//自定义移除下标为index的元素的方法
public E remove(int index) {
//这里需要进行强制类型转换
E oldvalue = (E) array[index];
if(index<0 || index>=size) {
throw new IndexOutOfBoundsException();
//否则return null
}
//如果需要移除的是最后一个元素,那么直接移除,然后size--
if(index == size-1){
array[index] = null;
size--;
return oldvalue;
}
//如果移除的是第一个或者中间的元素,那么该index下标前面的元素的下标保持不变,后面的元素依次向前移一位
for(int i = index;i<size;i++) {
array[i] = array[i+1];
}
array[size-1] = null;
size--;
return oldvalue;
}
方法六:public E add(int index,E e)
//自定义在array中添加元素的方法
public E add(int index,E e) {
//这里需要进行强制类型转换
E oldvalue = (E) array[index];
if(index<0 || index>=size) {
throw new IndexOutOfBoundsException();
//否则return null
}
//这里先将array的size先增加1,原来 的下标为size的值表示的null,表示并没有添加元素,
//现在去使用它,首先将它初始化为0
int n = 0;
if(size +1 < initialCapacity) {//开辟空间足够,不用增加空间
//接下来需要将index以及它后边的元素,依次向后移一位
for(int i = size-1;i>=index;i--) {
array[size - n] = array[i];
n++;
}
array[index] = e;
size++;
}else {//原来开辟的空间不够,需要另外new新的数组来保存元素
//容量扩大一倍
Object newArray[] = new Object[2*initialCapacity];
//将array中的元素重新存入更新容量后的newArray数组中去
for(int i = 0;i<size;i++) {
newArray[i] = array[i];
}
newArray[size] = 0;
initialCapacity = initialCapacity*2;
array = newArray;
//接下来需要将index以及它后边的元素,依次向后移一位
for(int i = size-1;i>=index;i--) {
array[size - n] = array[i];
n++;
}
array[index] = e;
size++;
}
return oldvalue;
}
方法七:public void clear()
//清除array中所有的元素
public void clear() {
for(int i = 0;i<size;i++) {
array[i] = null;
}
size = 0;
}
测试
另外定义了一个Test类,来调用以上写的方法,结果如下:
一,首先自己添加6个不同类型的对象,然后调用get()方法打印输出这6个对象。
list.add(2);
list.add(2.3333);
list.add(new Object());
list.add(new MyArrayList(15));
list.add("hello!");
//list.add(null);
list.add(true);
二,随机添加若干个Animal对象元素(在同包下定义的一个Animal类)
结果如下:
三,调用set方法,替换index下标的元素值
四,调用remove方法,将下标为index的元素移除
五,调用add方法,在指定的index位置上添加元素
六,调用clear方法,移除array中的所有元素
方法已经验证完毕!
进行这些方法的编写是为了更好的理解动态数组ArrayList的操作原理。
当然,ArrayList还有其他一些方法,以上方法只是实际中常用的一些方法。
源代码:
package ArrayList;
//<E>表示支持泛型
/*
* Java的ArrayList
* 方法
* 1.构造方法
* 2.size()*
* 3.get(index)*
* 4.clear()
* 5.add(e)*
* 6.set(index,e)*
* 7.remove(index)*
* 8.add(index,e)
*/
import java.util.ArrayList;
public class MyArrayList <E>{
//初始数组名
private Object[] array ;
//默认容量大小
private static final int defaule_capacity = 10;
//MyArrayList中包含的元素的数量
private int size;
//数组的初始长度
private int initialCapacity;
//构造方法1
public MyArrayList() {
this.initialCapacity = defaule_capacity;
array = new Object[defaule_capacity];
}
//构造方法2
public MyArrayList(int initialCapacity) {
if(initialCapacity > 0) {
this.initialCapacity = initialCapacity;
array = new Object[initialCapacity];
}
else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
//返回array中所含元素的个数
public int size() {
return size;
}
//返回array下标为index的元素的值
public E get(int index){
//这里用的不是initialCapacity,因为size才表示存储的元素的个数,
//initialCapacity仅仅是开辟的数组的空间大小,后面一部分多出来的内容自然是没有存数据的
if(index<0 || index>=size) {
throw new IndexOutOfBoundsException();
//否则return null
}
//这里需要强制转换为E类型
return (E)array[index];
}
//清除array中所有的元素
public void clear() {
for(int i = 0;i<size;i++) {
array[i] = null;
}
size = 0;
}
//自定义添加元素的方法
public void add(E e) {
if(size < initialCapacity) {
//size指的是array中元素的个数
//这里从下标0~size-1表示的是size个元素,那么新添加进去的元素应该处于下标为size的位置上
array[size] = e;
size++;
}else {
//容量扩大一倍
Object newArray[] = new Object[2*initialCapacity];
//将array中的元素重新存入更新容量后的newArray数组中去
for(int i = 0;i<size;i++) {
newArray[i] = array[i];
}
newArray[size] = e;
initialCapacity = initialCapacity*2;
array = newArray;
size++;
}
}
//自定义更改下标为index的元素值的方法
public E set(int index,E e) {
//这里需要进行强制类型转换
E oldvalue = (E) array[index];
if(index<0 || index>=size) {
throw new IndexOutOfBoundsException();
//否则return null
}
array[index] = e;
return oldvalue;
}
//自定义移除下标为index的元素的方法
public E remove(int index) {
//这里需要进行强制类型转换
E oldvalue = (E) array[index];
if(index<0 || index>=size) {
throw new IndexOutOfBoundsException();
//否则return null
}
//如果需要移除的是最后一个元素,那么直接移除,然后size--
if(index == size-1){
array[index] = null;
size--;
return oldvalue;
}
//如果移除的是第一个或者中间的元素,那么该index下标前面的元素的下标保持不变,后面的元素依次向前移一位
for(int i = index;i<size;i++) {
array[i] = array[i+1];
}
array[size-1] = null;
size--;
return oldvalue;
}
//自定义在array中添加元素的方法
public E add(int index,E e) {
//这里需要进行强制类型转换
E oldvalue = (E) array[index];
if(index<0 || index>=size) {
throw new IndexOutOfBoundsException();
//否则return null
}
//这里先将array的size先增加1,原来 的下标为size的值表示的null,表示并没有添加元素,
//现在去使用它,首先将它初始化为0
int n = 0;
if(size +1 < initialCapacity) {//开辟空间足够,不用增加空间
//接下来需要将index以及它后边的元素,依次向后移一位
for(int i = size-1;i>=index;i--) {
array[size - n] = array[i];
n++;
}
array[index] = e;
size++;
}else {//原来开辟的空间不够,需要另外new新的数组来保存元素
//容量扩大一倍
Object newArray[] = new Object[2*initialCapacity];
//将array中的元素重新存入更新容量后的newArray数组中去
for(int i = 0;i<size;i++) {
newArray[i] = array[i];
}
newArray[size] = 0;
initialCapacity = initialCapacity*2;
array = newArray;
//接下来需要将index以及它后边的元素,依次向后移一位
for(int i = size-1;i>=index;i--) {
array[size - n] = array[i];
n++;
}
array[index] = e;
size++;
}
return oldvalue;
}
}
测试代码
用来测试的Animal类:
package ArrayList;
public class Animal {
private String name;
private int age;
private int number;
//定义构造函数
public Animal(String name,int age,int number) {
this.name = name;
//System.out.println("name----------->"+name);
this.age = age;
//System.out.println("age----------->"+age);
this.number = number;
//System.out.println("number----------->"+number);
}
}
测试类:
package ArrayList;
import java.util.Random;
public class Test {
public static void main(String[] args) {
MyArrayList list = new MyArrayList();
list.add(2);
list.add(2.3333);
list.add(new Object());
list.add(new MyArrayList(15));
list.add("hello!");
//list.add(null);
list.add(true);
System.out.println();
System.out.println();
System.out.println();
System.out.println("到目前加入了--"+list.size()+"--个对象");
System.out.println();
System.out.println();
System.out.println("打印输出这--"+list.size()+"--个对象");
System.out.println();
for(int i = 0;i<list.size();i++) {
System.out.println("-----"+i+"----->"+list.get(i).toString());
}
System.out.println();
System.out.println();
System.out.println();
Random rand = new Random();
int number = rand.nextInt(12)+4;
System.out.println("现在加入--"+number+"--个Animal对象");
for(int i = 0;i<number;i++) {
Animal animal = new Animal("lovely-"+rand.nextInt(20),rand.nextInt(25),rand.nextInt(10010));
System.out.println("-----"+i+"----->"+"***********"+animal+"************");
list.add(animal);
}
System.out.println();
System.out.println();
System.out.println();
System.out.println("总共加入了--"+list.size()+"个对象");
for(int i = 0;i<list.size();i++) {
Object object = list.get(i);
System.out.println("-----"+i+"----->"+object.toString());
}
System.out.println();
System.out.println();
System.out.println();
//设置第1个元素的值为89,最后一个元素的值为新的Animal对象
System.out.println("设置下标------0--个元素的值为--89-----");
//list.set(0, 89);
System.out.println("下标为--0--的元素--原来--的值为--"+list.set(0, 89));
System.out.println("下标为--0--的元素--现在--的值为--"+list.get(0));
//设置最后一个元素的值为新的Animal对象
System.out.println("设置下标------"+(list.size()-1)+"--个元素的值为--新的Animal对象-----");
Animal animal = new Animal("cat",10,100001);
System.out.println("下标为--"+ (list.size()-1) +"--的元素--原来--的值为--"+list.set(list.size()-1, animal));
System.out.println("下标为--"+ (list.size()-1) +"--的元素--现在--的值为--"+list.get(list.size()-1));
//现在的list
System.out.println("------------现在的list---------");
for(int i = 0;i<list.size();i++) {
Object object = list.get(i);
System.out.println("-----"+i+"----->"+object.toString());
}
System.out.println();
System.out.println();
System.out.println();
System.out.println("------------移除元素---------");
System.out.println();
System.out.println();
System.out.println("------------移除最后一个元素---------");
System.out.println("下标为--"+(list.size()-1)+"--的元素--原来--的值为--"+list.remove(list.size()-1));
//现在的list
for(int i = 0;i<list.size();i++) {
Object object = list.get(i);
System.out.println("-----"+i+"----->"+object.toString());
}
System.out.println();
System.out.println("------------移除第三个元素(下标为2)---------");
System.out.println("下标为--"+2+"--的元素--原来--的值为--"+list.remove(2));
//现在的list
System.out.println("------------现在的list---------");
for(int i = 0;i<list.size();i++) {
Object object = list.get(i);
System.out.println("-----"+i+"----->"+object.toString());
}
System.out.println();
System.out.println();
System.out.println();
Animal animalmer = new Animal("dog",56,34);
System.out.println("------------在指定位置(下标)上添加元素----"+animalmer+"-----");
System.out.println("下标为--"+2+"--的元素--原来--的值为--"+list.add(2,animalmer));
System.out.println("下标为--"+2+"--的元素--现在--的值为--"+list.get(2));
//现在的list
System.out.println("------------现在的list---------");
for(int i = 0;i<list.size();i++) {
Object object = list.get(i);
System.out.println("-----"+i+"----->"+object);//------去掉了toString()方法
}
System.out.println();
System.out.println();
System.out.println();
System.out.println("------------清除掉所有元素---------");
System.out.println();
System.out.println();
list.clear();
System.out.println("-----现在list中还有的元素个数是"+"------"+list.size()+"------");
for(int i = 0;i<list.size();i++) {
System.out.println(list.get(i).toString());
}
}
}
相关文章
- 暂无相关文章
用户点评