iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java源码解析之接口Collection的示例分析
  • 161
分享到

Java源码解析之接口Collection的示例分析

2023-06-15 04:06:26 161人浏览 独家记忆
摘要

小编给大家分享一下Java源码解析之接口Collection的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、图示二、方法定义我们先想一想,公司如果要我

小编给大家分享一下Java源码解析之接口Collection的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

一、图示

Java源码解析之接口Collection的示例分析

二、方法定义

我们先想一想,公司如果要我们自己去封装一些操作数组或者链表工具类,我么需要封装哪些功能呢?不妨就是统计其 大小,增删改查、清空或者是查看否含有某条数据等等。而collection接口就是把这些通常操作提取出来,使其更全面、更通用,那现在我们就来看看其源码都有哪些方法。

//返回集合的长度,如果长度大于Integer.MAX_VALUE,返回Integer.MAX_VALUEint size();//如果集合元素总数为0,返回trueboolean isEmpty();//判断集合中是否包含指定的元素,其依据是equals()方法boolean contains(Object o);//返回一个包含集合中所有元素的数组Object[] toArray();//与上个类似,只是增加了类型的转换<T> T[] toArray(T[] a);//向集合中加入一个元素,如果成功加入则返回true,如果加入失败,或者因集合本身已经包含同个元素而不再加入时,返回falseboolean add(E e);//从集合中删除指定元素的单个实例boolean remove(Object o);//如果集合包含指定集合中的所有元素,返回trueboolean containsAll(Collection<?> c);//把指定集合中的所有元素添加到集合中,但在此期间,如果指定的集合发生了改变,可能出现意想不到的事情boolean addAll(Collection<? extends E> c);//从集合中删除所有包含在指定集合中的元素boolean removeAll(Collection<?> c);//仅保留集合中包含在指定集合中的元素boolean retainAll(Collection<?> c);//清空集合void clear();//将此方法抽象,是保证所有子类都覆写此方法,以保证equals的正确行为boolean equals(Object o);//同上int hashCode();//这个方法在jdk1.8中提供了默认的实现,会使用Iterator的形式删除符合条件的元素default boolean removeIf(Predicate<? super E> filter){    Objects.requireNonNull(filter);    boolean removed = false;    final Iterator<E> each = iterator();    while (each.hasNext()) {        if (filter.test(each.next())) {            each.remove();            removed = true;        }    }    return removed;}

三、超级实现类 AbstractCollection

通过以上的学习,我们可以知道在collection接口中,有很多通用的方法,根据现有的定义以及继承的Iterable接口,都可以在抽象方法中实现,这样就可以减少具体实现类需要实现的方法,所以就有了这么一个类–AbstractCollection。

首先我们来看看api文档对这个类的大概描述:

如果要实现一个不可修改的集合,只需要重写Iterator和size接口就可以了,并且返回的Iterator需要实现hasNext和Next。而要实现一个可以修改的集合,还必须重写add方法,返回的Iterator还要实现remove接口。

接下里我们来看看其方法定义

//这个毫无疑问,是可以直接获取的public boolean isEmpty() {    return size() == 0;}//这个方法因为Iterator的存在,可以进行一致性封装,这里需要注意的是对象的比较是通过equals方法,因为调用到了it.next()与it.hasNext(),这也是为什么文档注释会写实现集合类需要重写Iterator的这两个方法。public boolean contains(Object o) {    Iterator<E> it = iterator();    if (o==null) {        while (it.hasNext())            if (it.next()==null)                return true;    } else {        while (it.hasNext())            if (o.equals(it.next()))                return true;    }    return false;}//和contains类似,也是通过Iterator实现的,但其会调用it.remove()方法,这也是为什么文档注释会写实现可以修改的集合类时需要重写Iterator的remove方法。public boolean remove(Object o) {    //...省略,这里调用了it.remove()方法}

还有很多方法也用到了iterator的特性,例如containAll、addAll等等,这里就不一 一说明了。

除此之外,还有一个toArray方法,方法实现还有一些略微不同:

