数组的特点
- 数组中保存的元素都是有序的,可以通过下标快速访问
- 数组中保存的数据都是同一种类型
- 数组的长度在定义后,无法改变
- 数组无法获取其中保存的元素实际数量
集合的特点
- 能保存一组数据,可以有序可以无序
- 集合的容量可变
- 集合中可以保存不同类型的数据
- 可以获取集合中保存的元素实际数量
集合的根接口为Collection接口和Map接口
Collection接口
该接口有两个核心子接口:
List
和
Set
。
这两个接口都可以保存一组元素,
List
接口
保存元素时,是
有序可重复
的;
Set
接口
保存元素时,是
无序
不重复
的。
List接口
有序集合,元素可以重复,允许保存null,可以通过索引获取对应位置上的元素。
ArrayList实现类(适合查询修改)
- 采用数组实现的集合
- 可以通过索引访问元素,可以改变集合大小。如果要在其中插入或删除元素时,会影响后续元素
- 该集合中保存的都是引用类型,即便保存了数组123,也保存的是Integer类型的123,而不是int类型的123
- 该集合查询效率高,中途增加和删除元素效率低
LinkedList实现类(适合增加删除)
- 采用双向链表实现的集合
- 集合中保存的每个元素也称为节点,除首尾节点外,其余节点都保存了自己的信息外,还保存了其前一个和后一个节点的地址
- 如果在双向链表的数据结构中插入和删除操作节点时,不会影响其他节点的位置。如添加时新节点时,只需要重写定义新节点的前后节点位置即可
- 如果要查询某个节点时,需要从头结点或尾结点开始一步步得到目标节点的位置
- 双向链表在中间插入和删除的效率高,随机读取的效率低
Set接口(无序不重复)
无序集合,元素不可以重复,允许保存
null
,没有索引。
Set
接口中没有自己定义的方法,都是继承于
Collection
接口中的方法
HashSet
实现类
- 采用哈希表实现
- 元素不能重复,无序保存,允许保存一个null
- 本质是一个HashMap对象
- 使用HashSet集合时,通常要重写实体类中的equals和hashcode方法
TreeSet实现类(二叉树)
- 特殊的Set实现类,数据可以有序保存,可以重复,不能添加null
- 采用红黑树(自平衡二叉树)实现的集合
- 只能添加同一种类型的对象且该类实现了Comparable接口
- compareTo()方法的返回值决定了能否添加新元素和新元素的位置
- 添加的元素可以自动排序
Map接口
Map
称为映射,数据以
键值对
的形式保存。保存的是键与值的对应关系。
键称为
Key
,值称为
Value
,键不能重复,键允许出现一个
null
作为键,值无限制。
键和值都是引用类型。
集合和数组之间的转换
- 集合转换为数组:使用Collection接口中的toArray()方法
Object[] obj = 集合对象.toArray();
List<Integer> list = new ArrayList();
list.add(123);
list.add(63);
list.add(3);
Integer[] nums =(Integer[]) list.toArray();
- 数组转换为集合
//一个数组对象
int[] nums ={11,2,66,3,6,21};
//定义集合对象
List list = new ArrayList();
//遍历数组的同时添加到集合中
for(int i:nums){
list.add(i);
}