获取查看ArrayList容量

骑上我心爱的小摩托

在学习单列集合ArrayList时,细心地同学可能会发现,该类以及其父类并没有提供获取容量的方法,那么想要查看其容量该怎么办呢?下面简单解释一下ArrayList集合的特点以及获取容量的方法。复制方法代码直接下拉到最后。。。

一、ArrayList的特点

1、ArrayList使用的是数组结构来存储数据。

所以自然可以使用索引来操作存储的数据,ArrayList提供的特有方法。如public E get(int index)返回此列表中指定位置上的元素,就是引入了坐标的体现。当然,我们发现LinkedList集合中也有该方法,结合源码:


  • LinkedList中get方法功能的实现:
    LinkedList方法1LinkedList方法2解释:可以看出,LinkedList集合中的get方法调用了node(int index)方法,而node方法获取index对应的Node(节点)如上图所示,以从前向后找为例:是从第一个节点依次取当前节点的下个节点(next),循环执行index-1次,正好取到第index个节点。
    这里的index并是非数组概念中的索引,更像是表示集合中所存总数据个数中的第(index)几个。

  • ArrayList中get方法功能的实现:
    ArrayList方法
    解释:从ArrayList集合的get方法很容易看出,是直接从存储数据的数组中取出index索引对应的数据。
2、ArrayList集合中的isEmpty()和size()方法

ArrayList中判空方法isEmpty(),经过重写后,是判断集合实际存储数据个数size是否为0

isEmpty()

ArrayList中的size()获取集合实际存储个数,即直接返回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存储数据结构是双向链表,不用设置容量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值