集合框架定义,必须学会:ArrayList、LinkedList、hashSet!!!

集合框架定义:

集合框架是一种用于存储对象信息的容器,并且长度是可变的

1.因为对象是可以创建无限个的,而对象数组是开辟固定长度的存储空间,显然用对象数组去存 储对象是不合适的
2.对象数组长度不可变化并且无法保存具有映射关系的数据;集合可以用于存 储数量不确定的数据,长度可变。以及可以保存具有映射关系的数据
3.数组元素既可以是基本类型的值,也可以是对象;集合只能保存对象(比如list.add(1)是把1变成 包装类Integer类型

所有的集合框架继承关系图:(虽然很全,但是我们不是都要掌握,我们掌握工作中常用的就可以了)
在这里插入图片描述
在这里插入图片描述
如果还觉得太难,你就看下面这个常用集合:
在这里插入图片描述

各集合的使用

A.List接口下的集合

List接口集合代表一个有序、可重复的集合,集合每个元素都有其对应的顺序索引。List集合默认按照元
素的添加顺序设置元素的索引,可以通过索引来访问指定位置的集合元素。
实现List接口的集合常用的有:ArrayList、LinkedList、Vector子类等,实现List接口的有哪些子类
具体参考打开层级目录去看,不需要所有都学会。

a.ArayList:

ArrayList是我们最常用用于遍历数据的集合,底层是一个Object类型的数组,它允许任何符合规则的数据
插入设置是null;该Object类型的数组集合默认长度为0,也可以自定义长度。每次调用list.add()方
法的增加元素的同时对容量进行检查,当快溢出时,就会对该数组进行扩容

在这里插入图片描述
list.get(i):直接获取数组的指定下标位置的元素,查询快

@SuppressWarnings("unchecked")
E elementData(int index) {
return (E) elementData[index];
}

ArrayList是一个有序可扩容长度的数组,所以可以插入有序的可重复的元素,优点是:可以快速通过下
标获取到元素,遍历元素和查找元素快;缺点:由于插入、删除需要位移,所以插入和删除效率慢。

同时ArrayList是非同步的,是非线程安全的,效率高。

b.LinkedList:

LinkedList的实现机制与ArrayList的实现机制完全不同,ArrayList内部以数组形式保存集合的元
素,所以查询和遍历元素速度快,但是插入和删除需要位移性能低;LinkedList内部以链表式的形式保存
集合的元素,所以查询和变量元素效率没有ArrayList效率高,但是插入和删除效率高。

linkedList.add()源码:
把元素插入到集合容器中的同时,将该元素记录在该元素的前、后的位置。所以插入和删除该元素不需
要位移。

void linkLast(E e) {
final Node<E> l = last;
final Node<E> newNode = new Node<>(l, e, null);
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}

linkedList集合的get(i),是根据下标为参数,先将index位置化成两半,如果index是小于集合的一半就
是从第一个往后找,知道找到index的值赋给x返回,如果大于就从集合最后的值往前找,找到index的
值赋给x返回,这样可以减少一部分不必要的遍历。但是还是没有ArrayList直接找到下标位置的元素效
率高!

Node<E> node(int index) {
// assert isElementIndex(index);
if (index < (size >> 1)) {
Node<E> x = first;
for (int i = 0; i < index; i++)
x = x.next;
return x;
} else {
Node<E> x = last;
for (int i = size - 1; i > index; i--)
x = x.prev;
return x;
}
}

c.Vector

vector的add()方法的源码:

public synchronized boolean add(E e) {
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = e;
return true;
}
synchronized修饰使方法同步,此集合线程安全。

面试题:ArrayList和Vector的区别在哪里?

ArrayList集合和Vector集合底层数组存储的,操作都是一样的。ArrayList非线程安全,效率上更高;
Vector是线程安全的。

B.Set接口下的集合

Set接口用于存储无序并元素不可重复的集合,如下图:
在这里插入图片描述
Set接口常用的实现子类有HashSet、LinkedHashSet、TreeSet类等。

a.HashSet

HashSet是Set集合中最常用的实现类,HashSet是按照哈希算法来存储的,因此具有很好的存取和查找性
能。

HashSet特点:

1.无序,不能保证元素的顺序
2.HashSet不是线程同步的,如果多线程操作HashSet集合,则应通过代码来实现线程同步。
3.集合元素可以为null

b.LinkedHashSet

linkedHashSet是介于HashSet和TreeSet之间,内部是一个双向链表结构,所以它插入是有有序的。
linkedHashSet是HashSet的一个子类,具有HashSet的特性,也是根据元素的hashCode值来决定元素
的存储位置。但它使用链表维护元素的次序,元素的顺序与添加顺序一致。由于LinkedHashSet需要维护
元素的插入顺序,因此性能上略低于HashSet,但在迭代访问Set里面的全部元素时候有很好的性能。

c.TreeSet集合

TreeSet是SortedSet接口的实现类,TreeSet可以保证元素处于排序状态,它采用的是红黑树算法的数
据结构来存储集合元素。TreeSet支持两种排序方法:自然排序和定制排序,默认采用自然排序

自然排序:

TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素的大小,然后将元素按照升序排
列,这就是自然排序。

定制排序:

如果TreeSet集合插入的是对象,那么对象是无法去比较排序的,所以我们需要通过定制排序来定制对象之
间排序的规则,
需要再创建TreeSet集合对象时,提供一个Comparator对象与该TreeSet集合关联,由Comparator对象
负责集合元素的排序规则

实现步骤:

  • 1.在集合的元素的类里面实现Comparator接口
  • 2.重写compareto(Object obj)方法自定义排序规则

d.EnumSet

EnumSet是一个专门用来存放枚举类型的集合,不允许添加null值。EnumSet集合元素也是有序的,它是
以枚举值在Enum类内的定义顺序来决定集合元素的顺序。

各Set集实现类的性能分析:

HashSet的性能比TreeSet性能好,因为TreeSet需要额外通过红黑树算法来维护元素吃次序,如果需要
保持一个排序的Set时候用TreeSet,否则应该使用HashSet
LinkedHashSet是HashSet的子类,由于需要维护链表的顺序,所以插入和删除操作比HashSet要慢,但
遍历比hasetSet要快。
EnumSet是所有的Set实现类中性能最好的,但它只能用于保存同一个枚举类的枚举值作为元素的集合。
以上几个Set实现类都是非线程安全的,如果需要多线程访问,必须手动包装集合的同步性

必须学会:ArrayList、LinkedList、hashSet

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值