什么!?改BUG最牛的人竟然是一位皇帝!!集合前来觐见!

Posted 离群灬

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么!?改BUG最牛的人竟然是一位皇帝!!集合前来觐见!相关的知识,希望对你有一定的参考价值。


目录

前言:

一、Collection:

1、List:

ArrayList:

LinkedList:

2、Set:

HashSet:

TreeSet:

二、Map:

1、HashMap:

2、TreeMap:

三、面试题:


前言:

岂可休!!之前竟然有人说我标题王不行了。今日我携新标题勇者归来!

嘿嘿,要说改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集合的实现类主要有三个,分别是ArrayListLinkedList和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的区别?

  1. HashMap没有考虑同步,是线程不安全的;Hashtable使用了synchronized关键字,是线程安全的;
  2. HashMap允许K/V都为null;后者K/V都不允许为null;

求关注!

求点赞!

求评论!

 万分感谢!

以上是关于什么!?改BUG最牛的人竟然是一位皇帝!!集合前来觐见!的主要内容,如果未能解决你的问题,请参考以下文章

世界最牛的黑客在中国,近八成华人想回国拜他为师

剁手季我做过最牛的事情

下代 iPhone 最牛的功能,是这个...

国外最牛的Php开源建站平台

Google疯了,竟然这样!

数据显示:中国的程序员是世界上最牛的程序员