集合
1.什么是集合?
集合就是一个存储数据的容器,准确来说就是放数据对象的引用的容器。
2.集合和数组的区别?
1.集合长度是可变的,数组长度不可变
2.集合可以存储不同的数据类型的引用,不能存储基本数据类型。数组只能存储相同数据类型的数据,数据类型可以是基本数据类型,也可以是引用数据类型。
3.集合分为几类?
分为两个接口:1.collection 2.Map
4.什么是collection?
collection就是一个集合的根接口。
5.collection接口的子接口有哪些?
List接口
set接口
6.List集合
6.List的特点:
集合中的元素允许重复
集合中的元素是有序的,各元素插入的顺序就是各元素的顺序
集合中的元素都是通过索引来访问或者设置的
6.List接口有哪些?
ArrayList:
底层是数组,通过索引来取值,存值
遍历方式一共有3种:
1.for循环
2.foreach循环
3.迭代器
优点:
随机查找和遍历快
缺点:
插入和删除慢
LinkedList:
Vector:
7.Map集合
HashMap:
7.1什么是hashmap
HashMap是一个用于存储Key-Value键值对的集合,每一个键值对也叫做Entry。这些键值对分散存储在一个数组当中,这个数组就是HashMap的主干,HashMap数组每一个元素的初始值都是Null,我们常用的两个方法是Get 和 Put。
数组:存储区间是连续的,占用内存严重,故空间复杂的很大。但数组的二分查找时间复杂度小,为O(1);寻址容易,插入和删除困难;
链表:单向链表是一种线性表,实际上是由节点(Node)组成的,一个链表拥有不定数量的节点。其数据在内存中存储是不连续的,它存储的数据分散在内存中,每个结点只能也只有它能知道下一个结点的存储位置。由N各节点(Node)组成单向链表,每一个Node记录本Node的数据及下一个Node。向外暴露的只有一个头节点(Head),我们对链表的所有操作,都是直接或者间接地通过其头节点来进行的。
查看hashMap的API发现,它有4个构造函数:
1、构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空 HashMap。
2、指定初始容量和默认加载因子 (0.75) 的空 HashMap。
3、指定初始容量和默认加载因子的空HashMap。
4、构造一个映射关系与指定Map相同的新HashMap。
注意:HashMap使用的是懒加载,构造完HashMap对象后,只要不进行put方法插入元素之前,HashMap并不会去初始化或者扩容table。
首先判断是否是空数组(table == EMPTY_TABLE),如果是,开始初始化HashMap的table数据结构,然后执行扩容函数,如果未指定容量,默认是大小为16的表,然后根据加载因子计算临界值。什么是加载因子呢?hashMap的大小是一定的,如果不够存储了肯定要扩容,那么扩容的依据是什么呢,什么时候确定要扩容了呢?这个时候就需要引入加载因子这个概念,我们假使依旧使用默认大小16,加载因子0.75,那么当hashMap的size大于12(16*0.75=12)的时候,那么就会进行扩容。
回来说put方法,如果key是null,调用putForNullKey方法,保存null与key,这是HashMap允许为null的原因。然后计算hash值和用indexFor计算数据存在的位置,然后从i出开始迭代e,找到 key 保存的位置。
应用场景:
Map应用:
错误代码及其描述的映射。
邮政编码和城市map。
经理和员工的map。每个经理(关键)都与他管理的员工(价值)列表相关联。
课程和学生的map。每个班级(关键)都与学生名单(价值)相关联。
hashMap的应用:
Map中,HashMap具有超高的访问速度,如果我们只是在Map 中插入、删除和定位元素,而无关线程安全或者同步问题,HashMap 是最好的选择。
如果考虑线程安全或者写入速度的话,可以使用HashTable
如果想要按照存入数据先入先出的进行读取。 那么使用LinkedHashMap
如果需要让Map按照key进行升序或者降序排序,那就用TreeMap
hashmap是可以存放key和value均为null的,存放在table[0]的位置,此时使用put方法在添加元素的时候,如果在table[0]中已经存入key为null的元素则给null赋上新的value值并返回后面的值,否则则初始化null的元素,存入put里面存放的值。
TreeMap:
TreeMap实现0接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。
LinkedHashMap
LinkedHashMap是Map中常用的有序的两种实现之一, 它保存了记录的插入顺序,先进先出。
对于LinkedHashMap而言,它继承与HashMap,底层使用哈希表与双向链表来保存所有元素。其基本操作与父类HashMap相似,它通过重写父类相关的方法,来实现自己的链接列表特性。LinkedHashMap采用的hash算法和HashMap相同,但是它重新定义了数组中保存的元素Entry,该Entry除了保存当前对象的引用外,还保存了其上一个元素before和下一个元素after的引用,从而在哈希表的基础上又构成了双向链接列表
hash
has翻译为散列,音译为哈希,就是把任意长度的输入,通过散列算法,变成固定长度的输出,输出的就是散列值。