集合
集合框架的概述
1.集合、数组都是对多个数据进行存储操作的结构,简称Java容器
说明:此时的存储,主要值得时内存层面的储存,不涉及到持久化的存储(.txt,.jpg,.avi,s数据库中的文件)。
2.1 数组在存储多个数据方面的特点:
>一旦初始化以后,其长度就确定了。
>数组一旦定义好,其元素的类型也就确定了。我们也就只能操作指型类型的数据了。
2.2 数组在存储多个数据方面的缺点:
>一旦出初始化以后,其长度就不可修改。
>获取数组实际元素的个数的需求,数组没有线程的属性后方法可用。
>数组存储数据的特点:有序,可重复,对于无需,不可重复的需求,不能满足。
>数组中提供的方法非常有限,对于添加、删除、插入数据等操作,非常不便,通俗效率不高。
集合框架
![](https://img2020.cnblogs.com/blog/1486923/202011/1486923-20201103230908954-356767545.png)
Set
一、Set:存储无序的,不可重复的数据
以HashSet为例说明:
1.无序性:不等于随机性。存储的数据在底层数组中并非按照数组索引的顺序添加,二十根据数据的哈希值添加。
2.不可重复型:保证添加的元素按照equals()判断时,不能返回true。即:相同的元素只能添加一个。
二、添加元素的过程:以HashSet为例:
我们向HashSet中添加元素a,首先调用元素a所在类的hashCode()方法,计算元素a的hash值,此哈希接着通过某种计算出在HashSet底层数组中的存放位置(即为:索引位置),判断数组在此位置上是否已经有元素:
如果此位置上没有其他元素,则元素a添加成功,
如果此位置上有其他元素b(或以链表形式存在的多个元素),则比较a与元素b的hash值:
equals()返回true,元素a添加失败
equals()返回false,则元素a添加成功
HashSet底层:数组+链表结构
Map
含义
HashMap:作为Map的主要实现类:线程不安全,效率高:存储null的key和value。
LinkedHashMap:保证在遍历map元素时,可以按照添加的顺序实现遍历。原因:在原有的HashMap底层结构基础上,添加了一对指针,指向前一个和后一个元素,对于频繁的遍历操作,此类执行效率高与HashMap。
TreeMap:保证按照添加key-value对进行排序,实现排序遍历。此时考虑key的自然排序或定制排序。底层使用红黑树。
Hashtable:作为古老的实现类;线程安全的,效率低;不能存储null的key和value
Properties:常用来处理配置文件。key和value都是String类型。
Map的结构理解:
Map中的key:无序的,不可重复的,使用Set存储1所有的key(key所在的类要重写equals()和hashCode())
Map中value:无序的可重复的,使用Collection存储所有的value(value类要重写equals()方法
Map中的Entry:无序的,不可重复的,使用Set存储所有的entry
HashMap源码中的重要常量
DEFUALT_INTIAL_CAPCITY:HashMap的默认容量,16
MAXIMUM_CAPACITY:HashMap的最大支持容量,2^30
DEFAULT_LAOD_FACTOR:HashMap的默认加载因子 默认为0.75
TYEEIFY_THRESHOLD:Bucket中链表长度大于改默认值,转化为红黑树
UNTYEEIFY_THRESHOLD:Bucket中红黑树存储的Node小于该默认值,转化为链表8
MIN_TREEIFY_CAPACITY:桶中的Node被树化时最小的hash表容量。(当桶中Node的数量大到需要变红黑树时,若hash表的容量小于MIN_TREEIFY_CAPACITY时,此时应执行resize扩容操作这个MIN_TREEIFY)CAPACITY的值至少时TREEIFY_THRESHOLD的4倍)64
table:存储元素的数组,总是2的n次幂
entrySet:存储具体元素的集
size:HashMap中存储的键值对的数量
modCount:HashMap扩容和结构改变的次数
threshold:可以容的临界值,=容量填充因子 16*0.75=12
loadFator:填充因子
TreeMap
1.向TreeMap中添加key-value,要求key必须时由同一个类创建的对象
Collections工具类
1. sort(Comparator<? super E>):void List 对集合中的元素排序。
2. reverse(List<?>):void 转集合中的元素。
3. shuffle(List<?>):void 打乱元素中的元素。
4. fill(List<? super T>,T):void用T元素替换掉集合中的所有的元素。
5. copy(List<? super T>,List<? extend T>):void 复制并覆盖相应索引的元素。
6. min/max(Collection<? extends T>):T 找到集合中最大/小的元素。
7. swap(List<?>,int,int):void交换集合中指定元素索引的位置。
8. rotate(List<?>,int):void 集合中的元素向后移m个位置,在后面被遮盖的元素循环到前面来.(负数向左移动,正数向右移动)
9. .indexOfSubList(List<?>,List<?>):int / lastIndexOfSubList(List<?>,List<?>):int 找出参数2在参数1第一次出现的位置。
10. replaceAll(List,T,T):boolean 替换成指定的元素。
11. synchronizedXxx方法 可以将某集合转化成线程安全的容器之后再使用。
12. unmodifiableCollection(Collection<? extends T>):Collection 将集合变为不可修改。
Map常用方法
V put(K key, V value)向map集合中添加Key为key,Value为value的元素,当添加成功时返回null,否则返回value。
void putAll(Map<? extends K,? extends V> m)向map集合中添加指定集合的所有元素
void clear()把map集合中所有的键值删除
boolean containsKey(Object key)检出map集合中有没有包含Key为key的元素,如果有则返回true,否则返回false。
boolean containsValue(Object value)检出map集合中有没有包含Value为value的元素,如果有则返回true,否则返回false。
Set<Map.Entry<K,V>> entrySet()返回map到一个Set集合中,以map集合中的Key=Value的形式返回到set中。
boolean equals(Object o)判断两个Set集合的元素是否相同
V get(Object key)根据map集合中元素的Key来获取相应元素的Value
int hashCode()返回map集合的哈希码值
boolean isEmpty()检出map集合中是否有元素,如果没有则返回true,如果有元素则返回false
Set<K> keySet()返回map集合中所有Key
V remove(Object key)删除Key为key值的元素
int size()返回map集合中元素个数
Collection<V> values()返回map集合中所有的Value到一个Collection集合
面试题
1.ArrayList,LinkedList,Vector三者的异同?
相同点:三个类都是实现了List接口,存储有序的,可重复的数据
不同点:ArrayList作为List接口的主要实现类,线程不安全,效率高,底层使用Object[]数组
LinkedList,对于频繁的插入,删除操作,使用此类效率比ArratList高,底层使用双向链表存储
Vector:作为List接口的古老实现类,线程安全,效率低,底层使用Object[]数组。
2.HashMap的底层实现原理?(jdk1.7)
HashMap map=new HashMap();
在实例化之后,底层创建了长度是16的以为数组Entry[] table.
map.put(key,value)....
首先,调用key所在类的hashCode()计算key的哈希值,此哈希值经过某种算法计算后,得到在Entry数组中存放位置
如果此位置上的数据不为空,(意味着此位置上存在一个或多个数据(以链表形式存在)),比较key和已存在的一个或多个数据的哈希值:
如果key的哈希值与已经存在的数据的哈希值都不相同,此时key---value添加成功
如果key的哈希值与已经存在的某一个数据的哈希值相同,则继续比较key所在类的euqals()方法,
如果equals返回false:此时key--value添加成功
如果equals返回true:使用更新已经存在的value值
在不断的添加过程中,会涉及扩容问题,默认的扩容方式为原来容量的的2倍,并将原有的数据复制过来。
jdk8中的不同
1.new HashMap():底层没有创建一个长度为16的数组
2.底层数组是Node[],而非Entry[]
3.首次使用put()方法是,底层没有创建16的数组
4.底层采用数组+链表+红黑树。
当数组的某一个索引位置以链表形式存在的数据个数>8且当前数组长度>64时,此时索引位置上的所有数据改为使用红黑树存储
3.HashMap和Hashtable的异同?
HashMapo作为Map的主要实现类:线程不安全,效率高:存储null的key和value。
Hashtable:作为古老的实现类;线程安全的,效率低;不能存储null的key和value
4.CurrentHashMap与Hashtable的异同?