1.为什么要有集合框架?
- 开发项目最核心:数据 ----需要解决数据存储问题
- 当下存储方式的转变:
- 直接使用 ------> 共享 ------> 变量(无法满足大量数据存储的要求)------> 数组 / 对象
- 数组的问题:
- 1)基本类型操作数据方式——通过数组名+索引号的方式提取数据,与面向对象思想不符
- 2)固定长度——极易造成空间浪费或空间不足
- 3)同一类型——一个数组内只能存同类型的数据
- 为了解决数组的问题,创建了——集合框架
2.集合框架
-
1)Java提供的集合API 包:java.util
- 三个接口(不是类):Collection,Map,Iterable(接口初始容量16)
- 一个类:Collection
-
2)Collection接口:集合层次的根接口,用于存储对象,其后代也是接口,没有类直接实现
-
使用:Collection是接口无法直接使用,故需要使用其子接口(List接口和Set接口为重点)
-
List接口:实现了集合中有序,可重复,可为空的特性
-
其提供了很多子类--通过不同的方式去实现
- Vector【基本淘汰】——实现增长的对象数组,实现对象的存储、移除、搜索,内部数组实现数据存储,是线程安全,同步
- ArrayList【整体】——大小可变的数组,功能上等同于Vector,此类是不同步的,在不考虑安全时Arraylist用于替代Vector
- LinkedList【分散联合成整体】——使用双向链表的方式实现列表,是不同步的
-
*list集合中的问题探索:
-
1.遍历集合中的数据
-
1)常规的for循环
-
2)使用实现迭代器接口功能iterable--每一个集合中都有一个方法iterator()用于获取迭代器,迭代中有方法用于获取数据
-
3)增强for循环 foreach
- 语法:for(元素类型 临时变量:集合){}
-
-
2.有序 重复 null值探索
-
//遍历方式使用迭代器
-
//获取当前集合的迭代器
-
Iterator iter=srrlist.iterator();
-
//使用迭代器迭代
-
while(iter.hasNext()){ //获取下一个 syso(iter.next()); }
-
-
***LinkedList:
-
add是以队列形式(从集合的最后加数据)
-
push是以压栈形式(从集合的最前加数据)
-
-
-
Set接口:(见下文)
-
3)List接口--数据类型的问题
- 没有指定数据类型的时候:可以向集合中存储任意数据——默认存储的数据类型是Object
- 带来问题:存储多种类型数据时,使用时无法辨别集合中对应数据的类型
- 解决办法:使用一种技术处理对象存储数据类型的问题——泛型
- 泛型概念:参数化,模糊类型,具体的类型让使用者自己定义
- 泛型对应的类型必须是类(而不是基本类型,如int)--集合中只能存储对象
4)set集合
- 1.概念:不包含重复元素,包含一个null值
- 2.子类:HashSet和TreeSet
- 3.HashSet子类
- 不重复,无序,HashMap实现,不同步
- 哈希表进行数据存储,所以不能使用索引去处理
- 去重方式:去掉前面的,保留后面的
- 4.TreeSet子类
- 不重复,自动排序,TreeMap实现,不同步
- 5.set集合的总结
- 是使用map集合实现,它出现的原因也是Map
- 主要功能:
- 存储数据,无法单独取出数据,只能遍历数据,因为无法排定对应数据的位置
- 可以删除数据
- 可获取大小
- 附加功能:
- 去重
- 排序【自然顺序】
5)Map集合
- 1.概念:将键映射值的对象,键不可以重复,一个键只能映射一个值
- 允许为空
- 值允许重复
- 是一个接口,用于存储
- 2.子接口
- HashMap,TreeMap
- 3.HashMap
- 哈希表的实现方式
- 键值对的存储
- 允许key和value都为null
- 无序
- 哈希表的实现方式
- 4.map集合遍历--转化成set集合--通过set集合去遍历
- 5.TreeMap--多了一个排序【对key进行自然顺序排序】