//这个实现相对复杂一些,可以看到扩容最主要的手段是Arrays.copyOf()方法,//也就是需要将原数组通过复制到新的数组中来实现的。//注意这里返回的顺序和Iterator顺序一致//在这里实现是为了方便不同具体实现类互相转换,我们在后续会多次见到此方法public Object[] toArray() {    //先根据当前集合大小声明一个数组    Object[] r = new Object[size()];    Iterator<E> it = iterator();    for (int i = 0; i < r.length; i++) {        //集合元素没那么多,说明不需要那么大的数组        if (! it.hasNext())             return Arrays.copyOf(r, i); //仅返回赋完值的部分        r[i] = it.next();    }    //元素比从size()中获取的更多,就需要进一步调整数组大小    return it.hasNext() ? finishToArray(r, it) : r;}private static <T> T[] finishToArray(T[] r, Iterator<?> it) {    //记录当前大小    int i = r.length;    while (it.hasNext()) {        int cap = r.length;        //r的长度不够,继续分配        if (i == cap) {            //扩充方式为cap+cap/2+1,也就是1.5倍扩容            int newCap = cap + (cap >> 1) + 1;            // 超过了最大容量,MAX_ARRAY_SIZE=Integer.MAX_VALUE-8            if (newCap - MAX_ARRAY_SIZE > 0)                //重新设置cap的值                newCap = hugeCapacity(cap + 1);                        //对r进行扩容            r = Arrays.copyOf(r, newCap);        }        //赋值,进入下一轮循环        r[i++] = (T)it.next();    }    // 由于之前扩容是1.5倍进行的,最后再将其设置到和r实际需要的相同    return (i == r.length) ? r : Arrays.copyOf(r, i);}private static int hugeCapacity(int minCapacity) {    if (minCapacity < 0) // 超过了最大正整数,也就是负数        throw new OutOfMemoryError            ("Required array size too large");    return (minCapacity > MAX_ARRAY_SIZE) ?        Integer.MAX_VALUE :        MAX_ARRAY_SIZE;}//和toArray()方法类似,就不再赘述,具体可以查看源码public <T> T[] toArray(T[] a) {    //...}

除了这些,我们再来看看AbstractCollection是怎么实现toString方法的吧+

其是通过StringBuilder拼接了每个元素的toString完成的,不是很复杂。

我们来看看源码吧

public String toString() {    Iterator<E> it = iterator();    if (! it.hasNext())        return "[]";    StringBuilder sb = new StringBuilder();    sb.append('[');    for (;;) {        E e = it.next();        sb.append(e == this ? "(this Collection)" : e);        if (! it.hasNext())            return sb.append(']').toString();        sb.append(',').append(' ');    }}

java基本数据类型有哪些

Java的基本数据类型分为:1、整数类型,用来表示整数的数据类型。2、浮点类型,用来表示小数的数据类型。3、字符类型,字符类型的关键字是“char”。4、布尔类型,是表示逻辑值的基本数据类型。

以上是“Java源码解析之接口Collection的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: Java源码解析之接口Collection的示例分析

