集合详细知识点(用四篇文章来详解)
一、集合的注解
1. 什么是集合?
- 集合是Java提供的一种容器,用来存储多个数据。
2. 集合的特点是什么?
- 对象封装数据,对象多了也需要存储。集合用于存储对象。
- 对象的个数确定可以使用数组,对象的个数不确定的可以用集合。因为集合是可变长度的。
3. 集合和数组的区别有哪些?
- 集合长度可变( 可以动态扩展容量),数组是固定长度。
- 集合仅可以存储引用数据类型,数组既可以存储基本数据类型也可以存储引用数据类型。
- 集合可以存储不同数据类型,数组只可以存储同一种数据类型。
4. 集合的好处有哪些?
- 容器自动增长。
- 提供了高性能的数据结构和算法,提高了程序的速度和质量。(实现了常用的数据结构,提供了一系列公开的方法用于增加、删除、修改、查找和遍历数据)
5. 线程安全
- Vector
- HashTable
- ConcurrentHashMap
- StringBuffer
线程不安全 - ArrayList
- LinkedList
- HashMap
- HashSet
- TreeMap
- TreeSet
- StringBuilder
6. 常见的集合类有哪些?
7. 集合底层数据结构
Collection接口
-
List
ArrayList:动态数组【增删慢,查询快】,线程不安全,效率高,可以存储重复元素。 Vector:数组,查询快,增删慢,线程安全,效率低,可以存储重复元素。 LinkedList:双向循环链表【查询慢,增删快】,线程不安全,效率高,可以存储重复元素。
-
Set
HashSet:基于HashMap实现,底层是一个哈希表结构【查询速度非常快】 LinkedHashSet:继承HashSet,内部通过LinkedHashMap TreeSet:红黑树
Map接口
- HashMap:【查询的速度特别快】【非线程安全】
jdk1.8前:数组+链表
jdk1.8后:数组+链表/红黑树(如果链表的长度超过了8位,那么就会把链表转换为红黑树(提高查询的速 度))减少搜索时间
- LinkedHashMap:继承自HashMap,底层仍然是数组和链表或红黑树组成另外,增加了一条双向链表,保证键值对的加入顺序,多了一条链表(记录元素的存储顺序),保证元素有序
- HashTable:数组+链表,数组是HashTable主体,链表是为了解决哈希冲突
- TreeMap:红黑树
二、Collection接口
1. Collection集合的概述
** Collection集合是util包下的接口,使用时需要导包。是所有单列集合最顶层的接口,里面定义的所有单列集合的共性方法。
使用集合中的方法时,首先要创建一个集合对象:
Collection< String > coll = Arraylist <>(); 这是一个多态(接口指向实现类)
所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的 Collection,有一个Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。**
2. Collection集合的常用方法
3. Collection接口中常用集合的分类及特点
4. List接口和Set接口的区别
5. List接口
(1)ArrayList:底层数据结构是数组,查询快,增删慢,线程不安全,效率高,可以存储重复元素。
(2)LinkedList:底层数据结构是链表,查询慢,增删快,线程不安全,效率高,可以存储重复元素。
(3)Vector:底层数据结构是数组,查询快,增删慢,线程安全,效率低,可以存储重复元素。
6. Set接口
(1)Set集合类似于一个罐子,程序可以依次把多个对象“丢进”Set集合,而Set集合通常不能记住元素的添加顺序。
实际上Set就是Collection只是行为略有不同(Set不允许存储重复元素)。
(2)Set集合不允许包含相同的元素,如果试图把两个相同元素加入同一个Set集合中,
则添加操作失败,add()方法返回false,且新元素不会被加入。
(3)Set集合不能存储重复的元素的原因:因为Set集合是通过HashMap实现的,存进去的数据相当于Key,
但Key是不能重复的。
7. Collection和Collections的区别?
* Collection:是单列集合的顶层接口,有子接口List和Set。
* Collections:是针对集合操作的工具类,有对集合进行排序和二分查找的。
三、Map接口
1. Map集合的概述
Map用于保存具有映射关系的数据,Map里保存着两组数据:key和value,它们都可以是任何引用类型的数据,
但key不能重复。所以通过指定的key就可以取出对应的value。
Map<键,值>或者<K,V>
(映射:映射就是给一个对象(可以是变量、物体、等等)起一个唯一的别名。例如:把编号9527映射
到唐伯虎上,只需要告诉程序你要找编号9527,程序就能找到唐伯虎。这就是映射)
2. Map集合的作用
和查字典类似,通过key找到对应的value,通过页数找到对应的信息。用这种【对应关系方便查找】。
3. Map集合的特点
a. Map集合是一个双列集合,一个元素包含两个值(一个key,一个value)
b. Map集合中的元素,K和V的数据类型可以相同,也可以不同,可以是任何引用类型的数据
c. Map集合中的元素,【K是不允许重复的,V是可以重复的】
d. Map集合中的元素,K和V是一一对应的
4. Map集合的常用子类
HashMap集合 、LinkedHashMap集合 (HashMap集合的子类)、ConcurrentHashMap集合、TreeMap集合。
5. Map集合的常用方法
6. Map集合的子接口
HashTable:数据结构是数组+链表;线程安全,修改时会锁住整张表;不可null键 null值;采用链地址法解决哈希冲突。
* HashMap:数据结构是数组+链表;线程不安全;可一个null键多个null值;采用链地址法解决哈希冲突。
*LinkedHashMap:跟HashMap类型,但会维护一个双向链表来保持插入的顺序是有序的。
*TreeMap:数据结构是红黑树;对map的key可以进行排序。
*ConcurrentHashMap:数据结构是 JDK1.7 【分段数组+链表】,JDK1.8【数组+链表/红黑树】
7. 辅助工具类
Array 和 ArrayList 有何区别?
* Array 可以存储基本数据类型和对象,ArrayList 只能存储对象。
* Array 是指定固定大小的,而 ArrayList 大小是自动扩展的。
* Array 内置方法没有 ArrayList 多,比如 addAll、removeAll、iteration 等方法只有 ArrayList 有。
对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,
当处理固定大小的基本数据类型的时候,这种方式相对比较慢。
如何实现 Array 和 List 之间的转换?
* Array 转 List: Arrays. asList(array) ;【数组转集合】
* List 转 Array:List 的 toArray() 方法。【集合转数组】
comparable 和 comparator的区别?
* comparable接口实际上是出自java.lang包,它有一个 compareTo(Object obj)方法用来排序;
* comparator接口实际上是出自 java.util 包,它有一个compare(Object obj1, Object obj2)方法用来排序;
一般我们需要对一个集合使用自定义排序时,我们就要重写compareTo方法或compare方法,
当我们需要对某一个集合实现两种排序方式,比如一个song对象中的歌名和歌手名分别采用一种排序方法的话,
我们可以重写compareTo方法和使用自制的Comparator方法或者以两个Comparator来实现
歌名排序和歌星名排序,第二种代表我们只能使用两个参数版的Collections.sort().
Collection 和 Collections 有什么区别?
* java.util.Collection 是一个集合接口(集合类的一个顶级接口)。
它提供了对集合对象进行基本操作的通用接口方法。
Collection接口在Java 类库中有很多具体的实现。
Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式,
其直接继承接口有List与Set。
* Collections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,
用于对集合中元素进行排序、搜索以及线程安全等各种操作。
希望各位大神给作者多提一些建议,文中有错误或者不当之处,评论区里请留言,作者定会及时改正。大家喜欢的话点个赞,评论一下哇!谢谢支持!