什么!?改BUG最牛的人竟然是一位皇帝!!集合前来觐见!
Posted 离群灬
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么!?改BUG最牛的人竟然是一位皇帝!!集合前来觐见!相关的知识,希望对你有一定的参考价值。
目录
前言:
岂可休!!之前竟然有人说我标题王不行了。今日我携新标题勇者归来!
嘿嘿,要说改BUG最牛的人是谁呢?那肯定是雍正帝了,因为雍正专治八阿哥(BUG)嘛。
在雍正的兄弟里,八阿哥有“贤王”之称,正是因为“八爷党”的强大,成为了继承大统的胤禛(雍正皇帝)主要打击对象,雍正皇帝宁可背负残害亲兄弟的骂名,也要将其一网打尽。最终也是登上了帝位。
咱们回到正题哈,今天来和大家说一说容器集合。
集合类又被称为容器,是java数据结构的实现,专门用来存储其他类的对象。集合分为单列集合Collection和双列集合Map。希望通过本篇博客能帮助到大家了解它们。
一、Collection:
Collection是单列集合的顶层接口,它表示一组对象,这些对象也称为Collection元素
JDK不提供此接口的直接实现类,它提供更具体的子接口(Set和List)。
因为Collection是接口,所以使用它的时候需要通过多态形式创建对象。
常用方法:
方法名 | 说明 |
---|---|
boolean add(E e) | 添加元素 |
boolean remove(Object o) | 从集合中移除指定的元素 |
void clear() | 清空集合中的元素 |
boolean contains(Object o) | 判断集合中是否存在指定的元素 |
boolean isEmpty() | 判断集合是否为空 |
int size() | 集合的长度,也就是集合中元素的个数 |
遍历:
1.通过集合对象获取迭代器对象。
2.使用循环和 hasNext()方法来控制是否还有元素。
3.循环内通过next()方法获取元素。
Collection分为List、Set和Queue(队列),这个队列我们只要知道一下就好了,不需要过多的关注,主要是List和Set
1、List:
特点:
1.有索引
2.可以存储重复元素
3.元素存取有序
List集合的实现类主要有三个,分别是ArrayList、LinkedList和Vector,其中Vector我们只要了解到它和ArrayList相比较,它是线程安全的,有一个我们很熟悉的类继承于它,就是Stack(栈)。
ArrayList:
底层实现:数组
特点:查询快,增删慢。
LinkedList:
底层实现:链表
特点:查询慢,增删快。
它允许有空(null)元素。
特有功能:
方法名 | 说明 |
---|---|
public void addFirst(E e) | 在该列表开头插入指定的元素 |
public void addLast(E e) | 将指定的元素追加到此列表的末尾 |
public E getFirst() | 返回此列表中的第一个元素 |
public E getLast() | 返回此列表中的最后一个元素 |
public E removeFirst() | 从此列表中删除并返回第一个元素 |
public E removeLast() | 从此列表中删除并返回最后一个元素 |
2、Set:
Set的实现类主要是HashSet和TreeSet。
HashSet:
底层实现:哈希表结构
特点:
1.底层是哈希表结构
2.元素存取无序
3.没有索引
4.不能存储重复元素
允许包含值为null的元素,但最多只能一个。
其中LinkedHashSet不同于LinkedList和ArrayList同属于List实现类,LinkedHashSet是HashSet的子类。
LinkedHashSet:
底层实现:哈希表和链表
特点:
1.具有可预测的迭代次序。
2.由链表保证元素有序,也就是说元素的存储和取出顺序是一致的。
3.由哈希表保证元素唯一,也就是说没有重复的元素。
TreeSet:
底层实现:红黑树
特点:
1.元素有序。元素可以按照一定规则进行排序。具体要取决于构造方法。
TreeSet():根据元素的自然顺序进行排序。
TreeSet(Comparator c):根据指定的比较器进行排序。
2.TreeSet集合没有索引。只能通过迭代器、增强for循环进行遍历。
3.TreeSet集合不能存储重复元素。
自然排序Comparable的使用:
1.用TreeSet集合存储自定义对象,无参构造方法使用的是自然排序对元素进行排序的。
2.自然排序,就是让元素所属的类实现Comparable接口,重写compareTo(T o)方法。
3.重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写。
比较器排序Comparator的使用:
1.用TreeSet集合存储自定义对象,带参构造方法使用的是比较器排序对元素进行排序的。
2.比较器排序,就是让集合构造方法接收Comparator的实现类对象,使用匿名内部类方式传递,重写compare(T o1,T o2)方法。
3.重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写。
二、Map:
Map 是一种键-值对(key-value)集合,Map 集合中的每一个元素都包含一个键对象和一个值对象。它主要有HashMap和TreeMap、Hashtable,也是了解Hashtable是线程安全的就好。
基本功能:
方法名 | 说明 |
---|---|
V put(K key,V value) | 添加元素 |
V remove(Object key) | 根据键删除键值对元素 |
void clear() | 移除所有的键值对元素 |
boolean containsKey(Object key) | 判断集合是否包含指定的键 |
boolean containsValue(Object value) | 判断集合是否包含指定的值 |
boolean isEmpty() | 判断集合是否为空 |
int size() | 集合的长度,也就是集合中键值对的个数 |
获取功能:
方法名 | 说明 |
---|---|
V get(Object key) | 根据键获取值 |
Set<K> keySet() | 获取所有键的集合 |
Collection<V> values() | 获取所有值的集合 |
Set<Map.Entry<K,V>> entrySet() | 获取所有键值对对象的集合 |
其中我们通过KeySet方法获得所有键的集合为Set,加上键又是不能重复的。那么我们可以认为Map的键列底层实现是数列加上链表。而vakues方法获得所有值的集合为Collection,底层实现为链表或者数列。
特点:
1.键值对映射关系。
2. 一个键对应一个值。
3.键不能重复,值可以重复。
4.元素存取无序。
遍历:
方式1(键找值):
1.获取所有键的集合。用keySet()方法实现。
2.遍历键的集合,获取到每一个键。用增强for实现 。
3.根据键去找值。用get(Object key)方法实现。
方式2(键值对对象找值):
1.获取所有键值对对象的集合,使用entrySet()实现。
2.遍历键值对对象集合,拿到每一个键值对对象。
3.调用键值对对象中的getKey()和getValue()方法获取键和值。
1、HashMap:
JDK1.8 之前 HashMap的底层实现是数组加链表。
JDK1.8之后。当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间,所以底层实现是数组加链表加红黑树。
它具有很快的访问速度,最多允许一条记录的键为null,不支持线程同步。
2、TreeMap:
TreeMap底层实现:红黑树
特点:
1.无序,不允许重复(无序指元素顺序与添加顺序不一致)。
2.TreeMap集合默认会对键进行排序,所以键必须实现自然排序和定制排序中的一种。
三、面试题:
1、常见的集合有哪些?
Map接口和Collection接口是所有集合框架的父接口
Collection接口的子接口包括:Set接口和List接口
Map接口的实现类主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap以及Properties等
Set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等
List接口的实现类主要有:ArrayList、LinkedList、Stack以及Vector等
2、Arraylist 与 LinkedList 异同
- 1. 是否保证线程安全: ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全;
- 2. 底层数据结构: Arraylist 底层使用的是Object数组;LinkedList 底层使用的是双向循环链表数据结构;
- 3. 插入和删除是否受元素位置的影响: ① ArrayList 采用数组存储,所以插入和删除元素的时间复杂度受元素位置的影响。 ② LinkedList 采用链表存储,所以插入,删除元素时间复杂度不受元素位置的影响,都是近似 O(1)而数组为近似 O(n)。
- 4. 是否支持快速随机访问: LinkedList 不支持高效的随机元素访问,而ArrayList 实现了RandmoAccess 接口,所以有随机访问功能。快速随机访问就是通过元素的序号快速获取元素对象(对应于
get(int index)
方法)。- 5. 内存空间占用: ArrayList的空 间浪费主要体现在在list列表的结尾会预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗比ArrayList更多的空间(因为要存放直接后继和直接前驱以及数据)。
3、ArrayList和LinkedList的区别?
- LinkedList基于链表的数据结构;ArrayList基于动态数组的数据结构
- LinkedList 在插入和删除数据时效率更高,ArrayList 查询效率更高;
4、HashMap与HashTable的区别?
- HashMap没有考虑同步,是线程不安全的;Hashtable使用了synchronized关键字,是线程安全的;
- HashMap允许K/V都为null;后者K/V都不允许为null;
求关注!
求点赞!
求评论!
万分感谢!
以上是关于什么!?改BUG最牛的人竟然是一位皇帝!!集合前来觐见!的主要内容,如果未能解决你的问题,请参考以下文章