体系结构: 集合主要分为两种,单列集合collection和双列集合Map,区别在于单列集合一次插入一条数据,而双列的一次插入类似于key-value的形式
单列集合collection
注:红色的表示是接口,蓝色的是实现类
①操作功能:
增加: add(),List的新增一定是成功的,而Set不一定因为其有不能重复的限制条件
清空:clear()
删除:remove(),因为collection中定义的是共性的方法,所以删除不能通过索引去删除
判断是否存在:contains(),其底层是通过equals()方法实现的,因为equals()方法是基于比较地址值,所以如果集合中存的是对象的话,要重写equals()方法才能进行contains的比较
判断是否为空:isEmpty()
返回集合大小:size()
②遍历方式:
集合的遍历方式有三种,分别是迭代器遍历,增强for遍历和lambda表达式遍历
迭代器(Iterator)遍历:创建Iterator对象进行遍历
注: 迭代完毕指针不会复位;循环中next()只能用一次;迭代过程中不允许使用集合的方法增加删除
增强for遍历:底层其实就是迭代器
注: 集合名.for快速生成;对s中的修改不对集合的原数据有影响
Lambda表达式(foreach)遍历:底层就是遍历集合通过accept方法依次过的元素
③List
注: remove的时候如果有方法重载了,优先调用形参和实参类型一样的方法。remove(1)是索引
遍历方式: 相比于collection的3种遍历方式,List当然全部继承了,但是因为List有了索引的机制,所以List还增加了两种,普通的for循环和列表迭代器(listIterator)
数据结构:
ArrayList详解:底层是数组
源码:
①创建ArrayList时是一个长度为0的elementData
②在插入第一个元素时,将扩容为长度为10的数组,然后把数据放进去
①当原数组的长度已经用完了,底层就要去扩容,默认是扩容原数组长度的一半,即1.5倍
②如果插入的数据长度很大,就会扩容到大长度的地方
LinkedList详解:底层是双向链表
注: 这里的方法基本不用,而是基本使用List的方法
源码:学了数据结构中的双向链表就可以清楚的知道其操作流程
④Set
泛型:
泛型的作用:
java中的泛型其实是伪泛型:即其实底层存的时候依然是object对象,泛型会擦除
泛型可以定义在类上,也可以定义在方法上,还可以定义在接口上
HashSet详解: 底层是哈希表,jdk8之前是数组+链表,jdk8之后是数组+链表+红黑树
存数据的过程:①由hashcode计算出应存入的位置②如果位置是空就放进去③如果不为空,则调用equals方法去判断是否一样的,如果一样的就不存④如果不一样的话,jdk8之前是把新元素放进去,老元素取出来挂在新元素后面,而jdk8之后就是直接把新元素挂在老元素的后面
注意点:
LinkedHashSet详解: 底层跟HashSet一样,不过在其基础上加上了数据之间的双向链表结构,使得其变成有序的
TreeSet详解: 底层是红黑树,性能好
总结:各种单列集合的应用场景: