集合体系结构、Collection集合概述及常用方法(附迭代器遍历对象实例)、List(附子类LinkedList、ArrayList特点)、ListIterator、并发修改异常、增强for
集合
Collection
所在包:java.util
Interface Collection<E>
创建对象方法代码实例:
创建对象(多态创建):
Collection<E>
创建一个ArrayList对象
Collection<String> c = new ArrayList<String>();
//添加元素方法 boolean add(E e);
c.add("hello");
c.add("world");
System.out.println(c);
输出结果
[hello,world]
常用方法:
方法名 | 作用 |
---|---|
boolean add(E e) | 添加元素 |
boolean remove(Object o) | 从集合中移除指定元素 |
void clear() | 清空集合 |
boolean contains(Object o) | 判断集合中是否有该元素 |
boolean isEmpty() | 判断集合是否为空 |
int size() | 返回集合大小 |
注:集合的遍历一般使用集合迭代器进行
Collection的遍历:
Collection<String> c=new ArrayList<String>();
Iterator it=c.iterator(); //Iterator<E> iterator():返回此集合中的迭代器,通过iterator()方法得到
it.next(); //E next():返回迭代中的下一个元素 (第一个next()得到的是集合中的第一个值)
it.hasNext(); //boolean hasNext():判断下一个迭代中有无更多元素,下一个数存在则返回true
用iterator()得到的迭代器 it 遍历集合中的元素:
while(it.hasNext()){
String s=it.next();
System.out.println(s);
}
插播一条小知识:
遍历学生对象的小案例:
Public static void main(String[]args){
Collection<Student> c = new ArrayList<Student>(); //1.创建集合对象
Student student1 = newStudent("张三",12345,99); //2.创建学生类对象
Student student2 = newStudent("李四",12345,95);
Student student3 = newStudent("王五",12345,90);
c.add(student1); //利用add()方法将学生类对象添加到Collection集合中
c.add(student2);
c.add(student3);
Iterator<Student> it = c.iterator(); //创建集合c的迭代器对象
while(it.hasNext()){
//利用while(it.hasNext())遍历迭代器
Student s = it.next();
System.out.println(s.getName()+","+s.getId()+","+s.getScore());
}
}
List
所在包:java.util
public interface List<E> extends Collection<E>
常用方法(与Collection类似):add(E e)、remove(E e)、contains(E e)、isEmpty()、size()、clear().
初始化:List<E> s = new ArrayList<E>();
List常用特有方法
方法名 | 作用 |
---|---|
Object get(int i) | 返回此列表的元素在指定的位置 |
代码实例:
List c=new ArrayList();
c.add(1);
c.add(2);
c.add(3);
Object o = c.get(2);
System.out.println(o);
输出结果:
3
ListIterator
通过List集合的listIterator()方法得到,所以说它是List集合特有的迭代器
所在包:java.util
pulic interface ListIterator<E>
extends Iterator<E>
用于允许程序员沿**任意方向**遍历列表的列表迭代器,在迭代期间修改列表,并获取列表中迭代器的当前位置。
List集合子类(LinkedList、ArrayList)的特点:
- ArrayList:相当于顺序表,增删O(n),查询(1)。
- LinkedList:相当于链表,增删O(1),查询O(n)。
注意:ArrayList和LinkedList继承了List,所以可以使用List的所有常用方法 包括(add、remove、get、contains、isEmpty、size、clear)
列表迭代器常用方法:
方法名 | 作用 |
---|---|
E next() | 返回迭代中的下一个元素 |
boolean hasNext() | 如果迭代具有更多的元素,则返回true |
E previous() | 返回迭代中的上一个元素 |
boolean hasPrevious() | 如果此列表迭代器在相反方向遍历列表时迭代具有更多的元素,则返回true |
void add(E e) | 将指定的元素插入列表 |
常用方法代码实例:
List<String> list = new ArrayList<String>();
List.add("hello");
List.add("world");
List.add("java");
ListIterator<String> it = list.listIterator(); //调用列表迭代器
while(it.hasNext()){
String s = it.next();
if(s.equals("world")){
It.add("javaee"); //利用列表迭代器方法add添加元素不会造成并发修改异常
}
}
System.out.print(list); //输出list中的值
并发修改异常
产生原因:迭代器是依赖于集合而存在的,在判断成功后,集合的中新添加了元素,而迭代器却不知道,所以就报错了,这个错叫并发修改异常。
解决方案:
- 迭代器迭代元素,迭代器修改元素
- 集合遍历元素,集合修改元素(普通for)
迭代器遍历元素的时候,通过集合是不能修改元素的。
并发错误代码实例:
错误示例:
List<String> t = new ArrayList<String>();
t.add("world");
Iterator<String> it = t.iterator();
while(it.hasNext()){
String s = it.next(); //报错:并发修改异常 ConcurrentModificationExcetion
if(s.equals("world")){
t.add("javaee");
}
}
System.out.print(t);
------------------------------------------------------------------------------------------------
正确改法:
方法一(普通for循环,用集合自身修改元素):
List<String> t = new ArrayList<String>();
t.add("world");
Iterator<String> it = t.iterator();
for(int i=0;i<t.size();i++){
String s = t.get(i); //List 常用方法 get(i); 返回List中第i个位置的元素
if(s.equals("world")){
t.add("javaee");
}
}
System.out.print(t);
方法二(用列表迭代器自身void add(E e)方法修改值):
List<String> t = new ArrayList<String>();
t.add("world");
ListIterator<String> it = t.listIterator();
while(it.hasNext()){
String s = it.next();
if(s.equals("world")){
it.add("javaee"); //用迭代器自身修改集合中的值
}
}
System.out.print(t);
增强for循环
增强for概述:
- 简化数组和Collection集合的遍历
- 它是JDK5之后出现的,其内部原理是一个Iterator迭代器
格式:
for(元素数据类型 变量名:数组或者Collection集合){
//在此处使用变量即可,该变量就是元素
}
代码示例:
例:
List<String> list = new ArrayList<String>();
list.add("hello");
list.add("world");
list.add("java");
for(String s:list){
//注意增强for的内部原理其实就是一个iterator迭代器
System.out.print(s);
}