当前位置: 首页 > news >正文

网站建设怎么刚刚中国突然宣布

网站建设怎么,刚刚中国突然宣布,海外pvn加速器,建设工程施工合同组成ArrayList深入源码一、ArrayList源码解析1. MIXIN 的混入2. 属性说明3. 构造方法4. 其他方法(核心)iterator 和 listIterator 方法add方法remove 方法sort方法其他二、ArrayList 为什么是线程不安全的?体现哪些方面呢?三、ArrayLi…

ArrayList深入源码

  • 一、ArrayList源码解析
    • 1. MIXIN 的混入
    • 2. 属性说明
    • 3. 构造方法
    • 4. 其他方法(核心)
      • iterator 和 listIterator 方法
      • add方法
      • remove 方法
      • sort方法
      • 其他
  • 二、ArrayList 为什么是线程不安全的?体现哪些方面呢?
  • 三、ArrayList 细节汇总

前言:
个人觉得看源代码会增进不少知识,一直都是看别人写的博客中的代码片段,没自己静下心来去看过,接下来体验体验源码的快乐。

一、ArrayList源码解析

在这里插入图片描述

对 ArrayList 相应关系有了大致的了解后,咱由外到里依次深入。

1. MIXIN 的混入

ArrayList 利用 MIXIN 的思想,实现了多继承。