本文链接: https://www.lsjlt.com/news/277330.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java源码解析之接口Collection的示例分析
    小编给大家分享一下Java源码解析之接口Collection的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、图示二、方法定义我们先想一想,公司如果要我...
    99+
    2023-06-15
  • Java源码解析之接口Collection
    目录一、图示二、方法定义三、超级实现类 AbstractCollection一、图示 二、方法定义 我们先想一想,公司如果要我们自己去封装一些操作数组或者链表的工具类,我么需要封装...
    99+
    2022-11-12
  • Java源码解析之ConcurrentHashMap的示例分析
    小编给大家分享一下Java源码解析之ConcurrentHashMap的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!早期 ConcurrentHashMap,其实现是基于:分离锁,也就是将内部进行分段(Segme...
    99+
    2023-06-15
  • Java源码解析之Iterable接口
    目录一、写法1–循环二、写法2–foreach循环三、写法3–Iterator四、Iterable五、Iterator这里我们给定一个集合strings 一、写法1–循环 for...
    99+
    2022-11-12
  • Java源码解析之接口List
    目录前言一、List特有的方法二、超级实现类AbstractList三、SubList、equals和hascode前言 List接口是Collection接口的三大接口之一,其中的...
    99+
    2022-11-12
  • Java源码解析之超级接口Map
    目录前言一、接口Map二、接口Map.Entry三、一些重要的方法四、超级实现类AbstractMap前言 我们在前面说到的无论是链表还是数组,都有自己的优缺点,数组查询速度很快而插...
    99+
    2022-11-12
  • python源码剖析之PyObject的示例分析
    这篇文章主要介绍python源码剖析之PyObject的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、Python中的对象Python中一切皆是对象。————Guido van Rossum(1989)这...
    99+
    2023-06-15
  • Java源码ConcurrentHashMap的示例分析
    小编给大家分享一下Java源码ConcurrentHashMap的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、记录形式打算直接把过程写在源码中,会按序进行注释,查阅的时候可以按序号只看注释部分二、Concur...
    99+
    2023-06-15
  • Vue源码分析之虚拟DOM的示例分析
    小编给大家分享一下Vue源码分析之虚拟DOM的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!为什么需要虚拟dom?虚拟DOM就是为了解决浏览器性能问题而被...
    99+
    2023-06-15
  • java 中RandomAccess接口源码分析
    java 中RandomAccess接口源码分析RandomAccess是一个接口,位于java.util包中。这个接口的作用注释写的很清楚了:public interface RandomAccess {}...
    99+
    2023-05-31
    java randomaccess ava
  • Spring源码解析之编程式事务的示例分析
    这篇文章主要为大家展示了“Spring源码解析之编程式事务的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Spring源码解析之编程式事务的示例分析”这篇文章吧。一、前言在Spring中...
    99+
    2023-06-15
  • Java并发编程之ConcurrentLinkedQueue源码的示例分析
    这篇文章给大家分享的是有关Java并发编程之ConcurrentLinkedQueue源码的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、ConcurrentLinkedQueue介绍并编程中,一般需...
    99+
    2023-06-15
  • java中CopyOnWriteArrayList源码的示例分析
    这篇文章将为大家详细讲解有关java中CopyOnWriteArrayList源码的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。简介CopyOnWriteArrayList是ArrayList的...
    99+
    2023-06-29
  • Java中Handler源码的示例分析
    这篇文章主要介绍了Java中Handler源码的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。从很早开始就认识到 Handler 了,只不过那时修为尚浅,了解的不够深...
    99+
    2023-06-02
  • Vue中AST源码解析的示例分析
    这篇文章主要介绍Vue中AST源码解析的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!从这个函数开始的:// Line-3924  Vue.prototy...
    99+
    2022-10-19
  • Vue源码解析之数据响应系统的示例分析
    这篇文章主要介绍Vue源码解析之数据响应系统的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!数据双向绑定的思路1. 对象先来看元素是对象的情况。假设我们有一个对象和一个监测方...
    99+
    2022-10-19
  • Spring源码解析之推断构造方法的示例分析
    小编给大家分享一下Spring源码解析之推断构造方法的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Spring推断构造方法贴个测试代码直接开干,这只是个...
    99+
    2023-06-15
  • Vue.js源码分析之自定义指令的示例分析
    这篇文章给大家分享的是有关Vue.js源码分析之自定义指令的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前言除了核心功能默认内置的指令 (v-model 和 v-show),Vue 也允许注册自定义指令...
    99+
    2023-06-14
  • webpack源码之loader机制的示例分析
    这篇文章主要介绍webpack源码之loader机制的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!loader概念loader是用来加载处理各种形式的资源,本质上是一个函数...
    99+
    2022-10-19
  • Android框架之OkHttp3源码的示例分析
    这篇文章将为大家详细讲解有关Android框架之OkHttp3源码的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。OkHttp流程图OkHttp基本使用gradle依赖implementation...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作