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

网站建设的软件平台sem竞价培训

网站建设的软件平台,sem竞价培训,网站做推广页需要什么软件有哪些,做枪网站ArrayList是我们经常用到的一个集合类。数组在创建时就要给一个明确的大小,而ArrayList的长度是可以动态调整的,因此,也叫动态数组。那么本篇我们一起学习下ArrayList的源码。 一、创建ArrayList 首先,我们从创建ArrayList开始。…

    ArrayList是我们经常用到的一个集合类。数组在创建时就要给一个明确的大小,而ArrayList的长度是可以动态调整的,因此,也叫动态数组。那么本篇我们一起学习下ArrayList的源码。

一、创建ArrayList

    首先,我们从创建ArrayList开始。上面也提到过,ArrayList的长度是可以动态调整的,我们通常创建一个不指定容量的数组。例如如下代码,创建一个空的ArrayList:

List<String> list = new ArrayList<>();

    看下构造方法的源码:

    代码注释说:构建一个容量为10的空List。List是基于数组来实现的,可以看到,构造方法这里创建了一个空的数组。咦?没看到容量为10啊,这个后面我们会介绍到。

二、添加元素

1、add

    创建好一个空的ArrayList后,我们调用add方法往里面添加元素,如下:

list.add("a");
list.add("b");
list.add("c");

    看下add方法的源码:

    核心是调用了红框中的add方法,看下其实现:

    可以看到,判断size是否达到了数组的长度,如果达到了长度,调用grow()方法扩容,然后把元素赋值给size的位置,对size加1。 简单总结:

   1扩容2赋值3加一。

2、扩容原理

    接下来,看下grow函数是怎么扩容的:

    基于当前的数组和新的容量(size + 1)复制新的容量的数组 ,看下newCapacity函数是如何去确定新的数组的容量的:

    代码注释机翻一下:返回至少与给定最小容量一样大的容量。如果足够的话,返回增加50%的当前容量。除非给定的最小容量大于MAX_ARRAY_SIZE,否则不会返回大于MAX_ARRAY_SIZE的容量。 在扩容的操作里面,用到了几个常量:

private static final int DEFAULT_CAPACITY = 10;
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
@Native public static final int   MAX_VALUE = 0x7fffffff;

    所以,扩容是这样的过程:

1、new = old + old *(old / 2): 扩容50%得到newCapacity

2、如果newCapacity - 最小容量(即size + 1)<=0,返回给定最小容量。需要注意,如果空的数组,那么返回的容量是10。

这里再详细解释下:

    往一个空的list去add元素,size = 0,minCapacity = size + 1,计算出的newCapacity = 0 + 0 = 0,这时候newCapacity - minCapacity = -1,满足了条件。然后这时候判断数组是空的,所以返回了max(10,1),也就是10。

    那么接下来继续add元素,容量为10,因此在添加到10个元素之前,都不会扩容。直到添加第11个元素的时候,触发扩容,这时候就是扩容50%了。

return (newCapacity - MAX_ARRAY_SIZE <= 0)? newCapacity: hugeCapacity(minCapacity);

    绝大多数情况下返回newCapacity,也就是扩容50%的容量,当新的容量超过MAX_ARRAY_SIZE,会走到hugeCapacity的逻辑:

总结下,ArrayList添加元素时的扩容流程:

1、新建的ArrayList容量10其实不准确,为0。

2、当首次添加元素时,容量扩展为默认容量10。

3、一直到添加满10个元素之前,都不会再次扩容,维持10的容量。

4、添加第11个元素时,会触发扩容50%;直到用完容量前,不会继续扩容,以此类推。

3、扩容demo验证 

    接下来,我们写一个小的demo验证下扩容的流程:

public class ArrayListTest {public static void main(String[] args) {// 创建一个空的ArrayListArrayList<Integer> list = new ArrayList<>();System.out.println("初始容量:" + getArrayListCapacity(list));for (int i = 0; i < 11; i++) {list.add(i);System.out.println("add第" + (i + 1) + "个元素,容量:" + getArrayListCapacity(list));}}/*** 反射获取Arraylist的容量* @param list* @return*/private static int getArrayListCapacity(ArrayList<?> list) {try {java.lang.reflect.Field capacityField = ArrayList.class.getDeclaredField("elementData");capacityField.setAccessible(true);return ((Object[]) capacityField.get(list)).length;} catch (NoSuchFieldException | IllegalAccessException e) {e.printStackTrace();return -1;}}

三、移除元素 

    移除元素使用remove方法,如下:

 (1)检验index,index非法则会抛出异常:IndexOutOfBoundsException

(2)把index的元素赋值给oldValue,并在程序最后返回该element

(3)调用fastRemove方法移除第index个元素

     看下fastRemove方法:

 

    基于当前的数组去把指定范围的数据copy到另一个数组,并把

http://www.wangmingla.cn/news/96090.html

相关文章:

  • 东莞长安网站推广公司苏州seo培训
  • 做网站的资金来源西安做网页的公司
  • 王磊网络网站建设网站模板中心
  • 深圳企业建站程序seo关键词快速排名软件
  • 天津做网站建设微信引流获客软件
  • 贵阳网站建设哪家java培训班学费一般多少
  • 专做网游视频的网站做网络推广需要多少钱
  • 用网站模板做网站搜索seo神器
  • 网站做的不好使模板建站多少钱
  • 动漫设计与制作零基础教程seo全称是什么
  • 汽车工厂网站建设百度移动排名优化软件
  • 网站怎么做备案变更seo优化师
  • 数字营销沙盘厦门关键词优化报价
  • 深圳做地铁的公司网站真正的免费建站在这里
  • iis默认网站不能启动培训总结精辟句子
  • 名词解释 网站规划济南网站建设方案
  • 做网站为什么图片上传不了搜索引擎优化策略不包括
  • 自助建站之星微信营销推广
  • 西宁网站建设加盟代理怎样做关键词排名优化
  • 做房地产公司网站的费用社群运营
  • 怎么做网站营销策划软文世界官网
  • 个体工商户年报登录入口天天seo伪原创工具
  • 网站建设赣icp百度点击软件
  • 网站默认首页怎么做目前最流行的拓客方法
  • 沈阳网站优化建设seo顾问服务深圳
  • 企业大型网站开发新闻今日要闻
  • 香港网站建设seo每日一贴
  • 南京地区网站开发sem和seo有什么区别
  • 网络公司免费做网站 卖货抽提成百度推广关键词匹配模式
  • b2b网站外包建设热词分析工具