集合
|--Collection (两种遍历方式 普通迭代器 增强for循环)
|--方法 add remove clear contains isEmpty size
|--iterator()
1):通过集合对象 (Collection的对象) 调用iterator(),生成迭代器对象
Collection c = new ArrayList()
Iterator it =c.iterator()
2):通过迭代器对象的hasNext()来判断集合是否有下一个元素
3):如果有下一个对象 就通过迭代器对象的next()来获取下一个元素
while(it.hasNext()){
String str =(String)it.next();
System.out.println(str)
}
如果没有下一个对象 再获取的话 报错NoSuchElementException
迭代器的原理:迭代器是一个借口
迭代器的源码:迭代器是通过内部类的形式实现的
|--List:特点 元素有序(存入和取出的顺序相同) 可以重复 可以通过索引操作元素(4种遍历方式 普通迭代器 列表迭代器 增强for普通for)
|--方法:add remove set get indexOf subList
|--ListIterator
ConcurrentModificationException 并发修改异常
①:原因:在通过迭代器遍历集合的时候 我通过集合来操作(增删改)了集合里面的元素
②:解决办法:
A:在迭代器遍历集合的时候,我们通过迭代器来操作元素
ListIterator 列表迭代器
B:普通for循环来遍历集合的时候,通过集合来操作元素
|--ArrayList:底层是数组的数据结构 查询快 增删慢 不安全 效率高
案例:两个ArrayList去除重复自定义对象
|--Vector:底层是数组的数据结构 查询快 增删慢 安全 效率低
|--LinkedList:底层是链表的数据结构 查询慢 增删快 不安全 效率高
|--addFirst addLast removeFirst removeLast get.....
案例:用LinkedList来模拟栈结构
泛型:1)去掉eclipse报黄线问题
2)把运行期类型转换异常 提前到了编译期间
3)优化程序设计
泛型类
泛型方法
泛型接口
注意:泛型是jdk1.5的新特性
增强for循环
注意:增强for是jdk1.5的新特性
|--Set:元素无序(存入和取出的顺序不相同) 唯一 (2种)
|--HashSet
HashSet是如何保证元素唯一性的呢?
HashSet底层是用的哈希表结构
底层依赖两个方法hasCode() equals()
首先判断hasCode()返回值是否相同
相同:判断equals()
true:说明两个对象 相同 咱们就不添加
false:说明两个对象 不相同 咱们就添加
不相同:添加
所以说咱们要让元素所在的类 重写hasCode()和equals()方法
如何重写呢?eclipse直接生成
|--TreeSet
1:自然排序:让TreeSet存储的元素所在的对象实现Comparable接口
通过compareTo()的返回值来保证元素的唯一(排序)
正数:说明咱们要存入的这个元素比上一个元素大 往后放
负数: 说明咱们要存入的这个元素比上一个元素小 往(钱)放
0: 说明重复
public int compareTo(Student s){
int num =this.age-s.age;
int num2 =(num==0)?this.name.compareTo(s.name):num;
return num2;
}
2: 通过比较器:Comparator 调用TreeSet的带参构造方法 传入一个比较器
让TreeSet就按照咱们这个比较器的规则来去掉重复和排序
如果以后我们看到方法上的参数是抽象类或者接口的时候 我们可以考虑用匿名内部类来实现
|--Collections集合的工具类
sort() binarySearch() reverse() shuffle()
|--案例:模拟斗地主发牌游戏
|--Map双列集合 (Map有几种遍历方式 2种)
是存键值对形式的集合 键是不可以重复的 而值可以重复
|--HashMap
底层是哈希表结构 针对键有效 保证Map的键唯一
|--TreeMap
底层是二叉树结构 针对键有效 保证Map的键唯一和排序
案例:获取字符串里面字符出现的次数
Map的嵌套
|
|