ArrayList集合增长因为0.5,初始长度为10,明确这一特点就可以通过改变初始长度,来提升代码性能问题
/** * ArrayList集合增长因子论证 * @param args * @throws NoSuchFieldException * @throws SecurityException * @throws IllegalArgumentException * @throws IllegalAccessException */ public static void method_increment(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { ArrayList list = new ArrayList<>(50); getLen(list); for (int i = 1; i <= 60; i++) { list.add(i); System.out.print(i+","); getLen(list); } } /** * list集合底层的数组长度 * @param list * @throws NoSuchFieldException * @throws SecurityException * @throws IllegalArgumentException * @throws IllegalAccessException */ public static void getLen(ArrayList list) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { Field declaredField = list.getClass().getDeclaredField("elementData"); declaredField.setAccessible(true); Object object = declaredField.get(list); Object[] elementData = (Object[]) object; System.out.println("elementData.length:"+elementData.length); }
相关代码如下
package com.javaxl; import java.util.ArrayList; import java.util.Iterator; import java.util.ListIterator; /** * @author 小李飞刀 * @site www.javaxl.com * @company * @create 2019-05-12 22:37 * * 1、list集合相对于collection集合所特有的方法 * 2、Iterator.remove()与Collection.remove()的区别 * 3、Iterator与ListIterator的区别 * * Collection * List 有序 元素可以重复 因为该集合体系有索引 * Arraylist 数组结构 增删慢,查询快 有连续下标 线程不同步 增长因子为1.5 * vector 数组结构 增删改查都慢 有连续下标 线程同步 增长因子2 * Linkedlist 链表结构 增删快,查询慢 没有连续下标 * Set 无序 元素不可以重复 * * List:凡是可以操作角标的方法都是该体系所特有的方法 * 增 * Add(index,element) * Add(index,Collection) * * 删 * Remove(index) * * 改 * Set(index,element) * * 查 * Get(index) * subList(from,to) * listIterator() * index(element) * * list集合所特有的迭代器,ListIterator是Iterator的子接口 * 在迭代时,不可以通过集合对象的方法操作集合中的元素; * 因为会发生并发修改异常(ConcurrentModificationException); * 所以,在迭代时,只能通过迭代器来操作元素,课时Iterator的方法是有限的,Iterator只提供了判断、 * 取出、删除的操作; * 如果想要有其他的操作,如添加、修改等,就需要使用其子接口ListIterator,该接口只能list集合的listIterator方法来获取 */ public class ListDemo { public static void main(String[] args) { ArrayList al = new ArrayList(); al.add("java01"); al.add("java02"); al.add("java03"); al.add("java04"); Iterator it = al.iterator(); while (it.hasNext()){ Object obj = it.next(); if("java02".equals(obj)){ // al.remove(obj);// 出现并发异常ConcurrentModificationException,有迭代器对象与集合对象同时对obj进行操作 it.remove();// 都用迭代器进行操作,不会出现上诉异常,另外,这句代码在内存中的意思是,将obj引用从堆内存集合中移除。但是栈内存中还有obj引用,堆内存中还有该元素对象 } System.out.println(obj);// java02依然会被打印 } System.out.println("集合:"+al); // for(Iterator it2 = al.iterator();it2.hasNext();){ // System.out.println(it2.next()); // } // 修改元素 ListIterator lit = al.listIterator(); while(lit.hasNext()){ Object obj = lit.next(); if("java03".equals(obj)){ lit.set("java09"); } } System.out.println("集合:"+al);//Java03变成了Java09 } public static void method_special(String[] args) { ArrayList al = new ArrayList(); al.add("java01"); al.add("java02"); al.add("java03"); al.add("java04"); System.out.println("原集合是:"+al); al.add(1,"java09"); System.out.println("现在集合是:"+al); al.remove(2); System.out.println("现在集合是:"+al); al.set(2,"java08"); System.out.println("现在集合是:"+al); //list特有的遍历方式 for(int i=0;i<al.size();i++){ System.out.println("al["+i+"]="+al.get(i)); } // 迭代器遍历 Iterator it = al.iterator(); while (it.hasNext()){ System.out.println(it.next()); } System.out.println("java09 index:"+al.indexOf("java09")); System.out.println("获取1到3的元素:"+al.subList(1,3)); } }
备案号:湘ICP备19000029号
Copyright © 2018-2019 javaxl晓码阁 版权所有