Collection接口和Iterator接口
1. Collection接口
- **接口概述<br />Collection集合:单列集合,是所有单列集合的顶层接口<br /> 子接口:<br /> **** List集合;Set集合****<br />Collection集合中定义的方法在所有单列集合中都可以使用
**
- **接口函数方法概要**<br />- **接口方法示意**<br />
2. Iterator接口(迭代器)
- **基本概念**:Collection集合元素的通用获取方式,在取出元素之前判断集合中是否有元素,如果有就取出来,然后继续判断,直到将所有元素取出,这种取出方式的专业术语叫做"迭代"<br />- **使用方法(使用接口多态接受iterator对象值)**<br /><br />比较简单的一个使用方法<br />
Set集合
1. 基本概念
- **其实是Collection接口的子类**<br />1. 不允许储存重复的元素<br />2. 没有索引,没有带索引的方法,也不能使用普通的for循环遍历(可以使用增强for循环)- **具体使用方法见HashSet集合使用方法**- **Set集合元素不重复的前提:储存的元素必须重写hashCode方法和equals方法(通过他们比较元素的)**
Queue集合
1. 简介
- **Queue是队列**:典型的队列特征是只允许,在表的前端进行删除操作,在表的后端进行插入- **LinkedList类实现了Queue接口**,可以将LinkedList当作Queue来用- **Queue接口与List、Set同一级别**,**都是继承了Collection接口**。LinkedList实现了Queue接口。我们平时使用的一些常见队列都是非阻塞队列,比如PriorityQueue,LinkedList(LinkedList是双向链表,它实现了Dequeue接口)
2. 使用
- offer方法:向队列中添加一个元素<br />- poll方法:将第一个元素删除并返回<br />- element方法:返回第一个元素<br />- peek方法:返回第一个元素<br />
3. 阻塞非阻塞
- **建议**:对于非阻塞队列,一般情况下建议使用offer、poll和peek三个方法,不建议使用add和remove方法。因为使用offer、poll和peek三个方法可以通过返回值判断操作成功与否,而使用add和remove方法却不能达到这样的效果。注意,非阻塞队列中的方法都没有进行同步措施。- **非阻塞(平时常用的ArrayList,List之类的)**<br />- **阻塞(优化,但前期不常用)**<br />- [阻塞非阻塞的详解](https://blog.csdn.net/yan454790122/article/details/84836226)
List集合**
1. 常用方法
- **list集合为collection的子类(大部分方法都通用,但是list集合拥有索引方法)<br />**- **带索引方法示例<br />**
2. 遍历方式
- **使用普通for循环**<br />- **使用迭代器**<br />- **使用增强for循环**<br />
3. ArrayList集合
- **ArrayList集合的底层其实就是数组,查找快,增删慢**- **使用ArrayList集合一定要慎重,不常增删的使用比较合适**<br />
4. LinkedList集合
- **特有函数**(他也是list集合的子类,所以共性方法通用)<br />- **特有函数使用**<br />
Map集合(双列)
1. 集合特点
- Map集合是一个双列集合,一个元素包含了两个值(一个Key,一个value)- Map集合中的元素,key和value的数据类型可以相同,也可以不同- Map集合中的元素,key是不允许重复的,value是可以重复的- Map集合中的元素,key的value是一一对应的
2. 常用子类
- **HashMap集合**- **底层是哈希表**- JDK1.8之前:数组+单项链表<br />JDK1.8之后:数组+单项链表/红黑树(链表的长度超过8:提高查询的速度)- 是一个无序的集合,储存和取出前元素的顺序有可能不一致- **LinkedHashMap集合**- 底层是哈希表+链表(保证迭代顺序)- 是一个有序的集合,存储元素和取出元素的顺序是一致的<br /><br />- **Hashtable集合**- **Hashtable**:底层是一个哈希表,是一个线程安全的集合,是单线程集合,速度慢- 不可以储存null值,null键- 和Vector集合一样,在jdk1.2版本之后被更先进的集合(HashMap)取代了- 子类Properties依然活跃在历史舞台(是唯一一个和IO流相结合的集合)<br /><br />- **HashMap**:底层是一个哈希表,是一个线程不安全的集合,是多线程的集合,速度快- 可以储存null值,null键(包括以前所有的集合都能储存)
3. 常用方法
- **put方法:向map对象中添加元素(第一个值不可以相同,但是第二个可以)(注意Map是一个接口,new的时候)(返回值是第二个位置被替换的元素,如果没替换就返回null)**<br /><br />- **remove方法:移除key对应的元素,返回被移除的元素(如果不存在,就返回null)**<br />- **get方法:得到对应key值的元素,如果没有就返回null(需要是包装类类型)**<br /><br />- **containsKey方法:查看集合中是否包含这个key值,返回值是Boolean类型(还有containsValue方法:查看value值是否存在)**<br />- **Set<K> keySet()返回此映射中包含的键的 Set示图**<br />- **用所学方法来统计字符串中字符的方法(题目练习)**<br />
4. 遍历方式
- 通过键找值的方法- 使用Map集合中的方法keySet(),把Map集合中所有的key取出来,存储到一个Set集合中- 遍历set集合,获取map集合中中的每一个key- 通过Map集合中的方法get(key),通过key找到value- 使用迭代器遍历<br />- 使用增强for遍历<br />- **通过Entry键值对查找**- **简介**:Map.Entry<K,V> : 在Map接口中有一个内部类接口Entry- **作用**:当Map集合一创建,Entry对象也会随之创建,用来记录键和值(键和值的对应关系)- **使用方法**:- 使用Map集合中的方法entrySet(),把Map集合中多个Entry对象取出来,存储到一个Set集合中- 遍历Set集合,获取每一个Entry对象- 使用Entry对象中的方法getKey()和getValue()获取键和值<br />使用迭代器遍历<br /><br />使用增强for循环遍历(增强for循环总是略简单一点)<br /><br />
5. HashMap储存自定义键值
- **简介**:当Key是自定义类时,使用Map类储存就无法正确判断Key的相等,这个时候需要重写HashCode方法和equals方法来保证程序正常执行- **使用方法**<br /><br />重写toString方法和HashCode,equals方法(直接alt+insert插入即可,笔记本需要按上Fn键)<br />
HashSet和HashMap
1. HashSet集合类
- **基本定义**- 不允许存储重复的元素- 没有索引没有带索引的方法,不能使用普通的for循环- 是一个无序的集合,存储元素与取出元素的顺序有可能不同- 底层是一个哈希表结构(查询速度非常的快)- **遍历方法**(仅仅输出顺序1 2 3)<br />- **HashCode值**(是一个十进制的整数,是对象的逻辑地址值,与物理地址值一一对应)<br /><br />直接输出对象输出的是对象的逻辑地址的十六进制表示模式<br />而哈希值输出的是这个值的十进制模式- **HashSet存储自定义类型元素**(必须重写HashCode和Equals方法)<br /><br />**重写方法(**都有提示,很方便,在alt+insert中找equals和hashcode方法的重写,直接一直下一步)<br />- **但是有一点需要****注意**(这个时侯返回值是不同的,说明两者的地址还是不同的)<br />
2. LinkedHashSet集合类
- **简介**:在HashSet的基础上加了一个链表,可以保证数据存储的有序性(什么顺序入,什么顺序出)<br />- **对比**:HashSet方法(无序,存入之后按照某种顺序储存,不管你的输入先后顺序)<br />
2. 哈希表
- **简介**:是HashSet集合储存数据的结构- 哈希表 = 数组 + 链表 (jdk1.8版本之前)- 哈希表 = 数组 + 链表 (jdk1.8版本之后)<br />哈希表 = 数组 + 红黑树 (提高查询的速度)- **结构**:通过数组储存数据的哈希值(哈希值相同的储存在一组中)<br />- **注意**:在向哈希表中存储数据时需要先- 调用HashCode方法查询数组中是否有相同哈希值的位置,有就挂在上边- 然后调用equals方法查询哈希值相同时元素是否相同- 如果哈希值相同,元素又相同,那么这个元素就不会储存在哈希表中
集合工具类Collections
1. 常用方法
- **shuffle静态方法**:打乱集合中的元素顺序<br />- **addAll静态方法**:一次添加多个元素<br />- **sort静态方法**:按照升序排序<br /><br />sort方法在自定义类中的重写(只需要重写compareto方法即可)<br /><br />一定要继承这个接口来获取这个compareto方法(后边的一些构造器什么的也要写上)<br /><br /><br />注意排序规则:自己 - 外人 = 升序 外人 - 自己 = 降序- **sort直接指定排序方法**直接重写静态内部类(这个时候需要把之前的接口继承删除掉,重载方法也删除掉)<br /><br />**可以写出一个组合排序的方法(注意方法的使用)<br />
**
