1. List接口
List--元素有序(有索引的)(存入顺序和取出顺序一致),可重复
Set --元素无序,唯一
2. List的特有功能(掌握增删改查add,remove,set,get)
1)添加功能
void add(int index, Object obj):在指定位置添加给定元素
2)获取功能
Object get(int index):获取指定索引处的元素 可以使用for循环+get()方法遍历list
for(int i=0; i<list.size();i++){
String s = (String)list.get(i);
}
int indexOf(Object o):获取制定元素在集合中第一次出现的索引,不存在返回-1
List subList(int fromIndex, int toIndex):子list
3)列表迭代器
listIterator():返回此列表元素的列表迭代器
listIterator(int index)
需求:我想倒着把集合遍历,怎么办?--Iterator没有提供这个方法
接口ListIterator的方法变多了 可以逆向遍历
while(lit.hasPrevious()){
String s = lit.previous();
}
但是它要先正向遍历,把指针移动到末尾,然后才能逆向遍历,很麻烦
4)删除功能
remove(int index):删除制定索引的元素
5)修改功能
Object set(int index,Object obj):把制定索引位置的元素用给定的元素替换
并返回替换前的元素
3. 并发修改异常 ConCurrentModificationException
原因:先有集合,再有迭代器,迭代器是依赖于集合而存在的。
而我们现在,在使用迭代器的同时,修改了集合元素。这样,集合的内部就发生了改变,而迭代器并不知道这些
所以,再次迭代的时候就报错了
解决方法:
1)用迭代器迭代,用迭代器修改集合元素 ListIterator有add(Object o)方法
这种方法,元素是直接添加到查找的元素后面,不是在末尾处添加
2)用集合遍历,用集合修改集合元素
这种方法,元素是在集合的末尾处添加
4. 说说ArrayList,Vector,LinkedList的各自特点
ArrayList底层数据是数组,添加快,查找删除慢;线程不安全,效率高
Vector底层数据是数组,添加快,查找删除慢;线程安全,效率低(一般不用)
LinkedList底层数据是链表,查询慢,增删快;线程不安全,效率高
5. Vector的特有功能
1)添加元素
public void addElement(Object obj) JDK 1.0 -->add(Object obj) JDK 2.0
2)获取元素
public Object elementAt(int index) JDK 1.0 -->get(int index) JDK 2.0
JDK 1.0上也有一个类似Iterator迭代器的功能
public Enumeration elements() --> iterator()
Enumeration接口 有hasMoreElement() nextElement() --> hasNext() next()
6. LinkedList的特有功能
1)添加元素
void addFirst(Object e)
void addLast(Object e)-->实际上添加默认就是添加到链表的末尾
2)删除
Object removeFirst()
Object removeLast()
3)获取
Object getFirst()
Object getLast()
7. 泛型
有一个问题:
ArrayList array = new ArrayList();
由于集合是可以存放任何类型的,即Object类型。而实际中我们使用集合都是同一类型的放在一个集合中,
如何在创建集合的时候就明确制定其元素类型?
Java针对集合这种结构提供了一种特殊的类型--泛型
泛型:默认情况下,它表示Object类型,也就是任意类型
它把明确类型的工作推迟到了创建对象或者调用方法的时候才去明确类型的
最好明确类型,否则就会有安全隐患
<T> <E> --> JDK5的新特性 直接在<>中写你需要存储的引用数据类型
泛型的好处:
1)解决了隐藏的安全问题
2)把运行期间的问题提前到了编译期间
3)避免了强制类型转换
8. 增强For循环遍历
for(数组或者Collection集合中的元素的数据类型 变量名:数组或者Collectioin集合对象){
使用变量即可,这个变量就是数组或者集合中的元素
}
for(int x:array){
System.out.println(x);
}
好处:方便了集合的遍历
JDK5以后出现增强for,目的就是为了取代迭代器,底层封装了迭代器的操作
注意:用增强for要保证目标对象不为null,否则会出现nullpointerException空指针异常
最好先判断不为null,然后再使用
9. 泛型的三种形式
1)泛型类:把泛型定义在类上,具体创建类的时候再确定具体类型(比较麻烦)
public class Tool<QQ>{
public void show(QQ qq){
System.out.println(qq);
}
}
但这种泛型类的处理方法并不常见,没实际意义
2)泛型方法:把泛型定义在方法上
public <AD> void method(AD ad){
System.out.println(ad);
}
应用:当我想在方法中使用多个类型时
对比:方法重载--写明确的数据类型更有好处,更方便在方法中对数据进行处理
如Math类的abs()方法就没有写成泛型方法的形式,而是使用了方法重载
3)泛型接口
public Interface Tool<QQ> {
public abstract void show(QQ qq);
}
使用:
1)具体实现接口的类可以定义其要使用的数据类型
2)在具体实现的时候,还不明确类型。这个时候,在具体类上也要写泛型 在创建对象的时候才明确
如 public class ArrayList<E> implements List<E>
10. 遍历
Collection--> iterator和增强for循环
|--List --> +普通for循环
|--ArrayList
|--Vector
|--LinkedList