集合

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快

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值