Collection 【2种遍历方式 迭代器 增强for循环】
|--add() remove() clear() contains() size() iterator()
|--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()
|--listIterator()
ConcurrentModificationException 并发修改异常
①:原因:在通过迭代器遍历集合的时候 我通过集合来操作(增删改)了集合里面的元素
②:解决办法:
A:在迭代器遍历集合的时候,我们通过迭代器来操作元素
ListIterator 列表迭代器
B:for循环来遍历集合的时候,通过集合来操作元素
|--ArrayList
底层是数组结构 查询快 增删慢 线程不安安 效率高
案例:用两个ArrayList来去掉重复的元素
|--Vector
底层是数组结构 查询快 增删慢 线程安安 效率低
|--LinkedList
底层是链表结构 查询慢 增删快 线程不安安 效率高
addFirst() removeFirst() getFirst()
案例:模拟栈结构
泛型:(JDK1.5后的新特性)
解决报(幻想)问题
把运行期间类型转换问题提前到了编译期间
优化程序设计
泛型类
泛型方法
泛型接口
增强for循环(JDK1.5后的新特性)
它是用来替代迭代器的 所以说 二者选其一即可
|--Set :元素唯一 无序 【2种遍历方式 迭代器 增强for循环】
|--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()
max()
min()
reverse()
shuffle()
Map:是存键值对的 【遍历方式:两种1);获取所有的键 的集合 遍历集合 根据键来获取值(v get(Key k)) 按照刘毅老师的说法:根据丈夫找妻子
2):获取所有的键值对的集合 遍历集合 根据键值对来获取键和值 按照刘意来时的说法:根据结婚证来找丈夫和妻子】
键不可以重复 值可以重复
|--HashMap:底层是哈希表结构 是针对键有效的
|--TreeMap:底层是二叉树结构 是针对键有效的
|