共同学习Java源代码--数据结构--ArrayList类(二)

    public void trimToSize() {
        modCount++;
        if (size < elementData.length) {
            elementData = (size == 0)
              ? EMPTY_ELEMENTDATA
              : Arrays.copyOf(elementData, size);
        }

    }

 这个方法是将底层数组的长度和元素数同步的方法,我猜是去掉底层数组前后空值的方法,因为底层数组的长度大于List的size也就是元素数时会调用这个方法,说明底层数组没有填满。首先将修改次数加一,然后判断元素数是否小于底层数组的长度,如果小于,就再判断,如果元素数等于0,底层数组就是EMPTY_ELEMENTDATA,否则就将底层数组的长度变为size。

    public void ensureCapacity(int minCapacity) {
        int minExpand = (elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
            ? 0
            : DEFAULT_CAPACITY;


        if (minCapacity > minExpand) {
            ensureExplicitCapacity(minCapacity);
        }
    }

这个方法是保证数组元素不越界的方法。参数是最小长度。然后定义变量minExpand代表最小扩展量,判断如果elementData不是DEFAULTCAPACITY_EMPTY_ELEMENTDATA,就赋值为0,如果是DEFAULTCAPACITY_EMPTY_ELEMENTDATA的话,就赋值为DEFAULT_CAPACITY,也就是10。再判断如果参数大于minExpand,就调用另一个方法。其实minExpand的赋值也好理解,如果elementData是DEFAULTCAPACITY_EMPTY_ELEMENTDATA,说明该ArrayList就是刚调用了无参构造方法得到的,还没有添加元素,所以这时候minExpand就设为10这个默认长度就可以了,一旦需要扩容,扩容10就行了,如果该ArrayList已经添加元素了,minExpand就为0。然后再判断minExpand和参数的关系,也就是说,ArrayList刚实例化时,参数要比10大,才可以调用下面的方法,否则参数要比0大才可以调用下面的方法。

    private void ensureExplicitCapacity(int minCapacity) {
        modCount++;
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }

这个方法是上面那个方法调用过来的,意思是为底层数组容量扩大到明确数量。首先先对modCount自增,表示修改次数加一。

然后判断参数也就是上一个方法传进来的是否大于数组长度,如果大于就继续调用方法。

    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

这个方法是实际扩容的方法。首先获取当前底层数组的长度,然后创建变量获取的是新的长度,其值是当前长度加上当前长度除以2。再判断如果新长度小于参数新长度就赋值为参数。如果新长度大于数组最大长度,新长度就调用其他方法赋值。最后底层数组就拷贝到一个长度为新长度的数组里。

    private static int hugeCapacity(int minCapacity) {
        if (minCapacity < 0) // overflow
            throw new OutOfMemoryError();
        return (minCapacity > MAX_ARRAY_SIZE) ?
            Integer.MAX_VALUE :
            MAX_ARRAY_SIZE;
    }

这个方法就是获取很大容量的方法。首先判断参数是否小于0,否则就抛出异常。然后判断参数是否大于数组最大长度,大于就返回int类型最大值,否则返回数组最大长度。

    private void ensureCapacityInternal(int minCapacity) {
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
        }
        ensureExplicitCapacity(minCapacity);
    }

这个方法也是底层数组扩容的方法。首先判断底层数组是不是 DEFAULTCAPACITY_EMPTY_ELEMENTDATA,是的话参数赋值为原参数值和10的最大值。

然后将参数传入上面的方法进行扩容。

private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

这个静态final属性是最大数组长度就是int类型最大值减8.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据您提供的引用内容,我了解到您想了解如何实现vxe-table树形表格的前后端java代码。下面是一个简单的实现过程: 1. 后端Java代码实现: 在后端,您需要定义一个树形结构的数据模型,例如: ``` public class TreeNode { private String id; private String label; private List<TreeNode> children; // getter and setter methods } ``` 然后,您需要编写一个Controller来处理前端的请求,并返回树形结构的数据。例如: ``` @RestController @RequestMapping("/api") public class TreeController { @GetMapping("/tree") public List<TreeNode> getTree() { // 从数据库或其他数据源获取树形结构的数据 List<TreeNode> tree = new ArrayList<>(); // 构造树形结构的数据 return tree; } } ``` 2. 前端Vue代码实现: 在前端,您需要使用vxe-table组件来实现树形表格的展示。首先,您需要安装vxe-table组件: ``` npm install vxe-table --save ``` 然后,在Vue组件中引入vxe-table组件,并使用tree-config配置项来实现树形表格的展示。例如: ``` <template> <vxe-table :data="treeData" :tree-config="{children: 'children'}"> <vxe-table-column type="index" width="60"></vxe-table-column> <vxe-table-column field="label" title="Label"></vxe-table-column> </vxe-table> </template> <script> import 'vxe-table/lib/style.css' import VXETable from 'vxe-table' export default { data() { return { treeData: [] } }, created() { // 从后端获取树形结构的数据 this.$http.get('/api/tree').then(response => { this.treeData = response.data }) }, mounted() { VXETable.setup({ table: { showOverflow: true } }) } } </script> ``` 在上面的代码中,我们使用了vxe-table组件来展示树形表格,并使用tree-config配置项来指定树形结构的子节点属性名为'children'。同时,我们从后端获取树形结构的数据,并将其赋值给treeData变量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值