集合类的特点:提供一种存储空间可变的存储模型,存储的数据容量可以随时发生改变
在集合中使用泛型的类型的都是用引用类型,基本数据类型会报错
大致结构图
红色是接口
蓝色是实现类
collection集合概述
- 是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection元素
- JDK不提供此接口的任何直接实现,它提供更具体的子接口(如Set和List)实现
- 创建Collection集合的对象
- 使用 多态的方式
List集合概述和特点
- List集合概述
- 有序集合(也称为序列),用户可以精确控制列表中每一个元素的插入位置。用户可以通过调整索引访问元素,并搜索列表的元素
- 与Set集合不同,列表通常允许允许重复的元素
- List集合特点
- 有序:存储和取出的元素顺序一致
- 可重复:存储的元素可以重复
List集合特有的方法
- void add(int index, E element) ,在此集合中的指定位置插入指定的元素
- E remove (int index), 删除指定索引处的元素,返回被删除的元素
- E set(int index, E element) 修改指定索引处的元素,返回被修改的元素
- E get(int index) 返回指定索引处的元素
并发修改异常
- ConcurrentModificException
- 产生原因:
- 迭代器遍历的过程中,通过集合对象修改了集合中元素的长度,造成了迭代器获取元素中判断预期修改值和实际修改值不一致
- 解决方案
- 用for循环遍历,然后用集合对象做对应的操作即可
示例:
- 用for循环遍历,然后用集合对象做对应的操作即可
public class IteratorDemo {
public static void main(String[] args) {
List<Student> s = new ArrayList<>();
s.add(new Student("zhangsan",23,"游泳"));
s.add( new Student("lisi",29,"打篮球"));
Iterator<Student> iterator = s.iterator();
while(iterator.hasNext()){
Student st = iterator.next();
if (st.getName().equals("lisi")){
s.add(new Student("王五",23,"户外运动"));
}
}
}
}
执行结果就是引发了一个异常
解决问题之后的代码
public class IteratorDemo {
public static void main(String[] args) {
List<Student> s = new ArrayList<>();
s.add(new Student("zhangsan",23,"游泳"));
s.add( new Student("lisi",29,"打篮球"));
Iterator<Student> iterator = s.iterator();
/*
while(iterator.hasNext()){
Student st = iterator.next();
if (st.getName().equals("lisi")){
s.add(new Student("王五",23,"户外运动"));
}
}
*/
for (int i = 0; i < s.size(); i++) {
Student st = s.get(i);
if (st.getName().equals("lisi")){
s.add(new Student("王五",23,"户外运动"));
}
System.out.println(st.getName()+","+st.getAge()+","+st.getHobby());
}
}
}
结果
-
通过解读源码知道Iterator的next方法会比对 每一次的长度而 ArrayList的get方法不会进行比对所以能添加成功
-
有个List 特有的 listIterator()迭代器使用hasPrevious()、prervious()方法可以反向遍 历元素输出
-
上述的异常情况也可以使用listlierator() 这个迭代器来解决
-
示例:
List<Student> s = new ArrayList<>();
s.add(new Student("zhangsan",23,"游泳"));
s.add( new Student("lisi",29,"打篮球"));
//Iterator<Student> iterator = s.iterator();
ListIterator<Student> iterator = s.listIterator();
while(iterator.hasNext()){
Student st = iterator.next();
if (st.getName().equals("lisi")){
//使用iterator的add方法来添加对象
iterator.add(new Student("王五",23,"户外运动"));
System.out.println("添加成功!");
}
}
while(iterator.hasPrevious()){
Student st = iterator.previous();
System.out.println(st.getName()+","+st.getAge()+","+st.getHobby());
}
执行结果
- foreach(增强for)内部实现机制就是使用Iterator迭代器来实现的
- 哪么如何来验证呢?
上述说过了使用Iterator来增加一个元素会报一个并发修改的异常ConcurrentModificException 而foreach的内部机制就是iterator来实现的只要我们也添加一个元素测试看是否会报错
结果如我们所料验证了foreach是iterator来实现的
数据结构
- 数据结构之栈是:一种数据先进后出的模型
- 数据结构之队列:是先进先出模型
- 数组是查询快,增删慢的模型
- 链表是查询慢,增删快的模型
List集合子类特点
- List集合常用子类:ArrayList、LinkList
- ArrayList:底层数据结构是数组,查询快,增删慢
- LinkedList:底层数据结构是链表,查询慢,增删快
Set集合特点
- 不包含重复元素的集合
- 没有带索引的方法,所以不能使用普通for循环遍历
- hashSet集合特点
- 底层数据结构是哈希表
- hashSet 是Set的其中一种实现类
- 对集合的迭代顺序不作任何保证,也就是说不保证存储和取出的元素顺序一致
- 没有带索引的方法,所以不能使用普通 for循环遍历
- 不可存储重复元素
- LinkedHashSet集合特点
- 哈希表和链表实现的Set接口,具有可预测的迭代次序
- 由链表保证元素有序,也就是说元素的存储和取出顺序是一致的
- 由哈希表保证元素唯一,没有重复的元素
- TreeSet集合特点
- 元素有序,这里的顺序不是指存储和取出的顺序 ,而是按照一定的规则进行排序,具体排序方式取决于构造方法
- TreeSet() 根据其元素的自然排序进行排序
- TreeSet(Comarator comparator) 根据指定的比较其进行排序
- 没有带索引的方法,所以不能使用普通for循环遍历
- 由于是Set集合,所以不包含重复元素的集合
- 元素有序,这里的顺序不是指存储和取出的顺序 ,而是按照一定的规则进行排序,具体排序方式取决于构造方法
Map集合的使用
- Interface Map<k,v> k: 键的使用 ; v: 值的类型
- 将键映射到值得对象,不能包含重复的键;每一个键可以映射到最多一个值
- 创建Map集合的对象
- 多态的方式
- 具体的实现类HashMap
Map集合的基本功能
方法名 | 说明 |
---|---|
V put(K key,V value) | 添加元素 |
V remove(Objeect key) | 根据键删除值对元素 |
void clear() | 移除所有的键值对元素 |
boolen containsKey(Object key) | 判断集合是否包含指定的键 |
boolen containsValue(Object value) | 判断集合是否包含指定的值 |
boolen isEmpty() | 判断集合是否为空 |
int size() | 集合的长度,也就是集合中键值对的个数 |
Map集合的获取功能
方法名 | 说明 |
---|---|
V get(Object key) | 根据键获取值 |
Set keySet() | 获取所有键的集合 |
Collection value() | 获取所有值的集合 |
Set <Map.Entry <K ,V>> entrySet() | 获取所有键值的对象的集合 |