JAVA集合一 ——集合结构



JAVA集合一 ——集合整体接口


     特别声明:

     *本文只是备忘录。

     JAVA中集合是一个很重要的概念,首先来看看整体的类图。

    集合的主要接口为collection。Collection 继承自Iterable接口,而Iterable接口封装了生成迭代器的方法Iterator()。这样所有集合都需要实现该方法,这也是java设计模式中的迭代器模式。

      由图中可以看出集合的几个主要的子接口为:List、Set、Queue。一个抽象实现类 AbstractCollection。

      List、Set、Queue接口后面分析。先来看AbstractCollection。

     AbstractCollection 主要是提供了一些Collection接口的方法的实现。

    主要看一下 toArray()方法。

 public Object[] toArray() {
        // Estimate size of array; be prepared to see more or fewer elements
        Object[] r = new Object[size()];
        Iterator<E> it = iterator();
        for (int i = 0; i < r.length; i++) {
            if (! it.hasNext()) // fewer elements than expected
                return Arrays.copyOf(r, i);
            r[i] = it.next();
        }
        return it.hasNext() ? finishToArray(r, it) : r;
    }

    将集合中的元素复制到数组中。看看最后返回的是什么?最后为什么还要判断it.hasNext()?

     能产生这种问题的情况,多线程!。

     在来看看 finishToArray()的源码:

    

 private static <T> T[] finishToArray(T[] r, Iterator<?> it) {
        int i = r.length;
        while (it.hasNext()) {
            int cap = r.length;
            if (i == cap) {
                int newCap = cap + (cap >> 1) + 1;
                // overflow-conscious code
                if (newCap - MAX_ARRAY_SIZE > 0)
                    newCap = hugeCapacity(cap + 1);
                r = Arrays.copyOf(r, newCap);
            }
            r[i++] = (T)it.next();
        }
        // trim if overallocated
        return (i == r.length) ? r : Arrays.copyOf(r, i);
    }
    第一步扩容
    扩容的算法,每次扩容原先容量的一半+1。
int newCap = cap + (cap >> 1) + 1;
    第二步
    如果扩容后的值大于集合定义的最大值,则表示数组太大,如果一次性扩容会占用很多内存。需要重新扩容。通过传入cap+1来生成一个合适的新值。
if (newCap - MAX_ARRAY_SIZE > 0)
                    newCap = hugeCapacity(cap + 1);
 
    private static int hugeCapacity(int minCapacity) {
        //该处判断上面的cap + 1是否已经超出了int的最大值。
        if (minCapacity < 0) // overflow
            throw new OutOfMemoryError
                ("Required array size too large");
	//判断扩容后的值是否大于数组的最大size,如果大于返回INT的最大值。否则返回定义的最大值
        return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE :MAX_ARRAY_SIZE;
    }
看看集合定义的最大值是多少:
   private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

     

      再来看看List、Set、Queue接口。

      List:定义的是有序的集合,允许元素的重复。允许多个null。

      Set:定义的是不能重复的集合,可以有null,但是只能有一个。Set分有序和无需的。TreeSet:有序,hashSet:无需。

      Queue: 定义的是"队列"先进先出(FIFO)的数据结构。不允许随机访问。

      后面会具体分析。


基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip 个人大四的毕业设计、课程设计、作业、经导师指导并认可通过的高分设计项目,评审平均分达96.5分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 [资源说明] 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设或者课设、作业,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96.5分,放心下载使用! 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),供学习参考。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值