集合ArrayList与list的本质

package com.temp;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

public class Tmp {

public static void main (String[] args)throws Exception {

//源代码是不能直接查看的,ctrl点击进入的是一个字节码的文件
//把jdk文件里面的src.zip文件导入才能查看到源代码

//问题一:数组是如何扩展的?
//可变数组长度
//初始值(未add的时候)为空
//add以后为默认长度
//
//问题二:数组的默认长度是多少?
//arraylist默认的长度是10

//问题三:(增长因子数)当长度为10的时候,增长的方式是如何的??如何自增的
//每当数组长度超过的时候就会以0.5倍自增(增长因子数为0.5倍)
//向下取整数
// ArrayList arr=new ArrayList();
// arr.add("a");
// arr.add("b");
// arr.add("c");
// arr.add("d");
// arr.add("e");
// arr.add("f");
// System.out.println(arr.size());
// System.out.println("---------下标输出方式");
// //下标输出方式
// for(int i=0;i<arr.size();i++) {
// System.out.println(arr.get(i));
// }
// System.out.println("---------foreach输出(需要jdk>=1.5)");
// //foreach输出(需要jdk>=1.5)
// //集合中的某一个元素
// //如果jdk<1.5就会报错
// for(Object o:arr) {
// System.out.println(o);
// }
// System.out.println("---------jdk1.8的语法糖");
// //jdk1.8的语法糖
// //arr.forEach(x->System.out.println(x));
// //x等同于foreach的一个对象
// //命名自定义
//
// System.out.println("---------迭代器");
// //迭代器
// Iterator it=arr.iterator();
// while(it.hasNext()) {
// System.out.println(it.next());
// }

// ArrayList arr=new ArrayList(5);
// for(int i=0;i<30;i++) {
// print(arr);
// arr.add(i);
// }
ArrayList arr=new ArrayList(5);
arr.add("a");
arr.add("b");
arr.add("c");
arr.add("d");
arr.add("e");
ListIterator list=arr.listIterator();
//只能先向下读取再向上读取。否则就会出项只有向下读取有值,向上读取没有值
System.out.println("----------下");
//向下读取
while(list.hasNext()) {
System.out.println(list.next());
}
System.out.println("----------上");
//向上读取
while(list.hasPrevious()) {
System.out.println(list.previous());
}
//栈 是一个车厢 最大的容量是3M
//堆 是一个火车 将内存中的零散空间组成的一张链式表格

}

//使用反射查看属性
//反射(反编译过程)
//java源文件到字节码为编译过程
//从字节码文件到Java源文件为反编译过程(反射)
static void print(ArrayList arraylist)throws Exception{
Class c=arraylist.getClass();
Field elementdateDField=c.getDeclaredField("elementData");
elementdateDField.setAccessible(true);//不可访问的,要设置为true
Object[] arr=(Object[])elementdateDField.get(arraylist);
System.out.println("elementdateDField.length="+arr.length);
}






}

猜你喜欢

转载自www.cnblogs.com/hyfl/p/10885261.html
今日推荐