Collection
存放的是单一的值,
List
ArrayList
1、可以存放不同类型的数据,而数组只能存放固定类型的数据
2、当使用arraylist子类实现的时候,初始化的长度是10,当长度不够的时候会自动进行扩容操作
LinkedList
1.底层使用链表的格式存储
Vector
1、Vector也是List接口的一个子类实现
2、Vector跟ArrayList一样,底层都是使用数组进行实现的
3、ArrayList是线程不安全的,效率高,Vector是线程安全的效率低
4、ArrayList在进行扩容的时候,是扩容1.5倍,Vector扩容的时候扩容原来的2倍
Set
HashSet
1、set中存放的是无序,唯一的数据
2、set不可以通过下标获取对应位置的元素的值,因为无序的特点
3.设置元素的时候,如果是自定义对象,会查找对象中的equals和hashcode的方法,如果没有,比较的是地址
LinkedHashSet
TreeSet
1、treeset底层的实现是treemap,利用红黑树来进行实现
2.树中的元素是要默认进行排序操作的,如果是基本数据类型,自动比较,如果是引用类型的话,需要自定义比较器
比较器分类:
内部比较器
定义在元素的类中,通过实现comparable接口来进行实现
外部比较器
定义在当前类中,通过实现comparator接口来实现,但是要将该比较器传递到集合中
注意:外部比较器可以定义成一个工具类,此时所有需要比较的规则如果一致的话,可以复用,而
内部比较器只有在存储当前对象的时候才可以使用
如果两者同时存在,使用外部比较器
当使用比较器的时候,不会调用equals方法
Queue
LinkedBlockingQueue
Map
map存储的是k-v键值对映射的数据
实现子类:
HashMap:数据+链表(1.7) 数组+链表+红黑树(1.8)
LinkedHashMap:链表
TreeMap:红黑树
Map.entry:表示的是K-V组合的一组映射关系,key和value成组出现
hashmap跟hashtable的区别:
1、hashmap线程不安全,效率比较高,hashtable线程安全,效率低
2、hashmap中key和value都可以为空,hashtable不允许为空
hashmap初始值为2的N次幂,
1、方便进行&操作,提高效率,&要比取模运算效率要高
hash & (initCapacity-1)
2、在扩容之后涉及到元素的迁移过程,迁移的时候只需要判断二进制的前一位是0或者是1即可
如果是0,表示新数组和就数组的下标位置不变,如果是1,只需要将索引位置加上旧的数组的长度值即为新数组的下标
1.7源码知识点: 数组+链表
1、默认初始容量
2、加载因子
3、put操作
1、设置值,计算hash
2、扩容操作
3、数据迁移的过程
1.8源码知识点: 数组+链表+红黑树
HashMap
HashTable
LinkedHashMap
TreeMap
ConcurrentHashMap
其它相关 Iterable,Iterator
所有的集合类都默认实现了Iterable的接口,实现此接口意味着具备了增强for循环的能力,也就是for-each
增强for循环本质上使用的也是iterator的功能
方法:
iterator()
foreach()
在iterator的方法中,要求返回一个Iterator的接口子类实例对象
此接口中包含了
hasNext()
next()
在使用iterator进行迭代的过程中如果删除其中的某个元素会报错,并发操作异常,因此
如果遍历的同时需要修改元素,建议使用listIterator(),
ListIterator迭代器提供了向前和向后两种遍历的方式
始终是通过cursor和lastret的指针来获取元素值及向下的遍历索引
当使用向前遍历的时候必须要保证指针在迭代器的结果,否则无法获取结果值
