集合的底层:
集合的底层是数组:
第一次增加元素时,初始化一个长度为10的数组。
当存储第11个元素时,会创建一个新数组,新数组长度是老数组的1.5倍。
每一次扩容将老数组的元素复制到新数组。
集合的体系:
ArrayList单列集合:
Collection:
List: -- 可重复的。
ArrayList -- 核心实现类
LinkedList
Set: -- 不可重复的。
HashSet
TreeSet
双列集合:
HashMap
TreeMap
常用的方法:
Collectionadd(obj):添加。
add(index,obj):插入。
remove(index):删除。
remove(obj):删除。
set(index,obj):修改。
get(index):查询。
clear():清空集合。
isEmpty():判断集合是不是空的。
size():返回集合的长度。
迭代器Collection 是 List 的父接口,使用时,要用他的子接口下面的实现类。
Collection 是 没有索引相关的操作 -- 索引操作的方法,是List接口特有的。
有:
add(元素) -- 添加元素
remove(元素) -- 删除元素
clear() -- 清空集合
isEmpty() -- 判断集合是否为空
contains(元素) -- 判断集合中是否有这个元素
size() -- 集合长度
List扩展:
add(index,元素) -- 通过索引,指定位置添加
remove(index) -- 删除索引处元素
set(index,obj) -- 修改索引处元素
get(index) -- 得到索引处元素
链表普通for循环,带索引的:
操作索引相关时用。
迭代器:
不要用集合对象去修改、删除元素,因为每一次修改,修改次数++,next()时会校验修改次数和元素个数是否相等,不等就会报异常:ConcurrentModificationException。
增强for:
不能删除元素,不能改,只能查看。
泛型数组:
增删慢,查询快。
原因:
数组是一段连续的空间,有索引,查询时可直接通过索引查询数据。
增删时,会导致很多的元素移动,效率低。
ArrayList 底层数据结构就是数组。 -- 常用的,因为实际业务中,查询时主流。
链表:
增删快,查询慢。
原因:
链表不是连续开辟的空间,需要存储数据时,才会开辟一个节点,有点节省空间。
增删时,只需要改变相邻元素的指向关系即可,效率较数组高。
查询时,需要从头开始遍历,效率较数组低。
LinkedList 底层数据结构是链表。
Set集合没有泛型,集合容器所能接收的类型是默认Object。缺点是遍历元素时,类型是Object转型存在风险。
E 是一个变量,目前可指代一切引用类型,可以再类中使用 E ,创建该泛型类对象时才明确E的具体类型。
泛型类:public class Fan
{} 泛型方法:public
E fan {} 泛型变量:private E e;
泛型接口:public interface MyInter
通配符:
:规定了上限,可以接收该类型,或其子类。
:规定了下限,可以接收该类型,或其父类。
Set:
TreeSet:
以存储数据的值,比较大小,默认是从下到大
String:先比较首字母,当首字母相同时在依次比较后面的。
Integer:比较大小。
为什么打印出来是这种格式:[值1, 值2, 值3]?
因为重写了toString。
如果TreeSet里存储的是自定义类型,是否支持排序?
不支持,需要实现Comparable接口。并且重写compareTo方法。
compareTo方法:-- 返回值int
比较结果。> 0 排右边,< 0排左边,= 0 视为重复元素,不给予存储。
int类型: return this.age - other.age;
String类型:return this.name.compareTo(other.name);
HashSet:
取得顺序:按照存储的数据的哈希值比较大小,从小到大排序。



