List接口的实现类
**List特点:**有序,不唯一(可重复)
ArrayList
实现了长度可变的数组,在内存中分配连续的空间。
**优点:**遍历元素和随机访问元素效率比较高
**缺点:**添加和删除需要大量移动元素,效率低,按照内容查找效率低
LinkedList
采用链表存储方式
**优点:**插入、删除元素时效率比较高
**缺点:**遍历和随机访问元素效率低下
Vector
是List接口的一个子类实现
Vector跟ArrayList一样,底层都是使用数组进项实现的
面试经常问区别:
1.ArrayList是线程不安全的,效率高,Vector是线程安全的,效率低
2.ArrayList在进行扩容的时候是1.5倍,Vector扩容的时候为原来的2倍
Iterator
在java代码中,包含三种循环方式
do…while
while
for
还有一种叫增强for循环的方式,可以简化循环的编写
所有的结合类都默认实现了Iterable的接口,实现此接口意味着具备了增强for循环的能力,也就是for_each
增强for循环本质上使用的也是iterator的功能
方法:
iterator()
foreach()
在Iterator的方法中,要求返回一个Iterator的接口子类实例对象
而此接口中包含了
hasNext()
next()
在使用iterator进行迭代的过程中如果删除其中的某个元素会报错,并发操作一出去昂,因此如果遍历的同事需要修改元素,建议使用listIterator(),
listIterator迭代器提供了向前和向后两种遍历方式
始终是通过cursor和lastret的指针来获取元素值及向下的遍历索引
当使用向前遍历的时候必要要保证指针在迭代器的结果,否则无法获取值
Set接口中的实现类
HashSet
Set接口存储一组唯一,无序的对象
存入和去除的顺序不一定一致
操作数据的方法与List类似,Set接口不存在get()方法
Set不可以通过下标获取对应位置的元素值,因为无序
HashSet如何保证元素的唯一性?
通过元素的两个方法,hashCode和equals方法完成。如果元素的HashCode值相同,才会判断equals是否为true。如果元素的HashCode值不同,才会调用equals方法。
设置元素的时候,如果是自定义对象,会查找对象中的equals和hashCIde的方法,如果没有,比较的是地址。
TreeSet
使用treeSet低层的实现是treeMap利用红黑树进行实现。
采用二叉树(红黑树)的存储结构
优点:有序(排序后的升序)查询速度比List快
缺点:查询速度没有HashSet快
树中的元素是要默认进行排序操作的,如果是基本数据类型,自动比较,如果是引用类型的,需要自己自定义比较器
比较器分类:
内部比较器:
定义在元素的类中,通过实现compareable接口来进行实现
外部比较器:
定义在当前类中,通过实现comparator接口来实现,但是要将该比较器传递到集合中
**注意:**外部比较器可以定义成一个工具类,此时所有需要比较的规则如果一致的话,可以复用,而内部比较器只有在存储当前对象的时候才可以使用。
如果两者同时存在,使用外部比价器。
当使用比较器的时候,不会调用equals方法。
泛型
当做一些集合的统一操作的时候,需要保证集合的类型是统一的,此时需要泛型来进行限制
优点:
1、数据安全
2、获取数据时效率比较高
给结合中的元素设置相同的类型就是泛型的基本需求
使用:
在定义对选哪个的时候,通过<>中设置合理的类型来进行实现
泛型的高阶应用:
1、泛型类:在定义类的时候,可以再类名的后面添<E,K,V>,起到占位的作用,类中的方法的返回值类型和属性的类型都可以使用。
2、泛型接口:
(1)在定义接口的时候,在接口的名称后添加<E,K,V>,子类在进行实现的时候,可以不填写泛型的类型,此时在创建具体的子类对象的时候才决定使用什么类型。
(2)子类在实现泛型接口的时候,只在实现父类的接口的时候指定父类的泛型类型即可,此时,测试方法中的泛型类型必须要跟子类保持一致
3、泛型方法:在定义方法的时候,指定方法的返回值和参数是自定义的占位符,可以使类名中的T,也可以是自定义的Q,定义在返回值的前面。
4、泛型的上限
如果父类确定了,所有的子类都可以直接使用
5、泛型的下限
如果子类确定了,子类的所有父类都可以直接传递参数使用
Map
Map:特点key-value映射
HashMap
数组+链表(1.7)
数组+链表+红黑树(1.8)
key无序 唯一 (Set)
Value无序 不唯一(Collection)
**Map.entry:**表示的是K-V组合的一组映射关系,key和value成组出现
hashMap和hashTable区别:
hashMap:线程不安全,效率比较高
hashTable:
线程安全,效率低
key和value都可以为null
hashMap初始值为2的N次幂
1.方便进行&运算操作,提高效率,&要比取模运算效率高 hash & initCapcity-1
2.在扩容之后涉及到元素的迁移过程,迁移的时候只需要判断二进制的前一位是0还是1即可,如果是0,表示新数组和旧数组下标位置不变,如果是1,只需要将索引位置加上旧的数组的长度值即为新数组的下标。
1.7源码知识点:数组+链表
1.默认初始容量
2.加载因子
3.put操作
设置值,计算hash
扩容操作
数据迁移过程
1.8源码知识:数组+链表+红黑树
LinkedHashMap
链表
有序的HashMap 速度快
TreeMap
红黑树
有序 速度没有hash快