菜鸟谈论集合
集合和数组一样,都是容器。
由于数组长度不可变,在进行使用时候需要时刻注意数组是否已经存满,使用很不爽。
当然,数组也有它自己的优点,比如可以根据索引快速定位到所需要元素的位置。查找效率高。
集合采用不同的数据结构作为存储元素的模型(比如线性表,树),对于采用相同的数据结构,但是在存储器上的物理实现方式不同也会产生不同的容器实现类(比如ArrayList和LinkList都属于线性结构,但前者属于顺序存储,后者属于链式存储)。
集合是泛型类,而泛型不支持基本数据类型,所以集合不能存储基本数据类型。(可以将基本类型转换为包装类进行存储)。
创建某种集合类的对象时,在内存中建立对应的数据结构的容器,向容器里面插入元素时,某些数据结构模型对插入的元素有位置要求,这里用TreeSet来举例,底层使用平衡二叉树作为存储模型,(利用红黑树的方式构建平衡二叉树),Java官方秃头们已经对红黑树这种插入规则进行了代码实现,但是在真正插入的时候需要进行元素比较,但是秃头们又不知到你提供的元素是啥,因此也就不知道比较的规则,所以你可以在元素对应的类的内部提供比较规则,也可以在创建集合对象时使用带参构造提供比较规则。
集合可以分为单列集合和双列集合,单列集合实现了迭代器的接口,因此可以使用迭代器。双列集合没有实现迭代器接口,因此不可以使用迭代器。
一.单列集合:List和Set。List支持索引,可以存储重复的数据元素,元素的迭代顺序和插入顺序一致。Set则正好相反,不支持索引,允许重复元素出现,元素的迭代顺序与插入顺序无关。
1.1 List根据物理实现方式不同分为ArrayList和LinkList两种集合类。
ArrayList默认大小为10,扩容规则为原集合大小*1.5+1;
LinkList底层使用双向链表实现
1.2 Set
TreeSet集合内部使用红黑树来组织数据元素。
HashSet内部使用散列表来组织数据元素。(数组+链表+红黑树)
二.双列集合
HashMap