▪ 凡是可以操作索引的方法都是该体系特有方法
1 (增) add(index,element) 在指定索引的位置上插入元素 addAll(index,Collection) 在指定的引的位置上插入整个集合的元素 addAll(Collection) 在结束插入整个集合的元素 2 (删) remove(index) 根据索引删除指定的元素 3 (改) set(index,element) 使用element 替换指定索引位置上的元素 4 (查) get(index)获取元素 subList(from,to) listIterator(); Iterator 接口 ▪ 所有实现了Collection接口的容器类都有一个iterator方法用以返回一个实现了Iterator接口的对象。 ▪ Iterator对象称作迭代器,用以方便的实现对容器内元素的遍历 操作。 ▪ Iterator接口定义了如下方法: boolean hasNext(); //判断是否有元素没有被遍历 Object next(); //返回游标当前位置的元素并将游标移动到下一个位置 void remove();//删除游标左面的元素,在执行完next之后该 //操作只能执行一次 ▪ 所有的集合类均未提供相应的遍历方法,而是把遍历交给迭代器 完成。迭代器为集合而生,与门实现集合遍历 ▪ Iterator是迭代器设计模式的具体实现 ▪ Iterator方法 – boolean hasNext():判断是否存在另一个可访问的元素 – Object next():返回要访问的下一个元素 – void remove():删除上次访问返回的对象 ▪ 可以使用Iterator遍历的本质是什么? – 实现Iterable接口 Iterator ▪For-each循环 –增强的for循环,遍历array或Collection的时候相当简便 –无需获得集合和数组的长度,无需使用索引访问元素,无需循环条件 –遍历集合时底层调用Iterator完成操作 ▪For-each缺陷 –数组: ▪不能方便的访问下标值 ▪不要在for-each中尝试对变量赋值,只是一个临时变量 –集合: ▪不使用Iterator相比,不能方便 的删除集合中的内容 ▪For-each总结 –除了简单的遍历并读出其中的内容外,不建议使用增强for ListIterator的作用解决并发操作异常 ▪ 在迭代时,不可能通过集合对象的方法(al.add(?))操作集合中的元素, ▪ 会发生并发修改异常。 ▪ 所以,在迭代时只能通过迭代器的方法操作元素,但是Iterator的方法 ▪ 是有限的,只能进行判断(hasNext),取出(next),删除(remove)的操作, ▪ 如果想要在迭代的过程中进行向集合中添加,修改元素等就需要使用 ▪ ListIterator接口中的方法ListIterator li=al.listIterator();
while(li.hasNext()){
Object obj=li.next();
if ("java2".equals(obj)) {
li.add("java9994");
li.set("java002");
} }
List接口的实现类LinkedList
▪ linkedList特有的方法
| 序号 | 方法名 | 作用 |
| 1 (增) | addFirst(Object obj) addLast(Object obj) offerFirst(Object obj) offerLast(Object obj) | 添加头 添加尾 1.6 版本之后的加头,尾巴 |
| 2 (删) | removeFirst() removeLast(); pollFirst() pollLast() | 删除头 获取元素并删除元素 删除尾 1.6 版本之后的删头,删尾 |
| 3 (查) | getFirst() getLast() peekFirst() peekLast() | 获取头 获取元素但不删除 获取尾 1.6 版本之后的获取头,获取尾 |
@Override
public int hashCode() {
System.out.println(this.name+".....hashCode");
return this.name.hashCode()+age;
}
▪ 总结:
▪ HashSet是如何保证元素的唯一性的呢?
▪ 答:是通过元素的两个方法,hashCode和equals方法来完成
▪ 如果元素的HashCode值相同,才会判断equals是否为true
▪ 如果元素的hashCode值不同,不会调用equals方法
TreeSet
▪ TreeSet
– 采用二叉树(红黑树)的存储结构
– 优点:有序(排序后的升序)查询速度比List快
– 缺点:查询速度没有HashSet快
Comparable 接口
•
问题:上面的算法根据什么确定集合中对象的“大小”顺序?
• 所有可以“排序”的类都实现了java.lang.Comparable 接口,
Comparable接口中只有一个方法
public int compareTo(Object obj);
该方法:
.
返回 0 表示 this == obj
.
返回正数 表示 this > obj
.
返回负数 表示 this < obj
实现了Comparable 接口的类通过实现 comparaTo 方法从而确定
该类对象的排序方式。
sort排序
public class StrLenComparator implements Comparator{ @Override public int compare(String o1, String o2) { if (o1.length()>o2.length()) { return 1; } if (o1.length() public static void sortDemo(){ List泛型 ▪ 为什么需要泛型 ▪ 解决数据类型操作不统一产生的异常 ▪ 使用泛型可以更好的去保护数据类型 ▪ 泛型类的定义 泛型类的定义list=new ArrayList (); ..添加元素 sop(list); Collections.sort(list);//按字母排序 sop(list); //按照字符串长度排序 Collections.sort(list,new StrLenComparator()); sop(list); } ….. public class Notepad{// 此处指定了两个泛型 private K key;//此变量的类型由外部决定 private V value;//此变量的类型由外部决定 ….. } ….. Notepad使用泛型集合解决实际问题 ▪ 声明员工类Employee包含如下属性:id,name,age,gender(枚举类型) ▪ 声明程序员类SE,含有属性popularity人气值 ▪ 声明项目经理类PM,含有属性workOfYear工作年限 ▪ 程序员不项目前经理都继承自Employee ▪ 需求说明: ▪ 使用泛型集合ArrayList,LinkedList,HashSet,TreeSet完成员工的添加, 删除, ▪ 判断,集合中元素个数的判断t=null;//指定两个泛型类型的对象 //Key为String,Value为Integer t=new Notepad (); t.setKey("张三"); t.setValue(30); System.out.println("姓名:"+t.getKey()+"t年龄:"+t.getValue());