说明其实现的接口:

  1. Serializable接口:使得ArrayList 支持序列化和反序列化。
  2. RandomAccess接口:该接口是一个标记接口,意在标明ArrayList 具备快速随机访问的能力,使用for 会比使用 迭代器(iterator)访问速度要快。LinkedList 那边即不具备这种能力,所以不存在这种标记(原因是因为LinkedList 底层是链表,访问都是从根到尾的,所以它使用迭代器会更快)。
  3. Cloneable接口:也是一个标记接口,实现了它便可以去重写Object 下的clone 方法,利于对象进行创建副本。(注意:是ArrayList 实现了Cloneable接口,当利用多态向上转型为List 时,是不可以使用的。

下面是 ArrayList 内部重写的 clone 方法的代码。

/*** Returns a shallow copy of this {@code ArrayList} instance.  (The* elements themselves are not copied.)** @return a clone of this {@code ArrayList} instance*/public Object clone() {try {ArrayList<?> v = (ArrayList<?>) super.clone();v.elementData = Arrays.copyOf(elementData, size);v.modCount = 0;return v;} catch (CloneNotSupportedException e) {// this shouldn't happen, since we are Cloneablethrow new InternalError(e);}}

emmmm…这里我不知道返回值的数据类型不直接为 ArrayList,一般我去重写的话就会直接。。。

2. 属性说明

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. 构造方法

ArrayList 有三个构造方法,俩有参,一无参的。

在这里插入图片描述

在这里插入图片描述

第三个描述的那个构造方法如何使用呢 ?

由于Arrays.asList() 得到的集合固定大小的,是由Arrays内部类所实例化的,是没有 clone(),add(),remove(),clear()等这样的动态操作的,但如果想要使用这种动态操作怎么办呢?

那咱就可以利用这个构造方法,看代码更清晰:

		String[] s = {"xx","yy"};//List<String> xxx = Arrays.asList(s);//xxx.add("mm"); /*这里运行最后是会报异常的,这是因为Arrays 里面有个ArrayList 的内部类,它没有重写add和remove等方法。但没运行是不会爆红的,虽然没有重写那些方法,但该内部类继承了AbstractList,这个类里面这些方法不是抽象的...*/List<String> list = new ArrayList<>(Arrays.asList(s));list.add("mm");list.forEach(System.out::println);// 正常输出

在这里插入图片描述

4. 其他方法(核心)

先不说方法,先说说类里面实现的Iterator接口和它的子接口,ListIterator接口。(虽然ArrayList 实例对象用迭代器的话比较少,但是量变质不变,LinkedList 可以用啊)。

iterator 和 listIterator 方法

在这里插入图片描述

  • 看看Iterator 接口的实现类 Itr 内部吧:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 再来看看 ListIterator 接口实现类 ListItr(继承了Itr) 的内部吧:

在这里插入图片描述
在这里插入图片描述

这里继承,所以forEachRemaining方法也是可以使用的。

有了 listIterator() , 不会还有人用 iterator() 吧。注意ListIterator 只在List 集合中出现了哦,也就是 Vector、ArrayList、LinkedList、Stack这样的。

也可以看看 JAVA中ListIterator和Iterator详解与辨析 这篇博客对其的一些解释。

add方法

add 对外提供的方法有俩,add(E e)add(int index, E e)。它俩有公共的点是,判断类内定义的elementData数组长度是否和元素size(个数)相匹配,是否需要扩容。
也就是说它们俩有一个共同的方法,让elementData扩容。咋括滴勒,咱来看看这个grow方法内部。

在这里插入图片描述
咱看别人博客都说是1.5倍扩容的,但是是怎么个扩容呢?下面看源码分析分析。

在这里插入图片描述

通过调用 ArraysSupport类中的newLength方法,我们获得newCapacity后,通过Arrays.copyOf完成扩容。

  • 先来看看ArraysSupport类中的newLength方法。(1.5倍的由来)

在这里插入图片描述

  • 再来看看Arrays.copyOf方法调用吧:

在这里插入图片描述
它内部用的是System.arraycopy这个方法。这是核心啊,我觉得这也是ArrayList 性能要比较好的关键。这玩意将数据复制给一个副本然后返回给elementData数组。arraycopy 是本地(native)方法。它强在它是浅拷贝,它是直接拷贝所存放的地址,而不是像深拷贝那样重新分配内存。

有关浅拷贝和深拷贝,可以看看这篇《浅拷贝和深拷贝》,或者我写的这篇《clone方法》。

了解完如何扩容之后,再来看看俩方法的具体实现:

  • add(E e)

在这里插入图片描述

  • add(int index,E e)

在这里插入图片描述

remove 方法

remove 方法也有两种对外提供,remove(int index),remove(Object obj)

它们都是根据索引去调用内部的 fastRemove(Object[] es, int i)方法去进行移除。也是调用System下面的arraycopy方法,然后把那个设置为空(null),让GC回收。

咱先来看看 fastRemove 方法的实现吧:

在这里插入图片描述

  • remove(int index)

在这里插入图片描述

  • remove(Object obj)

在这里插入图片描述

有关 mark 标记的使用可以看这篇博客《mark标号》。

从代码可以看出,不管传入的参数是空还是非空,都会对 elementData 进行操作进行删除。

sort方法

jdk1.8 后,List接口就引入了sort 这个默认方法。

  • List 中的 sort 方法:

在这里插入图片描述

  • ArrayLIst 重写的 sort 方法(重写的原因很简单,ArrayList内部本就是动态数组所构的,用迭代器去重写对元素进行设置纯属是多余):

在这里插入图片描述
及其舒适简单。

可以直接用LIst集合中的sort了,其实调用Collections 工具类中的sort 方法,最后还是会回到List 集合中,还不如直接使用呢。

其他

还有一些常用的 方法,比如:

  • set(int index,E element)
  • isEmpty()
  • get(int index)
  • indexOf(Object)
  • lastIndexOf(Object)
  • clear()
  • toArray()
  • contains()
  • trimToSize() 还是通过Arrays.copyOf 将数组长度变成和数组元素个数(size)一致,可以减少空间的损失。

理解了 ArrayList 的本质,这些方法的实现其实自己想也想的出来。

二、ArrayList 为什么是线程不安全的?体现哪些方面呢?

可以看看这篇博客写的几点线程不安全的情况以及其测试。

《ArrayList为什么线程不安全 线程不安全体现在哪些方面 源码角度分析其具体原因》

三、ArrayList 细节汇总

  • ArrayList 是基于动态数组实现的,当进行插入或删除操作的时候,都会进行数组的拷贝复制。
  • ArrayList 它很多地方是分步进行操作的,**而且内部元素也是可以为 null 的。**它不是线程安全的。
  • ArrayList 删除元素时,只会改变元素的个数(size),而不会改变容量(elementData.length),如果想要更改,可以调用trimToSize()方法,它会给你改成和元素个数一样的值。
http://www.ds6.com.cn/news/41208.html

相关文章:

  • 所有网站的名字大全网络营销的主要手段
  • 湖南企业建网站互联网广告销售是做什么的
  • 做企业网站怎么接活百度统计怎么使用
  • 真正免费的自学网站百度信息流广告位置
  • 平谷建站推广培训学校加盟费用
  • wordpress安装配置php5.2辽阳网站seo
  • 台州网站推广推广普通话宣传内容
  • 做网站买过域名之后百度河南代理商
  • 响应式网页设计图片南京谷歌seo
  • 站长工具怎么关掉培训心得总结怎么写
  • 北京专业网站建设公司个人建站
  • 网站建设公司的商业模式贵港seo关键词整站优化
  • 有哪些做的好的营销型网站国内建站平台有哪些
  • 工商局网站实名认证怎么做外包公司软件开发
  • 平湖模板网站建设公司精准网络营销推广
  • 网站做营销推广百度高级搜索
  • 大连做网站团队竞猜世界杯
  • 南通网站建设外包国内新闻大事20条
  • 网站建设维护与推广自己做网站如何赚钱
  • 解决方案的网站建设廊坊百度快照优化排名
  • 国内经典网站站长联盟
  • 高端的网站设计多少钱百度关键词搜索引擎
  • 十大不收费看盘软件网站seo研究中心好客站
  • behance设计网站图片百度推广关键词怎么设置好
  • 深圳网站排名怎么做潍坊seo培训
  • 我们做网站 出教材 办育心经免费个人网站平台
  • 长沙网站制作合作商seo排名工具
  • 怎么创建网页超链接海淀区seo引擎优化
  • php网站建设案例教程嵌入式培训班一般多少钱
  • 自己开发网站怎么开发中国十大it培训机构排名