集合的引入和ArrayList
集合和数组的对比
相似点:都可以存储多个对象,对外作为一个整体存在
数组的缺点:
- 长度必须在初始化时指定,且固定不变
- 数组采用连续存储空间,删除和添加效率低下
- 数组无法直接保存映射关系
- 数组缺乏封装,操作繁琐
集合框架
- Collection:List,Set
- Map
List:对象不唯一但有序
Set:对象唯一但无序
Map:键值对象,提供key到value的映射。key唯一无序,value不唯一有序
List集合
List的主要实现类有ArrayList和LinkedList,分别是顺序表和链表(双向链表)的实现。栈和队列的实现类为:Deque和Queue
ArrayList
//创建一个集合对象
List list = new ArrayList();
//添加元素
list.add(90);
list.add(1,100);
list.addAll(List2);
//元素的数量
list.size();
//遍历元素
System.out.println(list.toString());
//方法一:for循环
for(int i = 0; i < list.size(); i++){
int elem1 = (int)list.get(i);
System.out.println(i+"---->"elem1);
}
//方法二:foreach
for(Object elem2:list){
System.out.println(elem2);
}
//Iterator迭代器
Iterrator it = list.iterator();
while(it.hasNext()){
int elem3 = (int)it.next();
System.out.println(elem3);
}
//Lambda表达式+流式编程
list.forEach((i)->System.out.println(i));
//上面简写
list.forEach(System.out::println);
缺点
- 添加元素可以添加任何类型,不安全
- 获取元素时需要进行强制类型转换,繁琐
解决
使用泛型generic
List<Integer> list = new ArrayList<Integer>();
Iterrator<Integer> it = list.iterator();
while(it.hasNext()){
int elem3 = (int)it.next();
System.out.println(elem3);
}
LinkedList
数据结构为双向链表
提供了更多的方法,可以作为线性表、栈、队列来使用
Deque 栈接口
- ArrayDeque:底层使用数组
- LinkedList:底层使用双向链表
方法:
- push():入栈
- peek():获取栈顶元素
- pop():出栈
Queue队列接口
Set集合类型
Set:无序,不重复
HashSet
LinkedHashSet
TreeSet:红黑树(二叉树)
比较规则的制定
Comparator接口
外部比较器优先内部比较器
哈希表原理
Java中哈希表结构:顺序表+链表(需要控制链表长度)
哈希表是如何添加数据的
- 计算哈希码,结果是一个int值,整数的哈希码取自身
- 计算在哈希表中的存储位置:y=k(x)=x%11
- 存入哈希表:一次添加成功;多次添加成功;不添加
hashCode和equals的作用
- hashCode():计算哈希码,是一个整数,根据哈希码可以计算出数据在哈希表中的存储位置
- equals():添加时出现了冲突,需要通过equals进行比较,判断是否相同,查询时也需要
Map
Map特点:存储键值对映射关系
- HashMap:key无序
- LinkedHashMap:key有序(添加顺序)
- TreeMap:key有序(自然顺序)
Map.Entry 是Map中的一个接口,他的用途是表示一个映射项(里面有Key和Value),而Set<Map.Entry<K,V>>表示一个映射项的Set
Map最多的四个操作:
- 创建对象Map<String,String> map = new TreeMap();
- 添加key-value键值对:map.put(key,value);
- 根据key得到value:map.get(key);
- 遍历Map:Set<Map.Entry<String,String>> entry = map.entrySet();
其他内容
Iterator
常用方法
- hasNext():判断是否有下一个元素
- next():返回要访问的下一个元素
- remove():删除上次访问的对象
哪些集合可以使用Iterator遍历:
- Collection,List,Set可以,Map不行
- 提供iterator()方法的就可以
- 实现Iterable接口的集合类都可以
Collections工具类
关于集合操作的工具类,好比Arrays,Math
唯一的构造方法private,不允许在类的外部创建对象