当我们创建一个数组对象的时候 必须要明确空间大小
ArrayList底层基于Object[]实现的
其实我们可以再创建ArrayList对象的时候 明确底层
开辟多大的数组对象 再构造方法里面传参数
参数:表示底层数组对象开辟多大空间
ArrayList底层基于Object[]实现的
其实我们可以再创建ArrayList对象的时候 明确底层
开辟多大的数组对象 再构造方法里面传参数
参数:表示底层数组对象开辟多大空间
当我们调用无参构造方法的时候 底层默认开辟10块内存空间
但是不代表只能装10个元素
但是不代表只能装10个元素
集合会自动扩容:
jdk6.0及之前 x*3/2+1 ->10 -> 16 -> 25....
jdk7.0及之后 x+(x>>1)->10 -> 15 -> 22...
jdk6.0及之前 x*3/2+1 ->10 -> 16 -> 25....
jdk7.0及之后 x+(x>>1)->10 -> 15 -> 22...
但是再开发的时候 尽量避免扩容:
1:创建新的数组对象
2:将老数组里面的元素复制进新数组里面
3:改变引用指向
4:回收老数组对象
5:继续添加元素
1:创建新的数组对象
2:将老数组里面的元素复制进新数组里面
3:改变引用指向
4:回收老数组对象
5:继续添加元素
/ArrayList
//属性:data size
//构造方法:有参 无参
//普通方法:
//size()
//get()
//add()
//remove()
//remove()
//contains()
//toString()
//trimToSize()
//ensureCapacity()
//属性:data size
//构造方法:有参 无参
//普通方法:
//size()
//get()
//add()
//remove()
//remove()
//contains()
//toString()
//trimToSize()
//ensureCapacity()
import java.util.*;
public class TestArrayList8Plus{
public static void main(String[] args){
AList<Integer> list = new AList<Integer>();
list.add(45);
list.add(77);
list.add(666);
//Collections.addAll(list,56,77,90);
System.out.println(list.size());
System.out.println(list.get(2));
System.out.println(list.contains(45));
System.out.println(list);
}
}
class AList<E>{
//属性:
private Object[] data;
private int size;
//构造方法
public AList(int x){
data = new Object[x];
}
public AList(){//[]:10
data = new Object[10];
}
//方法:
//int x = list.size();
public int size(){
return size;//0
}
//Object obj = list.get(int x);
public Object get(int x){
return data[x];
}
//void -> list.add(Object obj);
public void add(E obj){
if(data.length == size){
Object[] temp = new Object[size + (size >> 1)];//null
System.arraycopy(data,0,temp,0,size);
data = temp;
data[size] = obj;
size++;
}else{
data[size] = obj;
size++;
}
}
//void -> list.remove(3);
public void remove(int x){
System.arraycopy(data,x+1,data,x,size-(x+1));
size --;
}
public void remove(Object obj){
//[]:10 -> 2
for(int x = 0;x < size;x++){
if(obj.equals(data[x])){
remove(x);
break;
}
}
}
//list.contains(元素)
public boolean contains(Object obj){
//obj调用equals方法和集合里面的每一个元素作比较
//张三 李四 王五
//list.contains("李四")
for(int x = 0;x < size;x++){//10->2
if(obj.equals(data[x])){
return true;
}
}
return false;
}
public void ensureCapacity(int x){
if(x <= data.length){
System.out.println("已经确保有" + x + "块容量");
}else{
Object[] temp = new Object[x];
System.arraycopy(data,0,temp,0,size);
data = temp;
}
}
public void trimToSize(){
Object[] temp = new Object[size];
System.arraycopy(data,0,temp,0,size);
data = temp;
}
@Override
public String toString(){
//[元素1,元素2,元素3]
StringBuffer buffer = new StringBuffer("[");
for(int x = 0;x < size;x++){
//x -> 下标
//data[x] -> 元素
buffer.append(data[x]);
if(x != size - 1){
buffer.append(",");
}
}
buffer.append("]");
return buffer.toString();
}
}