迭代器在变量元素的时候要注意事项:
在迭代器迭代元素 的过程中,不允许使用集合对象改变集合中的元素个数,如果需要添加或者删除只能使用迭代器的方法进行操作。
如果使用过了集合对象改变集合中元素个数那么就会出现ConcurrentModificationException异常。
迭代元素的过程中:
迭代器创建到使用结束的时间。
------意识是迭代器一旦创建,在之后是不可以用集合操作元素的。如果用了后再调用迭代器是报错的。
//错误代码段
List list = new ArrayList();//创建集合 list.add("李杰"); list.add("李英"); list.add("李汉三"); ListIterator it = list.listIterator(); //获取到迭代器 list.add("Ha"); it.next();
//正确代码段 List list = new ArrayList();//创建集合 list.add("李杰"); list.add("李英"); list.add("李汉三"); ListIterator it = list.listIterator(); //获取到迭代器 it.next(); list.add("Ha");
ArrayList
笔试题目:使用ArrayList无参的构造函数创建一个 对象时, 默认的容量是多少? 如果长度不够使用时又自增增长多少?
ArrayList底层是维护了一个Object数组实现的,使用无参构造函数时,Object数组默认的容量是10,当长度不够需要比较所需要的最小长度和Object数组长度,当Object数组长度不够时,自动增长0.5倍。如果(所需要的最小长度-增长后的数组长度>0,那么将所需要的最小长度作为新长度赋值给Object数组长度)
ArrayList底层是维护了一个Object数组实现的
特点: 查询速度快,增删慢。
因为数组中的数据是连续的如果删除或增加就会导致缺失或者多一位数据,当数据量大的时候就会需要使用复制进行移动位置或者移动到更加大的数组空间,就会特别慢
ArrayList 特有的方法:
ensureCapacity(int minCapaci上ty)//制定
trimToSize()
什么时候使用ArrayList: 如果目前的数据是查询比较多,增删比较少的时候,那么就使用ArrayList存储这批数据。
作业: 编写一个函数清除集合中重复元素。图书管理为例如果书号是一样就视为重复元素。
要求: 遍历集合元素的时候必须使用迭代器。 迭代器
import java.util.*; class book{ int id; String name; public book(int id,String name) { this.id = id; this.name = name; } @Override public boolean equals(Object obj) { book v = (book)obj; return this.id==v.id; } @Override public String toString() { // TODO Auto-generated method stub return "{"+"编号"+id+",书名"+name+"}"; } } public class Demo1 { public static void main(String[] args) { ArrayList list = new ArrayList(); list.add(new book(110,"java web")); list.add(new book(120,"java")); list.add(new book(119,"c++")); list.add(new book(110,"c#")); ArrayList list1 = clearRe_element(list); System.out.println(list1); } private static ArrayList clearRe_element(ArrayList list) { ArrayList list2 = new ArrayList(); Iterator it =list.iterator(); while(it.hasNext()) { book a = (book)it.next(); if(!list2.contains(a)) { list2.add(a); } } return list2; } }
LinkedList
LinkedList底层是使用了链表数据结构实现的
特点: 查询速度慢,增删快。
Linkedlist特有的方法:
1:方法介绍
addFirst(E e)
addLast(E e)
getFirst()
getLast()
removeFirst()
removeLast()
2:数据结构
栈 : 主要是用于实现堆栈数据结构的存储方式。
先进后出
push()
pop()
队列(双端队列): 主要是为了让你们可以使用LinkedList模拟队列数据结构的存储方式。
先进先出
offer()
poll()
返回逆序的迭代器对象
descendingIterator() 返回逆序的迭代器对象
import java.util.*; public class Demo2 { public static void main(String[] args) { LinkedList list= new LinkedList(); list.add("李杰"); list.add("李英"); list.add("李汉三"); /* list.addFirst("李道杰"); //把元素添加到集合的首位置上。 list.addLast("杰仔"); //把元素添加到集合的末尾处。 System.out.println(list.getFirst());//获取集合中首位置的元素 System.out.println(list.getLast());//获取集合中末尾的元素 System.out.println(list.removeFirst());//删除集合中的首位置元素并返回 System.out.println(list.removeLast());//删除集合中的末尾素并返回 list.push("英子"); //将该元素插入此集合的开头处。 System.out.println(list.pop()); // 移除并返回集合中的第一个元素 list.offer("哈哈哈");//将该元素插入此集合的开头处 System.out.println(list.poll());//删除集合的首元素 System.out.println(list); */ Iterator it = list.descendingIterator(); while(it.hasNext()){ System.out.println(it.next()); } } }
题目: 使用LinkedList实现堆栈数据结构的存储方式与队列的数据结构存储方式
import java.util.*; //模拟栈的存储方式pop();push(); class StackList{ LinkedList list = new LinkedList(); //进栈 public void add(Object o){ list.push(o); } //弹栈 : 把元素删除并返回 public Object pop(){ return list.pop(); } //获取元素个数 public int size(){ return list.size(); } } //模拟队列的存储方式poll();offer(o); class TeamList{ LinkedList list = new LinkedList(); //进入队列 public void add(Object o){ list.offer(o); } //移除队列 public Object remove(){ return list.poll(); } //获取元素个数 public int size(){ return list.size(); } } public class Demo3 { public static void main(String[] args) { StackList list = new StackList(); list.add("李杰"); list.add("李英"); list.add("李汉三"); int size = list.size(); for(int i = 0 ; i<size ; i++){ System.out.println(list.pop()); } TeamList list1= new TeamList(); list.add("李杰"); list.add("李英"); list.add("李汉三"); int size1 = list.size(); for(int i = 0 ; i<size ; i++){ System.out.println(list1.remove()); } } }