目录
说一下ArrayList 和LinkList 的区别?
1.arrayList 是动态数组 ,List接口的实现,LinkList 是链表List接口实现。
2.arrayList插入和删除慢,LinkList查找慢。
任何对象加入集合类中自动转化为Object 类,取出时需要进行类型转化。
-
迭代器Iterator使用
next ()操作一次后会指向下一个。NoSuchElementException
- 如果迭代没有更多的元素
- while循环遍历
public static void iterator(Collection collection){
Iterator iterator =collection.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
- for 循环遍历:
public static void iterator_ByFor(Collection collection){
for (Iterator iterator =collection.iterator();iterator.hasNext();)
{
System.out.println(iterator.next());
}
}
迭代器原理
每个容器内部对象都实现了iterator 接口, 例如ArraList 内部:
private class Itr implements Iterator<E> {
int cursor;
int lastRet = -1;
int expectedModCount;
Itr() {
this.expectedModCount = ArrayList.this.modCount;
}
public boolean hasNext() {
return this.cursor != ArrayList.this.size;
}
public E next() {
this.checkForComodification();
int var1 = this.cursor;
if (var1 >= ArrayList.this.size) {
throw new NoSuchElementException();
} else {
Object[] var2 = ArrayList.this.elementData;
if (var1 >= var2.length) {
throw new ConcurrentModificationException();
} else {
this.cursor = var1 + 1;
return var2[this.lastRet = var1];
}
}
}
Iterator iterator() :取出元素的方式:迭代器
对该对象必须依赖于具体容器,因为每一个容器的数据类型都不一样。
对于使用容器者而言,具体实现不重要,只要通过容器获取到该对象即可。
Collection :
List : 有序存入和取出顺序一致,元素都有索引,元素可以重复。
Set:元素不能重复,无序。
package collection;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ListDemo {
public static void main(String[] args) {
listdemo();
}
public static void listdemo(){
List list =new ArrayList();
list.add("aaaaa");
list.add("bbbbb");
list.add("cccccc");
list.add("cccccc");
list.add("cccccc");
System.out.println(list);
//返回此列表中指定元素的最后一次出现的索引,如果此列表不包含元素,则返回-1。
System.out.println(list.lastIndexOf("aaaaa"));
Iterator iterator =list.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
//删除 remove
list.remove(1);
System.out.println(list);
// 获取 get(int index)
System.out.println(list.get(1));//cccccc
// 获取子列表sublist
List list1= list.subList(3,4);
System.out.println(list1);//cccccc
//修改set
System.out.println("修改前:");
System.out.println(list);
System.out.println("修改后");
list.set(2,"qqqqqq");
System.out.println(list);
}
}
两种获取方式:
1.Iterator iterator =list.iterator(); while(iterator.hasNext()){ System.out.println(iterator.next()); }
2. // 获取 get(int index)
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));//cccccc
}
1.在迭代期间进行集合操作。Iterator 会报异常。 此时添加元素,
iterator 在遍历,但是此时进行了add 操作。
2.迭代器Iterator 没有添加元素的方法。
- 为什么要使用列表迭代器的原因:
要在遍历的过程做修改怎么办?
public static void lisrIterator(){ List list =new ArrayList(); list.add("11111"); list.add("22222"); list.add("33333"); ListIterator it= list.listIterator(); while (it.hasNext()){ if(it.next().equals("11111")) it.set("88888"); } System.out.println(list);
-
-
hasPrevious()
返回
true
如果遍历反向列表,列表迭代器有多个元素。
-
while (it.hasPrevious()){ if(it.previous().equals("22222")) it.set("5555"); } System.out.println(list); }
List 的常用子类
Vector 与ArrayList
虚线框都是接口,List :
Vector: 内部数组数据结构,同步的 几乎不用了 增删查询都很慢
-
Vector
类实现了可扩展的对象数组。 像数组一样,它包含可以使用整数索引访问的组件。 但是,Vector
的大小可以根据需要增长或缩小,以适应在创建Vector
之后添加和删除项目。 -
从Java 2平台v1.2,这个类被改造为实现
List
接口,使其成为成员Java Collections Framework 。 与新集合实现不同,Vector
是同步的。 如果不需要线程安全的实现,建议使用ArrayList
代替Vector
。
ArrayList :内部数数组数据结构 ,不同步的。替代了Vector 查询快,增删慢。
-
可调整大小的数组的实现List接口。 实现所有可选列表操作,并允许所有元素,包括null 。 除了实现List 接口之外,该类还提供了一些方法来操纵内部使用的存储列表的数组的大小。 (这个类是大致相当于Vector,不同之处在于它是不同步的)。
LinkedList
链表实现,不同步。增删元素快。