java list内部构造

本文介绍了一个简单的Java集合类实现的数据结构,包括插入、删除、获取元素等基本操作,展示了如何通过反射和数组扩展来实现动态容量调整。
看代码吧,如下:
package com.Core.datastructure;
import java.lang.reflect.Array;
import java.util.Collection;
import junit.framework.TestCase;

public class ListDemo<T> {
private int capacity;
private int size = 0;
private Object[] elementData;

public ListDemo(int capcity) {
this.capacity = capcity;
elementData = new Object[capacity];
}

public ListDemo() {
this(10);
}

public void growCapacity(int growRank) {
Object newArr = Array.newInstance(elementData.getClass().getComponentType(), capacity
+ growRank);
System.arraycopy(elementData, 0, newArr, 0,
Array.getLength(elementData));
elementData = (Object[]) newArr;
}

public void insert(T t) {
if (capacity > size) {
elementData[size] = t;
size++;
} else {
growCapacity(1);
elementData[size] = t;
size++;
}
}

public void insert(int index, T t) {
if (index < 0 || index >= size)
throw new IndexOutOfBoundsException("Index: " + index + ", Size: "
+ size);
growCapacity(1);
System.arraycopy(elementData, index, elementData, index + 1, size
- index);
elementData[index] = t;
}

public boolean remove(T t) {
if (t == null) {
for (int i = 0; i < size; i++) {
if (getEle(i) == null) {
fastRemove(i);
return true;
}
}
} else {
for (int i = 0; i < size; i++) {
if (getEle(i).equals(t)) {
fastRemove(i);
return true;
}
}
}
return false;

}

public T remove(int index) {
            if(index < 0 || index >= size){
            throw new IndexOutOfBoundsException("Index: " + index + ", Size: "
    + size);
            }
            Object obj = elementData[index];
           fastRemove(index);
           return (T) obj;
}

public void fastRemove(int index) {
int numMoved = size - index - 1;
System.arraycopy(elementData, index + 1, elementData, index, numMoved);
elementData[--size] = null;
}

public T getEle(int index) {
return (T) elementData[index];
}
}
### JavaList 的初始化方法 在 Java 中,`List` 是一种集合接口,常用的实现类有 `ArrayList` 和 `LinkedList`。以下是几种常见的 `List` 初始化方法: #### 方法一:使用无参构造函数 可以通过创建一个具体的实现类(如 `ArrayList` 或 `LinkedList`),并使用其无参构造函数来初始化。 ```java import java.util.ArrayList; import java.util.LinkedList; import java.util.List; public class Main { public static void main(String[] args) { // 使用 ArrayList 的无参构造函数 List<String> arrayList = new ArrayList<>(); // 使用 LinkedList 的无参构造函数 List<String> linkedList = new LinkedList<>(); } } ``` 这种方法会创建一个空的列表对象[^1]。 --- #### 方法二:使用带有初始容量的构造函数 对于 `ArrayList`,可以指定初始容量以优化性能。虽然这不是强制性的,但在已知数据量的情况下非常有用。 ```java import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { // 指定初始容量为 10 List<String> arrayListWithCapacity = new ArrayList<>(10); } } ``` 这种方式适用于需要预先分配内存的情况,从而减少动态扩容带来的开销[^1]。 --- #### 方法三:通过已有集合初始化 可以使用带有一个集合参数的构造函数,将现有集合的内容复制到新的 `List` 实例中。 ```java import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { List<String> originalList = Arrays.asList("A", "B", "C"); // 复制原始列表内容到新列表 List<String> newList = new ArrayList<>(originalList); } } ``` 这种技术特别适合于从其他集合派生一个新的可变列表。 --- #### 方法四:使用匿名内部类简化初始化 利用双括号语法(Double Brace Initialization),可以在声明的同时填充数据。注意,这是一种不推荐的方式,因为它会产生额外的匿名类实例。 ```java import java.util.List; public class Main { public static void main(String[] args) { List<String> list = new ArrayList<>() {{ add("Element1"); add("Element2"); add("Element3"); }}; } } ``` 尽管方便,但由于潜在的性能问题和不必要的复杂性,通常建议避免此方法[^4]。 --- #### 方法五:静态工厂方法(Java 9 及以上) 自 Java 9 起,引入了 `List.of()` 静态工厂方法用于快速创建不可修改的固定大小列表。 ```java import java.util.List; public class Main { public static void main(String[] args) { // 创建一个不可修改的列表 List<String> immutableList = List.of("X", "Y", "Z"); // 尝试修改会导致 UnsupportedOperationException // immutableList.add("W"); // 编译错误或运行时异常 } } ``` 该方法非常适合定义只读常量集合。 --- ### 总结 上述每种方法都有特定的应用场景: - **无参构造函数**:通用情况下的首选方案。 - **带初始容量的构造函数**:当预计大量元素时提高效率。 - **基于现有集合构建**:便于继承或转换不同类型的集合结构。 - **匿名内部类**:虽简单但应谨慎采用以免增加维护难度。 - **静态工厂方法**:提供轻量化途径建立小型且不变的数据集。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值