Java-集合
概述
Java中的集合就像是个容器,专门用来存储Java对象(实际是对象的引用),这些集合类都位于java.util包中。
接口
分类
Collection
- List
(重点💡)迭代器功能:Iterator iterator() ListIterator listIterator():List集合特有的迭代器
- ArrayList (注意了哈!在啥都不知道的情况下,就选ArrayList,即使你要安全,一般也不选Vector)
特点:底层数据结构是数组,查询快,增删慢;线程不安全,效率高 - LinkedList
特点:底层数据结构是链表,查询慢,增删快;线程不安全,效率高 - Vector
特点:底层数据结构是数组,查询快,增删慢;线程安全,效率低 - Set
- TreeSet
Map
- Hashtable
- HashMap
- TreeMap
问题来了
ⅰMap和Collection的区别?
- Map存储的是键值对形式的元素,键唯一,值可以重复。(成对儿的💑👩????👩👨????👨不管怎么样吧,反正都是成双成对儿的)
- Collection存储的是单独出现的元素,子接口Set元素唯一,子接口List元素可重复(孤寡🐸)
关于接口的特点
- Collection接口:无序,不唯一
- List接口:存储一组不唯一,有序(插入顺序)的对象
- Set接口:存储一组唯一,无序的对象
- Map接口:存储一组键值对象,提供key 到value的映射
Collection集合的遍历方式
- Iterator遍历(迭代器)
①迭代器是依赖于集合而存在的,在判断成功后,集合中新添加了元素,而迭代器却不知道,若报错,则错为并发修改异常。 ②遍历元素时,首先通过调用ArrayList集合的iterator()方法获得迭代器对象,然后使用hashNext()方法判断集合中是否存在下一个元素,若存在,则调用next()方法将元素取出,否则已达到末尾,停止遍历。 - foreach遍历/增强for循环 ①for(元素的数据类型 变量名:数组或Collection集合的对象){ //使用该变量即可,该变量其实就是数组或者集合中的元素 }
②与for循环相比,foreach循环不需要获得容器的长度,也不需要根据索引访问容器中的元素,人家自动遍历 ③but弊端:增强for循环的目标不能为null,建议在使用前先判断是否为null - JDK的forEach遍历循环
泛型
概述
是一种把明确类型的工作推迟到创建对象或者调用方法的时候才去明确的特殊的类型。参数化类型,把类型当作参数一样的传递
格式
<数据类型> 注意哈 :此处的数据类型只能是引用类型
使用泛型的好处
- 限定了装入集合的元素类型,将运行时间的问题提前到了编译期间
- 避免了强制类型的转换
说了那么多了,到底在哪儿使用泛型呀?😖
在哪儿些地方使用泛型呐?
看API,如果类、接口、抽象类后面跟的有 < E> 就说要使用泛型。一般来说就是在集合中使用
简单介绍点泛型高级(通配符)
- ?:任意类型,如果没有明确,那么就是Object以及任意的Java类了
- ? extends E:向下限定,E及其子类
- ? super E:向上限定,E及其父类
Set接口
详细的来复习一下Set集合,O的K呀!🎈
特点
无序,唯一 == 注意喽!==:虽然Set集合的元素无序,但是,作为集合来说,它肯定有它自己的存储顺序,如果你的顺序恰好和它的存储顺序一致,这代表不了有序,你可以多存储一些数据,就能看到效果哟!
HashSet集合
- 底层数据结构是哈希表(是一个元素为链表的数组)
- 如何保证元素的唯一性的呢?
用hashCode()和equals()保证的
哈希表底层依赖两个方法:hashCode()和equals()
- LinkedHashSet:底层数据结构由哈希表和链表组成
- 哈希表保证元素的唯一性
- 链表保证元素有序。(存储和取出是一致的)
TreeSet集合
- 特点:排序and 唯一
- 底层数据结构是红黑树(是一个自平衡的二叉树)
- 保证元素排序的唯一性
- 如何保证元素唯一性的呐?
- 如何保证元素排序的呢?
自然排序: 元素具备比较性 让元素所属的类实现自然排序接口Comparable 真正的比较是依赖于元素的compareTo()方法,而这个方法是定义在Comparable接口。所以,要想重写该方法,就必须是先Comparable接口。这个接口表示的是自然排序。 比较器排序: 集合具备比较性 让集合构造方法接收Comparator的实现类对象
Map接口
特点
将键映射到值得对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。
遍历方式
- 键找值
- 获取所有键的集合;
将键映射到值的对立键的集合,得到每一个键 根据键到集合中去找值 - 键值对对象找键和值:略
HashMap集合
是基于哈希表的Map接口实现。哈希表的作用是用来保证键的唯一性的。
LinkedHashMap集合
- 由哈希表保证键的唯一性
- 有链表保证键的有序(存储和取出的顺序一致)
TreeMap
是基于红黑树的Map接口的实现
HashTable集合:
①Properties集合:
主要用来存储字符串类型的键和值,在实际开发中,经常使用Properties集合类来存取应用的配置项
②属性集合类。是一个可以和IO流相结合使用的集合类
③🔺怎么和IO流结合呐?
把键值对形式的文本文件内容加载到集合中
把集合中的数据存储到文本文件中
④Properties课保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。
问题又来了哈!
ⅱ Hashtable和HashMap的区别
- Hashtable:线程安全,效率低,不允许null键和null值
- HashMap:线程不安全,效率高,允许null键和null值
双列集合
每个元素包含一个键对象Key和对象Value.一对一(键相同,值覆盖(后者覆盖前者))
Collections工具类
- 是针对集合进行操作的工具类,都是静态方法
- 如何把一个线程不安全的集合类变成一个线程安全的集合类?
用Collections工具类的方法即可
聚合操作
概述
在JDK8中增加了一个Stream接口,该接口可以将集合、数组中的元素转换为Stream流的形式,并结合Lambda表达式的形式的优势来进一步简化集合、数组中元素的查找、过滤、转换等操作。
创建Stream流对象的方式
- 所有Collections集合都可以使用stream()静态方法获取Stream流对象
- Stream接口的of()静态方法可以获取基本类型包装类数组、引用类型数组和单个元素的Stream流对象
- Array数组工具类的stream()静态方法也可以获取数组元素的Stream流对象
问题又又来了哈!
ⅲ 关于Collection集合,我们到底该用谁呀? 看唯一吗? 唯一:Set:如果你知道用Set,但是不知道用哪个Set的时候,那就用HashSet 不唯一:List:如果你知道用List,但是不知道用哪个List,那就用ArrayList 如果你知道是Collection集合,但是不知道使用谁,就用ArrayList。 如果你知道用集合,就用ArrayList
再来一个问题哈!
ⅳ Collection和Collections的区别? Collection:是单列集合的顶层接口,有子接口List和Set Collections:是针对集合操作的工具类,有对集合进行排序和二分查找的方法。
另外有相关的练习题(操作题),下次放羊,就敲操作题🐏🐐🐑
对了哈,(文章排版有点问题感觉,不过)有想要有关集合这篇文章的归纳总结思维导图的UU,可以找我,我发你哈! 嘻嘻!一起放羊ing!GoGoGo!
|