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

做网站公司在丹麦上海企业网站建设补贴

做网站公司在丹麦,上海企业网站建设补贴,在线搜索资源,浙江建设特种证书查询1、简介 ArrayList是Java集合框架中的一个重要的类#xff0c;它继承于AbstractList#xff0c;实现了List接口#xff0c;是一个长度可变的集合#xff0c;提供了增删改查的功能。集合中允许null的存在。ArrayList类还是实现了RandomAccess接口#xff0c;可以对元素进行…1、简介 ArrayList是Java集合框架中的一个重要的类它继承于AbstractList实现了List接口是一个长度可变的集合提供了增删改查的功能。集合中允许null的存在。ArrayList类还是实现了RandomAccess接口可以对元素进行快速访问。实现了Serializable接口说明ArrayList可以被序列化还有Cloneable接口可以被复制。和Vector不同的是ArrayList不是线程安全的。 下图是ArrayList的结构层次 2、主要方法详解 ArrayList底层使用的是Java数组来存储集合中的内容这个数组是Object类型的 transient Object[] elementData;同时elementData的访问级别为包内私有是为了使内部类能够访问到其中的元素。 使用int类型的size表示数组中元素的个数 private int size; 为了对应不同的构造函数ArrayList使用了不同的数组 /*** Shared empty array instance used for empty instances.*/private static final Object[] EMPTY_ELEMENTDATA {};/*** Shared empty array instance used for default sized empty instances. We* distinguish this from EMPTY_ELEMENTDATA to know how much to inflate when* first element is added.*/private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA {};代码中有个常量表示数组的默认容量大小为10 /*** Default initial capacity.*/private static final int DEFAULT_CAPACITY 10;1构造函数 常量EMPTY_ELEMENTDATA和DEFAULTCAPACITY_EMPTY_ELEMENTDATA是为了初始化elementData的。如果为无参构造函数使用DEFAULTCAPACITY_EMPTY_ELEMENTDATA如果为含参构造函数使用EMPTY_ELEMENTDATA public ArrayList(int initialCapacity) {if (initialCapacity 0) {this.elementData new Object[initialCapacity];} else if (initialCapacity 0) {this.elementData EMPTY_ELEMENTDATA;} else {throw new IllegalArgumentException(Illegal Capacity: initialCapacity);}}/*** Constructs an empty list with an initial capacity of ten.*/public ArrayList() {this.elementData DEFAULTCAPACITY_EMPTY_ELEMENTDATA;} 使用上述构造函数elementData中没有元素size为0不过elementData的长度有可能不同。 ArrayList还提供了使用集合构造的构造函数 public ArrayList(Collection? extends E c) {elementData c.toArray();if ((size elementData.length) ! 0) {// c.toArray might (incorrectly) not return Object[] (see 6260652)if (elementData.getClass() ! Object[].class)elementData Arrays.copyOf(elementData, size, Object[].class);} else {// replace with empty array.this.elementData EMPTY_ELEMENTDATA;}} 函数首先将集合c转化为数组然后检查转化的类型如果不是Object[]类型使用Arrays类中的copyOf方法进行复制同时如果c中没有元素使用EMPTY_ELEMENTDATA初始化。 2trimToSize() 由于表示集合中元素个数的size和表示集合容量的elementData.length可能不同在不太需要增加集合元素的情况下容量有浪费可以使用trimToSize方法减小elementData的大小。代码如下 public void trimToSize() {modCount;if (size elementData.length) {elementData (size 0)? EMPTY_ELEMENTDATA: Arrays.copyOf(elementData, size);}}代码中有个modCount这个是继承自AbstractList中的字段表示数组修改的次数数组每修改一次就要增加modCount。可以看到ArrayList的底层使用Object[]类型的数组存储内容使用Arrays类来处理数组中的内容。 3ensureCapacity(int minCapacity) 这个方法可以用来保证数组能够包含给定参数个元素也就是说如果需要的话可以扩大数组的容量。主要代码 public void ensureCapacity(int minCapacity) {int minExpand (elementData ! DEFAULTCAPACITY_EMPTY_ELEMENTDATA)// any size if not default element table? 0// larger than default for default empty table. Its already// supposed to be at default size.: DEFAULT_CAPACITY;if (minCapacity minExpand) {ensureExplicitCapacity(minCapacity);}}首先检查是不是DEFAULTCAPACITY_EMPTY_ELEMENTDATA如果是的话说明长度为10如果不是将minExpand设为0比较与minCapacity的大小然后调用私有函数进行操作 private void ensureCapacityInternal(int minCapacity) {if (elementData DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {minCapacity Math.max(DEFAULT_CAPACITY, minCapacity);}ensureExplicitCapacity(minCapacity);}首先minCapacity和默认大小10比较如果需要扩大容量继续调用 private void ensureExplicitCapacity(int minCapacity) {modCount;// overflow-conscious codeif (minCapacity - elementData.length 0)grow(minCapacity);}然后比较minCapacity和当前长度的大小如果需要扩容调用grow方法 private void grow(int minCapacity) {// overflow-conscious codeint 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);}这里首先增加容量为原来的1.5倍如果还不够就用给定的容量minCapacity。同时ArrayList设置了数组的最大长度MAX_ARRAY_SIZE Integer.MAX_VALUE - 8如果没超出使用Arrays类进行复制不够的元素使用null。如果超出最大长度调用函数检查是否溢出 private static int hugeCapacity(int minCapacity) {if (minCapacity 0) // overflowthrow new OutOfMemoryError();return (minCapacity MAX_ARRAY_SIZE) ?Integer.MAX_VALUE :MAX_ARRAY_SIZE;}如果没有溢出就得到合适的minCapacity值然后复制。 4size() 函数返回集合中元素的数量 public int size() {return size;}5isEmpty() 函数返回集合是否为空检查size是否为0即使容量不为0没有元素 public boolean isEmpty() {return size 0;}6contains(Object o) 检查集合中是否包含给定的元素 public boolean contains(Object o) {return indexOf(o) 0;} 使用indexOf方法如果返回值非负表示集合中函数这个元素。 7indexOf(Object o) 函数返回集合中给定元素的第一次出现的位置如果没有就返回-1 public int indexOf(Object o) {if (o null) {for (int i 0; i size; i)if (elementData[i]null)return i;} else {for (int i 0; i size; i)if (o.equals(elementData[i]))return i;}return -1;} 首先检查o是否为null如果为null就返回集合中第一个null元素的位置如果不为null就是用equals函数进行相等性检查。之所以这样是因为如果直接对null调用equals方法会抛出空指针异常。同时也不能循环遍历数组中的元素调用equals方法检查是否相等因为ArrayList集合中允许有null元素的存在。 8lastIndexOf(Object o) 函数返回给定元素最后一次出现的位置如果没有就返回-1 public int lastIndexOf(Object o) {if (o null) {for (int i size-1; i 0; i--)if (elementData[i]null)return i;} else {for (int i size-1; i 0; i--)if (o.equals(elementData[i]))return i;}return -1;} 原理和indexOf一样不过对集合元素遍历的时候是倒序遍历的。 9clone() 复制集合 public Object clone() {try {ArrayList? v (ArrayList?) super.clone();v.elementData Arrays.copyOf(elementData, size);v.modCount 0;return v;} catch (CloneNotSupportedException e) {// this shouldnt happen, since we are Cloneablethrow new InternalError(e);}} 本质上就是使用Arrays类进行元素的复制。 10toArray() 将集合转化为数组 public Object[] toArray() {return Arrays.copyOf(elementData, size);}也是使用Arrays的复制操作。 11toArray(T[] a) 转化为数组和上一个不同的是上一个返回的数组是Object[]类型的这个函数返回的数组类型根据参数确定 SuppressWarnings(unchecked)public T T[] toArray(T[] a) {if (a.length size)// Make a new array of as runtime type, but my contents:return (T[]) Arrays.copyOf(elementData, size, a.getClass());System.arraycopy(elementData, 0, a, 0, size);if (a.length size)a[size] null;return a;}12get(int index) 返回指定位置的元素这里用到了一个私有函数 SuppressWarnings(unchecked)E elementData(int index) {return (E) elementData[index];}函数返回数组中指定位置的元素不过这个函数没有进行下标范围检查这个工作由另一个私有函数完成 private void rangeCheck(int index) {if (index size)throw new IndexOutOfBoundsException(outOfBoundsMsg(index));}对于get方法来说首先调用rangeCheck检查下标然后调用elementData返回元素 public E get(int index) {rangeCheck(index);return elementData(index);}13set(int index,E element) 设置给定位置的元素为给定的元素然后返回原来的元素 public E set(int index, E element) {rangeCheck(index);E oldValue elementData(index);elementData[index] element;return oldValue;}同样函数也先进行下标检查。 14add(E e) 添加元素 public boolean add(E e) {ensureCapacityInternal(size 1); // Increments modCount!!elementData[size] e;return true;}首先确保有足够的容量然后再末尾添加元素。 15add(int index,E element) 在指定位置添加元素 public void add(int index, E element) {rangeCheckForAdd(index);ensureCapacityInternal(size 1); // Increments modCount!!System.arraycopy(elementData, index, elementData, index 1,size - index);elementData[index] element;size;}16remove(int index) 删除指定位置的元素然后返回这个元素 public E remove(int index) {rangeCheck(index);modCount;E oldValue elementData(index);int numMoved size - index - 1;if (numMoved 0)System.arraycopy(elementData, index1, elementData, index,numMoved);elementData[--size] null; // clear to let GC do its workreturn oldValue;}17remove(Object o) 删除指定的元素如果集合中有则删除第一次出现的并返回true如果没有集合不变并返回false public boolean remove(Object o) {if (o null) {for (int index 0; index size; index)if (elementData[index] null) {fastRemove(index);return true;}} else {for (int index 0; index size; index)if (o.equals(elementData[index])) {fastRemove(index);return true;}}return false;}在找到集合中的元素后函数调用私有方法fastRemove来删除这个元素 private void fastRemove(int index) {modCount;int numMoved size - index - 1;if (numMoved 0)System.arraycopy(elementData, index1, elementData, index,numMoved);elementData[--size] null; // clear to let GC do its work}18clear() 清空集合将所有元素设为null并把size设为0 public void clear() {modCount;// clear to let GC do its workfor (int i 0; i size; i)elementData[i] null;size 0;}19addAll(Collection? extends E c) 添加给定集合中的所有元素到集合中从末尾开始添加 public boolean addAll(Collection? extends E c) {Object[] a c.toArray();int numNew a.length;ensureCapacityInternal(size numNew); // Increments modCountSystem.arraycopy(a, 0, elementData, size, numNew);size numNew;return numNew ! 0;}首先把c集合转为数组然后确保容量最后复制。 20add(int index,Collection? extends E c) 在指定位置开始添加指定集合中的所有元素 public boolean addAll(int index, Collection? extends E c) {rangeCheckForAdd(index);Object[] a c.toArray();int numNew a.length;ensureCapacityInternal(size numNew); // Increments modCountint numMoved size - index;if (numMoved 0)System.arraycopy(elementData, index, elementData, index numNew,numMoved);System.arraycopy(a, 0, elementData, index, numNew);size numNew;return numNew ! 0;}原理和上一个一样不同的是复制的位置。 21removeRange(int fromIndex,int toIndex) 删除给定范围内的所有元素 protected void removeRange(int fromIndex, int toIndex) {modCount;int numMoved size - toIndex;System.arraycopy(elementData, toIndex, elementData, fromIndex,numMoved);// clear to let GC do its workint newSize size - (toIndex-fromIndex);for (int i newSize; i size; i) {elementData[i] null;}size newSize;}22removeAll和retainAll 这两个函数都给一个集合参数cremoveAll删除集合中所有在集合c中出现过的元素retainAll保留所有在集合c中出现的元素。两个函数都调用私有函数batchRemove() public boolean removeAll(Collection? c) {Objects.requireNonNull(c);return batchRemove(c, false);}public boolean retainAll(Collection? c) {Objects.requireNonNull(c);return batchRemove(c, true);}batchRemove函数如下 private boolean batchRemove(Collection? c, boolean complement) {final Object[] elementData this.elementData;int r 0, w 0;boolean modified false;try {for (; r size; r)if (c.contains(elementData[r]) complement)elementData[w] elementData[r];} finally {// Preserve behavioral compatibility with AbstractCollection,// even if c.contains() throws.if (r ! size) {System.arraycopy(elementData, r,elementData, w,size - r);w size - r;}if (w ! size) {// clear to let GC do its workfor (int i w; i size; i)elementData[i] null;modCount size - w;size w;modified true;}}return modified;}函数对集合中的元素进行遍历首先复制集合中的元素然后检查是否符合complement的要求进行保留。在finally中复制元素到集合中。并修改相应的size。 23ListIteratorE listIterator()和ListIteratorE listIterator(int index) 这两个函数返回在集合上的一个迭代器不同是第一个是关于所有元素的第二个是从指定位置开始的。这里ArrayList使用了内部类ListItr public ListIteratorE listIterator(int index) {if (index 0 || index size)throw new IndexOutOfBoundsException(Index: index);return new ListItr(index);}public ListIteratorE listIterator() {return new ListItr(0);} 24IteratorE iterator() 也返回一个迭代器使用了内部类Itr继承于ListItr public IteratorE iterator() {return new Itr();}25ListE subList(int fromIndex, int toIndex) 返回一个从fromIndex到toIndex的子集合 public ListE subList(int fromIndex, int toIndex) {subListRangeCheck(fromIndex, toIndex, size);return new SubList(this, 0, fromIndex, toIndex);}使用了内部类SubList。 3、例子 三种遍历方式 span stylewhite-space:pre /spanInteger[] nums{2,1,3,6,0,4,5,8,7,9};ListInteger listnew ArrayList(); span stylewhite-space:pre /spanlistArrays.asList(nums);//使用RandomAccess方式System.out.println(#1:);for(int i0;ilist.size();i){System.out.print((int)list.get(i));}//使用foreachSystem.out.println(\n#2:);for (Integer integer : list) {System.out.print(integer);}//使用IteratorSystem.out.println(\n#3:);IteratorInteger itlist.iterator();while(it.hasNext()){System.out.print((int)it.next());}结果#1: 2136045879 #2: 2136045879 #3: 2136045879
http://www.zqtcl.cn/news/333772/

