1.集合的由来
单个数据,可以使用变量保存;
多个数据,可以使用数组保存;
使用数组的前提:
1、要保存的数据的数据类型是一致的;
2、要保存的数据的数量是已知的;
那么存储多个数据的数量不确定的情况?
---- 使用集合
2.集合和数组的区别
数组:
1、只能保存同一种类型的数据;
2、数组一旦创建,容量不可改变;
3、数组可以保存引用类型的数据和基本类型的数据;
集合:
1、可以保存不同类型的数据;
2、集合可根据需要自动扩容;
3、集合只能保存引用类型的数据;(为什么不能保存基本类型的数据)
--- 向集合中添加基本类型的数据时,使用了自动装箱,实际添加的是该数据对应的包装类的对象;
3.
4.Collection接口的一些特性
1、Collection接口是集合框架中的根接口,它描述的集合框架中所有集合工具类最共性的行为;
2、在集合框架中,有的集合类允许保存重复的元素,有些不允许保存重复的元素;
3、有的集合类,数据存放和取出的顺序是一致的,有的是无序的;
4、这个接口很抽象,集合框架中没有它的直接实现类,而是一般都实现它的子接口;
5、因为这个接口很抽象,所以为了不同的需求,定义了不同的子接口扩展它;
5.Collection接口的一些方法
6.List接口
1、List接口的实现类,表示的容器里面保存的数据都是有序的(注意:这里说的有序,指的是,元素保存的顺序是有序的,和元素添加的顺序是一样的);
2、List接口的实现类,里面的元素像数组一样,都有索引;
3、List接口实现类表示的容器,里面可以保存重复的元素;
4、List接口定义了特殊的迭代器,对Iterator进行了扩展,可以双向迭代,等等;
三个比较常用的类:
ArrayList;LinkedList;Vector;(实现类)
ArrayList
1、ArrayList底层使用数组保存数据;
2、ArrayList里面允许存在null元素;
3、ArrayList和Vector类似,只是ArrayList是非线程安全的;
LinkedList
1、LinkedList底层使用双端链表的数据结构保存数据;
2、LinkedList的独有方法,主要是围绕链表的头和尾操作;
3、LinkedList也允许Null元素;
7.set接口
1、Set集合不包含重复元素;
2、一般Set集合判断两个元素是否相等,是通过equals方法判断的;
3、如果集合中可以保存null,那么这个集合中最多只能由一个null;
4、Set接口中没有对Collection接口扩展更新的功能;
常用实现类
HashSet
1、HashSet集合底层使用哈希表保存数据;
2、HashSet集合,添加数据的顺序和存储、获取的顺序不一致;
3、可以添加null元素,最多只能由一个null元素;
--- 这里元素唯一性的原理是
HashSet集合容器在保存对象时,会先调用对象的hashCode方法,获取对象的哈希码,判断应该将对象保存在哈希表中的哪个区域,然后遍历该区域的所有对象,通过equals方法判断是否有重复的元素;如果有,就不再保存;所以可以保证保存在容器中的数据都是唯一的;
LinkedHashSet
1、使用LinkedHashSet集合对象保存的数据,添加数据的顺序和迭代数据的顺序是一样的;
2、在LinkedHashSet底层,有一个哈希表和一个链表,哈希表负责保存数据和维护数据的唯一性;链表负责记录数据添加的顺序;
3、如果新添加数据时发现已经有相同的数据了,新的数据就不会再被添加;
TreeSet
1、TreeSet集合中保存的数据都是有序的,这里的有序指的是对元素进行了排序;
2、排序使用的是元素的自然顺序或者是创建集合对象时提供的Comparator排序;
以上单列数据集合总结:
8.Map集合
Map集合也是用来保存对象的,但和Collection集合只能一个个保存对象不同,Map集合一次保存的是一对对象,按照
键(K)——值(V) 对的关系保存;
Map集合的特点:
1, Map集合中存储的是key-value的映射关系;
2, Map集合中的每个映射包含键和值两个对象,同时映射本身也是一个对象,使用Map.Entry类描述;
3, Map集合中的key必须保证唯一,不能重复,但值可以重复;
4, Map集合中key和value都可以是null元素,但是key只能有一个null;
5, Map集合不能直接遍历,只能通过键集、值集或键值对集遍历;