1集合框架(简介、Collection方法、迭代器)
集合框架中提供了一个内部类专门操作集合中的元素,这个内部类就是迭代器
数据结构
集合框架的由来:数据多了用对象进行存储,对象多了用集合来进行存储。
而存储数据的方式(数据结构)各有不同,所以存储的容器也就有多种,从而形成了集合框架这一体系。
集合父类:List接口
集合子类:Arraylist、Vector、Linkedlist、
List 继承 Collection接口 并且依赖 ListIterator接口
ListIterator 接口 继承 Iterator接口
Collection 接口 , 依赖 ListIterator 接口
1.1 list 集合遍历的三种方法
// for(Object obj:al) {
// System.out.println(obj);
// }
//for循环 取下标
// for(int i=0; i<al.size();i++) {
// System.out.println(al.get(i));
// }
//迭代器
// Iterator it=al.iterator();
// while(it.hasNext()) {
// System.out.println(it.next());
// }
//
1.2迭代器在内存中的一个走向
判断指针的下一个走向会不会指向一个对象,如果有,它必然就会指向一个对象,就执行hasNext()方法,然后就会判断al.next,如果这个元素%2==0,就打印这个元素的下一个元素,依次循环
1.3获取指定元素
// Iterator it=al.iterator();
// while(it.hasNext()) {
// System.out.println(it.next());
// int obj=(Integer)it.next();
// if(obj%2==0) {
// System.out.println(it.next());
// }
// }
2 集合框架List(ArrayList特有方法、特有迭代器、具体对象特点、增长因子论证)
学集合框架就是了解容器的数据结构
Collection
List 有序 元素可以重复 因为该集合体系有索引
Arraylist 数组结构 增删慢,查询快 有连续下标 线程不同步 增长因子为1.5 10
vector 数组结构 增删改查都慢 有连续下标 线程同步 增长因子2 10
2.1 特有迭代器ListIterator
public static void main(String[] args) {
ArrayList al=new ArrayList<>();
al.add(22);
al.add(24);
al.add(26);
al.add(28);
al.add(29);
ListIterator it=al.listIterator();
普通输出
while(it.hasNext()) {
System.out.println(it.next());
}
倒叙输出
while(it.hasPrevious()) {
System.out.println(it.previous());
}
}
2.2 Arraylist add方法
//数组结构
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
//声明一个object[]的数组来存放元素
transient Object[] elementData; // non-private to simplify nested class access
//数组的长度默认为10
private static final int DEFAULT_CAPACITY = 10;
2.3增长因子论证代码
public static void main(String[] args) throws Exception {
ArrayList al=new ArrayList<>();
for(int i=1;i<60;i++) {
al.add(i);
System.out.println(i+",");
getLen(al);
}
public static void getLen(ArrayList al)throws Exception{
Field field=al.getClass().getDeclaredField("elementData");
field.setAccessible(true);
Object obj=field.get(al);
Object[] elementData=(Object[])obj;
System.out.println("当前操作的list集合中低层存放数据容器的长度:"+elementData.length);
}
}
2.4如何对lits进行性能调优
- 每当容器的元素长度超过上限都会改变容器的容量
- 根据需求来给容器的容量,到了上限翻1.5倍,并且只翻倍一次
public static void main(String[] args) throws Exception {
ArrayList al=new ArrayList<>(50);
for(int i=1;i<60;i++) {
al.add(i);
System.out.println(i+",");
getLen(al);
}
public static void getLen(ArrayList al)throws Exception{
Field field=al.getClass().getDeclaredField("elementData");
field.setAccessible(true);
Object obj=field.get(al);
Object[] elementData=(Object[])obj;
System.out.println("当前操作的list集合中低层存放数据容器的长度:"+elementData.length);
}
}
3、集合框架Vector
1.特有的遍历方式
public class VectorDemo {
public static void main(String[] args) {
Vector v=new Vector<>();
v.add(22);
v.add(24);
v.add(26);
v.add(28);
v.add(29);
Enumeration elements = v.elements();
while(elements.hasMoreElements()) {
System.out.println(elements.nextElement());
}
}
}