java集合的概念
是一种容器,用来储存对象(存储N个)
集合和数组也是比较类似的都是用来存储数据
在java中集合可分为两种体系Collections和Map
- 与数组的区别 :
- 存储数据的长度
- 数组长度一旦确定不能改变
- 集合可以改变长度
- 数据类型的区别
- 数组中不能存储与指定类型不同的其它数据类型的对象
- 集合中可以存储任意的类型(Object)
Collection
Collection是所有集合的顶层接口
-
List : 有序、可重复
- ArrayList
- 使用一个可变长度的数组实现, 非线程安全
– 第一次调用add方法数组长度为10
– 每次扩容都是之前容量的1.5倍, 且在添加数组的最后一个元素时会进行扩容操作 - 在内存中是连续的一块空间保存数据, 不适合存储大量的元素
- 索引速度快(有下标, 所以查找元素的效率高)
- 插入和删除元素的效率低(涉及大量的数据移动)
- 使用一个可变长度的数组实现, 非线程安全
- LinkedList
- 使用双向链表的方式(结构实现), 非线程安全
- 在内存中以分散的形式存储数据
- 查找元素效率低
- 插入与删除元素的效率高
- Vector
- 与ArrayList相同(使用可变长度的数组实现), 线程安全
- 查询, 插入, 删除效率低
- ArrayList
-
Set:无序,可重复
- HashSet
- 常用API方法与List差不多
- 基于HashMap实现(基于hashCode与equals方法实现对数据对象的不可重复)
- hashCode: 比较两个对象的哈希码值, 如果不相等, 则直接将对象添加至集合中, 如果hash码相等, 则调用equals方法进行比较
- equals: 判断两个对象中的指定/所有成员属性值是否相等, 如果相等,则不添加,如果不相等,则添加到集合中
- 注意⚠️:如果对象重复, 则新添加的元素被直接丢弃
- HashSet去重原理:
1比较两个对象的哈希码值, 如果不相等, 则直接将对象添加至集合中, 如果hash码相等, 则调用equals方法进行比较
判断两个对象中的指定/所有成员属性值是否相等, 如果相等,则不添加,如果不相等,则添加到集合中
- LinkedHashSet
- 有序: 使用链表维护该集合的顺序
不可重复: 实现原理与HashSet一致
- 有序: 使用链表维护该集合的顺序
- SortedSet:子接口
- TreeSet:
- 无序
- 不可重复
- 常用API方法与HashSet一致
- 默认对存储的数据/元素实现排序
- 实现方式: 使用comparTo方法
注意: 集合指定的泛型类型必须实现 Comparable 接口, 重写 compareTo 方法
- 实现方式: 使用comparTo方法
- TreeSet:
- HashSet
foreach循环 / 增强型 for 循环
- 语法:
for(数据类型 变量名称 : 集合/数组变量名称){
}
// 以数组为示例:
int[] nums = {1, 2, 3};
for(int num : nums){
System.out.println(num);
}
iterator()
- 迭代器: Iterator: 是重复反馈过程的活动
长对过程的重复行为称之为迭代 - 迭代器使用中注意:
1. 在迭代器完成之后, 位置在元素的最后一个索引, 所以不能再重新进行迭代
2. 在迭代过程中,不能多次调用next方法
3. 在迭代过程中, 不能向集合中添加或删除元素
泛型
-
指定集合中元素的数据类型(集合中可以存储的元素的数据类型)
-
语法:< ElementType >
ArrayList< Integer > list = new ArrayList< Integer >();
一旦集合指定了泛型类型之后, 那么该集合中只能存储与指定类型一致的元素
-
泛型的数据类型使用
- List<?>: ? 可以是任意的类型
- List<? extends E>: ? 可以是本类类型或其子类类型
- List<? super E>: ? 可以是本类类型或指定类型的父类类型
List: sort(): 用来对集合中的元素进行排序
-
Collections.sort(list);
- list泛型类型必须实现 Comparable , 重写 compareTo 方法
-
Collection:是一个集合的顶层父接口
-
Collections: 是一个工具类
-
排序操作:
- sort(List): 对指定的集合中的元素进行排序
- reverse(List): 将指定集合中的元素进行反转
- shuffle(List): 将指定集合中的元素顺序随机打乱