当前位置:编程学习 > JAVA >>

怎么看一个ArrayList对象的容量?

size()是返回元素数  
怎么看现在的数组长度是多少
toArray()方法也是复制到size   也看不了 --------------------编程问答-------------------- 如果是普通的数组,length返回的是数组容量长度,但是ArrayList是一个可变数组,内部实现,初始长度是15,每次需要增加的时候增加15(如果我记得没错的话),那就是当前(size/15 + 1) × 2 就是这个ArrayList的容量,不过,这个没有意义,如果你编程的时候需要这个容量,也是你程序的算法有问题,选择这个ArrayList本身就不需要关注它的容量。 --------------------编程问答-------------------- 看了下源码,纠正一下,初始长度是10,每次增加实际上16,所以,是 (size / 16 + 1) × 16 + 10,是它的长度。 --------------------编程问答-------------------- 反射可以查看到private属性。 --------------------编程问答--------------------
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;

public class ArrayListCapa {
public static void main(String[] args){
ArrayList<Integer> squares = new ArrayList<Integer>();
for (int i = 1; i < 500; i++)
squares.add(i);
Class c=((Object)squares).getClass();
Field f;
try {
f = c.getDeclaredField("elementData");
f.setAccessible(true);
try {
Object[] o=(Object[]) f.get(squares);
System.out.println(o.length);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


}
}

练手,写了一个 --------------------编程问答-------------------- java类库里面封装的好好的,干嘛要去这么辛苦的看啊= = --------------------编程问答-------------------- 知道这个好像没什么意义啊,如果你不确定是否够空间,你可以用ensureCapacity扩展 --------------------编程问答--------------------
引用 4 楼 Cecil_911 的回复:
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;

public class ArrayListCapa {
public static void main(String[] args){
ArrayList<Integer> squares = new ArrayList<Integer>();
for (int i = 1; i < 500; i++)
squares.add(i);
Class c=((Object)squares).getClass();
Field f;
try {
f = c.getDeclaredField("elementData");
f.setAccessible(true);
try {
Object[] o=(Object[]) f.get(squares);
System.out.println(o.length);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


}
}

练手,写了一个


赞一个,用反射 --------------------编程问答-------------------- 在jdk7.0中,更加有趣,也更智能,是根据当前容量添加。
比如,初始容量为10,则当需要时,会加10/2=5,当前容量是15.
再次增加15+15/2=22
再次增加22+22/2=33 --------------------编程问答--------------------
引用 4 楼 Cecil_911 的回复:
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;

public class ArrayListCapa {
public static void main(String[] args){
ArrayList<Integer> squares = new ArrayList<Integer>();
for (int i = 1; i < 500; i++)
squares.add(i);
Class c=((Object)squares).getClass();
Field f;
try {
f = c.getDeclaredField("elementData");
f.setAccessible(true);
try {
Object[] o=(Object[]) f.get(squares);
System.out.println(o.length);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


}
}

练手,写了一个

涨知识了 
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,