JAVA 中ArrayList的问题
List<Fruit>fruit=newArrayList<Fruit>(9);这句话的意思是我定义了一个初始长度为9的fruit那为什么我没做任何操作就可以往里面加第1...
List<Fruit> fruit=new ArrayList<Fruit>(9);
这句话的意思是我定义了一个初始长度为9的 fruit
那为什么我没做任何操作就可以往里面加第10个元素呢?
如果是随意可以变长的 那还可以设置初始长度有什么意义? 展开
这句话的意思是我定义了一个初始长度为9的 fruit
那为什么我没做任何操作就可以往里面加第10个元素呢?
如果是随意可以变长的 那还可以设置初始长度有什么意义? 展开
4个回答
展开全部
源码:
//声明数组
private transient Object[] elementData;
//通过构造函数初始化数组容量
public ArrayList(int initialCapacity) {
。。。
this.elementData = new Object[initialCapacity];
}
//添加元素的时候首先确定数组容量
public boolean add(E e) {
ensureCapacity(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
//确定容量代码
public void ensureCapacity(int minCapacity) {
modCount++;
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
Object oldData[] = elementData;
int newCapacity = (oldCapacity * 3)/2 + 1;
if (newCapacity < minCapacity)
newCapacity = minCapacity;
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
注意: Object oldData[] = elementData;
int newCapacity = (oldCapacity * 3)/2 + 1;由此可见当数组长度超过声明长度,数组要扩容的时候是以我们声明的数组长度为基准的,新数组的长度会是旧数组长度的2/3! 按照这个道理,如果你想每次数组扩容的时候增加的多一些,就要设置较大的原始容量,反之亦然!
//声明数组
private transient Object[] elementData;
//通过构造函数初始化数组容量
public ArrayList(int initialCapacity) {
。。。
this.elementData = new Object[initialCapacity];
}
//添加元素的时候首先确定数组容量
public boolean add(E e) {
ensureCapacity(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
//确定容量代码
public void ensureCapacity(int minCapacity) {
modCount++;
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
Object oldData[] = elementData;
int newCapacity = (oldCapacity * 3)/2 + 1;
if (newCapacity < minCapacity)
newCapacity = minCapacity;
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
注意: Object oldData[] = elementData;
int newCapacity = (oldCapacity * 3)/2 + 1;由此可见当数组长度超过声明长度,数组要扩容的时候是以我们声明的数组长度为基准的,新数组的长度会是旧数组长度的2/3! 按照这个道理,如果你想每次数组扩容的时候增加的多一些,就要设置较大的原始容量,反之亦然!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
ArrayList的特点就是容量不受限制(好像~默认情况可以增大原来的50%。),它会根据元素的个数自动增长,不用你来操作。
设置初始长度可以避免不必要的资源开销。
设置初始长度可以避免不必要的资源开销。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
一楼的回答基本正确,我做以下补充:
arrallist本身是以数组结构对数据进行保存的,并且提供用户进行按照序列的索引操作,也就是说他的数据查找定位比较好,时间复杂度为O(1),但是正是因为以数组保存所以他的添加比较慢,因为这个涉及到内存中数据的移动问题,在容量方面,采用了动态的设计,ArrayList提供了可以动态修改数组大小的方法,也就是你可以自己定义当arraylist满了的时候自动增加多少内存容量。默认好像是增加一半。。你只有对arraylist的内部结构有了比较清晰的认识才会对他的各种看似不平常的变化有一个更好的理解。。
arrallist本身是以数组结构对数据进行保存的,并且提供用户进行按照序列的索引操作,也就是说他的数据查找定位比较好,时间复杂度为O(1),但是正是因为以数组保存所以他的添加比较慢,因为这个涉及到内存中数据的移动问题,在容量方面,采用了动态的设计,ArrayList提供了可以动态修改数组大小的方法,也就是你可以自己定义当arraylist满了的时候自动增加多少内存容量。默认好像是增加一半。。你只有对arraylist的内部结构有了比较清晰的认识才会对他的各种看似不平常的变化有一个更好的理解。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询