面向对象高级训练任务,MyList
试题:设置一个类, 命名为 MyList类中包含属性:Object[] element
方法有如下几个:
- 增加方法 add : 可以向数组属性中依次存储 Object,数组内容
存满时,需实现动态扩容(详解在下面)。 - 删除方法 remove :可以根据数据或下标,从数组属性中删除
Object 数据,删除后,数组后续元素需前移。 - 查询方法 get :方法传入下标,返回数组中指定下标的数据。
当前存储数据量 size : 获取当前存储的有效数据长度
动态扩容详解:无需真正增加原数组的容量,只用将原内容复制到新
的大数组,然后让原数组名称重新等于大数组即可。由于原数组数据在堆中,
失去引用会被 GC 自动回收。
/**
* 数组扩容效率较低,因为涉及到拷贝问题,所以在以后开发中注意:
* 尽可能少的进行数组的拷贝。
* 可以在创建数组对象的时候预估计数组多长合适,最好预估准确,
* 这样可以减少数组的扩容次数,提高效率。
* System.arraycopy(src, srcPos, dest, destPos, length);//数组源 数组下标
* @author Sang
*
*/
public class MyList {
private Object[]element;//定义Object 数组 element
private int size;//数组属性的内容数量
public MyList(Object[] element, int size) {//构造方法
super();
this.element = element;
this.size = size;
}
public void add(Object o) {//增加方法
if(size<element.length) {
element[size] = o;
}else {//扩容数组,
Object[]newElement = new Object[2*element.length];
System.arraycopy(element, 0, newElement, 0, element.length);
for (int i = 0; i < element.length; i++) {//将数组element的元素 赋值给 new Element数组
newElement[i] = element[i];
}
element = newElement;//将新的数组再给到原数组
element[size] = o;
}
size++;//数量+1
}
public void remove(Object o) {//删除方法1
int flag = 0;
int j = 0;
for (j = 0; j< element.length;j++) {// // 获得数组下标 0 1 2 3 4 5
if(element[j].equals(o)) {//判断是否存在o
flag = 1;
break;
}
}
for (int k = j; k < element.length; k++) {//获得数组下标 1 2 3 4 5
element[k] = element[k+1];
System.out.println(k);
}
if (flag == 1) {//判断是否数组中元素是否为o
size--;
}else {
System.out.println("未找到该数据");
}
}
public void remove(int i) {//删除方法2
if (i <= size - 1) {
for (int k = i ; k < element.length-1; k++) {
element[k] = element[k+1];
}size--;
}else {
System.out.println("未找到该数据");
}
}
public Object get(int i) {//查询方法
for (int index = 0; index< element.length; index++) {
if(index == i) {
return element[i];
}
}System.out.println("未找到该数据");
return null;
}
public int getLength() {//返回数组长度
int a = element.length;
System.out.println(a);//打印数组长度
return element.length;
}
public void printAll() {//打印数组
for (int i = 0; i < size; i++) {//
if(element[i]!=null)//去掉空值
System.out.println(element[i]);
}
}
}
调用方法,测试结果
public class MyListTest {
public static void main(String[] args) {
Object [] array = {10,20,30};
MyList test = new MyList(array,3);
test.add(50);
test.add(600);
test.printAll();
test.remove(4);
System.out.println("=================");
test.printAll();
}
}
输出结果如下:
10
20
30
50
600
=================
10
20
30
50