5.数组动态扩容
试题:
- 设置一个类, 命名为 MyList
- 类中包含属性:Object[] element
- 方法有如下几个:
- 1. 增加方法 add : 可以向数组属性中依次存储 Object,数组内容存满时,需实现动态扩容(详解在下面)。
- 2. 删除方法 remove :可以根据数据或下标,从数组属性中删除Object 数据,删除后,数组后续元素需前移。
- 3. 查询方法 get :方法传入下标,返回数组中指定下标的数据。当前存储数据量 size:获取当前存储的有效数据长度
- 动态扩容详解:无需真正增加原数组的容量,只用将原内容复制到新的大数组,然后让原数组名称重新等于大数组即可。由于原数组数据在堆中,失去引用会被 GC 自动回收。
package demo9;
import java.util.Objects;
//Person类
public class MyListPerson {
String name;
public MyListPerson(String name) { this.name = name;}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MyListPerson that = (MyListPerson) o;
return Objects.equals(name, that.name);
}
@Override
public int hashCode() {
return Objects.hash(name);
}
@Override
public String toString() {
return "MyListPerson{" +
"name='" + name + '\'' +
'}';
}
public class MyList {
private Object[] element=new Object[2];
private int size=0;//数组有效数据长度
static {
System.out.println("原始数组长度为2");
}
public void add(Object o){
if (size==element.length){ //数组内容存满,进行扩容
System.out.println("数组已存入"+size+"个元素,"
+"数组内容存满了,进行翻倍扩容可存储"+size*2+"个元素");
Object[] element1 = new Object[size*2]; //新数组
System.arraycopy(element,0,element1,0,size);//数组复制
element=element1;//element指向扩容后的数组
add(o);
}else{
element[size++]=o;
System.out.println("元素添加完成");
}
}
public void remove(Object o){
int i;
for (i = 0; i < size; i++) {
if (element[i].equals(o)){ //找到要删除的元素
for (int j=i+1;j<size;j++){//后续元素前移
element[j-1]=element[j];
}
size--;
System.out.println("元素已被删除");
break;
}
}
if (i==size){
System.out.println("数组中不存在该元素");
}
}
public void get(int index){
System.out.println("获取数组下标为"+index+"的元素是"+ element[index]);
}
public void showAll(){
System.out.print("当前数组:");
for (int i = 0; i < size; i++) {
System.out.print(element[i]+",");
}
System.out.println();
}
}
package demo9;
public class MyListMain {
public static void main(String[] args) {
MyList myList = new MyList();
MyListPerson p1 = new MyListPerson("张三");
MyListPerson p2 = new MyListPerson("李四");
MyListPerson p3 = new MyListPerson("王五");
myList.add(p1);
myList.add(p2);
myList.add(p3);
myList.showAll();
myList.get(2);
myList.remove(p2);
myList.showAll();
}
}