自定义简易的List,纯数组模拟实现,暴力实现动态扩容缩容,以及筛选功能。
实现方法:
获取元素get(int num) ,
添加add(T o),
根据下标删除removeByIndex(int index),
获取大小size(),
过滤元素filter(MyFilter
public class MyList<T>{
private T[] data;
private Integer size;
public MyList() {
this.data = (T[]) new Object[1];
this.size = 0;
}
public MyList(int n) {
this.data = (T[]) new Object[n];
this.size = 0;
}
//过滤元素
public MyList<T> filter(MyFilter<T> filter) {
MyList<T> res = new MyList<>();
for (int i = 0; i < size; i++) {
if (filter.filter(data[i])) {
res.add(data[i]);
}
}
return res;
}
//获取元素
public T get(int num) {
if (num > size) {
return null;
}
return data[num];
}
//添加元素
public boolean add(T o) {
//判断是否需要扩容
reSize(size);
size++;
data[size - 1] = o;
return true;
}
//根据下标删除
public boolean removeByIndex(int index) {
int i = index;
if (i >= size) {
return false;
}
for (int j = i + 1; j < size; j++) {
data[j - 1] = data[j];
}
//判断是否需要缩容
reSize(size--);
return true;
}
//获取容量大小
public int size() {
return size;
}
//扩容和缩容
private void reSize(int size) {
if (size + 1 > data.length) {
T[] temp = (T[]) new Object[size * 2];
for (int i = size - 1, in = 0; i >= in; i--) {
temp[i] = data[i];
}
data = temp;
}
if (size <= data.length / 4 && data.length / 2 != 0) {
T[] temp = (T[]) new Object[data.length / 2];
for (int i = size - 1, in = 0; i >= in; i--) {
temp[i] = data[i];
}
data = temp;
}
}
}
Filter接口
public interface MyFilter<T> {
boolean filter(T obj);
}
测试1:
public class test{
public static void main(String[] args){
MyList<Integer> list = new MyList<>(10);
for(int i = 0; i <= 10; i ++){
list.add(i);
}
for(int i = 0 ; i < list.size(); i ++){
System.out.print(list.get(i) + ", ");
}
System.out.println();
MyList<Integer> filter = list.filter((a) -> {
return a % 2 == 0;
});
filter.removeByIndex(2);
filter.add(111);
for(int i = 0 ; i < filter.size(); i ++){
System.out.print(filter.get(i) + ", ");
}
}
}
输出结果:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
0, 2, 6, 8, 10, 111,
测试2:
public class test {
public static void main(String[] args) {
MyList<Person> list = new MyList<>();
Person person1 = new Person("小明", 12);
list.add(person1);
Person person2 = new Person("小红", 14);
list.add(person2);
Person person3 = new Person("张三", 15);
list.add(person3);
Person person4 = new Person("老刘", 22);
list.add(person4);
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i).toString());
}
//筛选年龄大于13的对象
MyList<Person> filter1 = list.filter(a -> {
return a.getAge() > 13;
});
System.out.println("筛选年龄大于13的对象: ");
for (int i = 0; i < filter1.size(); i++) {
System.out.println(filter1.get(i).toString());
}
//筛选名字带“小”的对象
MyList<Person> filter2 = list.filter(a -> {
return a.getName().contains("小");
});
System.out.println("筛选名字带“小”的对象: ");
for (int i = 0; i < filter2.size(); i++) {
System.out.println(filter2.get(i).toString());
}
}
static class Person {
private String name;
private Integer age;
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
}
输出结果:
Person{name='小明', age=12}
Person{name='小红', age=14}
Person{name='张三', age=15}
Person{name='老刘', age=22}
筛选年龄大于13的对象:
Person{name='小红', age=14}
Person{name='张三', age=15}
Person{name='老刘', age=22}
筛选名字带“小”的对象:
Person{name='小明', age=12}
Person{name='小红', age=14}
实现起来很简单,虽然没有什么用,跟自带的List相差甚远,但有助于巩固java基础,了解List的底层原理。