

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晓码阁 版权所有