相关文章:

  • 做网站在网站建设客户
  • 河北建设厅安监站官方网站一个新手怎么做电商
  • 做结婚请柬网站有那些做网店哪个网站好
  • 做网站尽在美橙互联欧美简约风格网站设计
  • idea建设完整的网站微官网下载
  • 阿城区建设小学网站上海建设行政主管部门政务网站
  • 西丽网站建设网站怎样做才能有点击率
  • 网站建设图片大小建设部网站1667号公告
  • 做wps的网站赚钱网站建设中网站图片如何修改
  • 公司招商型网站建设怎么自己做网站挣钱
  • 红酒手机网站建设中视频自媒体注册
  • 免费网站2022年能用的网址青阳网站建设
  • 网站建设的开发方式知乎科技部网站建设合同范本
  • 兰州市建设厅官方网站做酒店的网站
  • 宠物店网站开发文档撰写洛阳市河阳建设工程有限公司网站
  • 毕业设计做网站应该学什么wordpress调用子分类
  • 怎么建网站做淘宝客用国外网站 图片做自媒体
  • 汕头建站模板搭建怎么制作有效网站
  • 学生个人网站作品怎么wordpress用的什么主题
  • 设计logo网站侵权吗知乎一键做单页网站
  • 网站服务器有什么用做视频网站视频存放问题
  • 影评网站建设可以免费发布招聘网站
  • 富阳做兼职的网站正邦设计上海分公司
  • 网站漏洞解决办法投资
  • wordpress网站如何网页设计实训总结3000字大学篇
  • 用ps怎么做网站导航条wordpress 开启缩略图
  • 网上销售型的企业网站为什么要域名备案
  • 唐山网站建设方案优化国内酷炫网站
  • 国外网站备案吗网站做一样没有侵权吧
  • 谷歌怎么建网站ps中怎样做网站轮播图片