在学习单列集合ArrayList时,细心地同学可能会发现,该类以及其父类并没有提供获取容量的方法,那么想要查看其容量该怎么办呢?下面简单解释一下ArrayList集合的特点以及获取容量的方法。复制方法代码直接下拉到最后。。。
一、ArrayList的特点
1、ArrayList使用的是数组结构来存储数据。
所以自然可以使用索引来操作存储的数据,ArrayList提供的特有方法。如
public E get(int index)
返回此列表中指定位置上的元素,就是引入了坐标的体现。当然,我们发现LinkedList集合中也有该方法,结合源码:
- LinkedList中get方法功能的实现:
解释:可以看出,LinkedList
集合中的get
方法调用了node(int index)
方法,而node方法获取index对应的Node(节点)
如上图所示,以从前向后找为例:是从第一个节点依次取当前节点的下个节点(next),循环执行index-1次,正好取到第index个节点。
这里的index并是非数组概念中的索引,更像是表示集合中所存总数据个数中的第(index)几个。
- ArrayList中get方法功能的实现:
解释:从ArrayList
集合的get
方法很容易看出,是直接从存储数据的数组中取出index索引对应的数据。
2、ArrayList集合中的isEmpty()和size()方法
ArrayList中判空方法
isEmpty()
,经过重写后,是判断集合实际存储数据个数size是否为0
ArrayList中的size()获取集合实际存储个数,即直接返回size的值
二、获取ArrayList集合容量
这里用到了反射的知识,不过下面方法可直接粘贴使用
获取ArrayList容量实际就是获取ArrayList中存储数据的数组(Object[] elementData)长度,所以通过反射获取到elementData数组,然后得到该数组的length属性即可。方法如下:
//查看ArrayList集合容量方法 -- 反射
public int getArrayListLength(ArrayList list) throws Exception{
//获取Class对象
Class c = Class.forName("java.util.ArrayList");
//映射Class对象c所表示类(即Arraylist)的属性
Field field = c.getDeclaredField("elementData");
//设置访问状态表示为true
field.setAccessible(true);
//返回指定对象上此 Field 表示的字段的值
Object[] object = (Object[])field.get(list);
return object.length;
}
- 使用测试
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
public class Demo1 {
public static void main(String[] args) throws Exception{
List<Integer> list= new ArrayList<>();
list.add(111);
list.add(222);
list.add(333);
System.out.println(getArrayListLength(list)); //该是默认容量值10
}
//查看ArrayList集合容量方法 -- 反射
public static int getArrayListLength(List list) throws Exception{
//获取Class对象
Class c = Class.forName("java.util.ArrayList");
//映射Class对象所表示类的属性
Field field = c.getDeclaredField("elementData");
//设置访问表示为true
field.setAccessible(true);
//返回指定对象上此 Field 表示的字段的值
Object[] object = (Object[])field.get(list);
return object.length;
}
}
由于LinkedList存储数据结构是双向链表,不用设置容量