上面两图为网上资源,个人觉得画的很好信息量很全面,如侵权请联系我删除
2.集合框架简单理解(常见集合)单列集合
2.1.List接口的常见实现类:■ArrayList:底层是数组实现,不同步,线程不安全,相较于linkedList具有查询快, *** 作慢的特点
■linkedList:底层是链表,不同步,线程不安全,相较于ArrayList具有查询慢, *** 作快的特点
■Vector:一种老的动态数组(简单理解),线程同步,效率很低,不赞成使用
这里就牵扯到三道常问的面试题
1.ArrayList和linkedList异同
答:
1.两者都是不同步的,不保证线程安全
2.ArrayList底层为数组,linkedList使用的是双向链表
3.ArrayList查询快(数组索引的缘故),时间复杂度为O(1), *** 作(增删改慢),而linkedList查询慢,时间复杂度为O(n), *** 作快
4.ArrayList在列表尾部会预留部分空间,linkedList的空间浪费更大,因为链表的每个元素都要存放(数据以及直接前驱,直接后继)
2.ArrayList和Vector异同
答:
1.两者底层都是通过数组实现的
2.前者线程不安全,后者安全
3.两者扩容机制不同,Vector可以设置增长因子,而ArrayList不能
4.ArrayList总体高效,而Vector效率很低
3.数组和集合的区别(简单的往往容易忽视)
1.数组需要声明存储类型,集合不声明。
2.数组是静态的,一旦创建了就不能改变容量。集合可以动态扩容。
3.数组查询效率高且但 *** 作起来很麻烦,集合提供很多的成员方法, *** 作起来很方便。
4.数组只能存放一种数据类型,集合存放的类型可以是多种(不加泛型时添加的类型是Object)。
2.2.Set接口的常见实现类:■HashSet:底层结构采用哈希表实现,元素无序且唯一,效率高,但线程不安全,可存储null,要想保证元素的唯一性需要给存储的元素类型重写hashCode()和equals()两个方法。源码中,HashSet底层就是基于HashMap实现的,只有clone(),writeObject()等几个方法是其自己实现的,其余都是直接调用HashMap中的方法
■linkedHashSet:底层数据结构采用链表和哈希表共同实现,继承了HashSet的优点,链表则保证了元素的存储顺序,线程不安全,效率高。
■TreeSet:底层数据采用红黑树来实现,TreeSet会给存储的元素排序(元素唯一,要重写hashCode和equals),排序根据构造方法的不同,分为自然排序和比较器排序,两种都需要重写compareTo方法
自然排序(懒人引入lombok)
public class People implements Comparable{ private Integer id; private String name; private Integer age; @Override public int compareTo(People people) { //升序 //降序 if (this.age>people.age){ return -1; }else if(this.age 比较器排序
@Test public void t2(){ TreeSetset = new TreeSet<>(new Comparator () {//匿名内部类 @Override public int compare(Student o1, Student o2) { if (o1.getAge()>o2.getAge()) return 1; else if(o1.getAge() 2.3.单列集合(List&Set总结) 1.两者都继承了Collection接口
2.有序性:List保证按插入顺序排序,Set存储和取出顺序不一致
3.唯一性:List可以重复,Set元素唯一
4.获取元素:List通过索引直接获取,Set不能
遍历方式
1. 使用iterator()方法遍历集合,使用while循环,iter.hasNext(),iter.next()...
2.增强for循环直接遍历(常用)
3.对List:普通for循环遍历,需知道初始条件和终止条件
2.4.双列集合(key:value形式存储)双列集合
Map接口有四个比较重要的实现类,分别是HashMap、linkedHashMap、TreeMap和Hashtable
■HashMap: 采用哈希表,key无序且唯一,value可重复,非同步,线程不安全,最多只能有一个key为null
■linkedHashMap:采用链表和哈希表,特征和HashMap大致相同,但可以保证key的插入顺序
■TreeMap:采用红黑树算法,key唯一且按照指定排序进行排序,若compareTo的返回值为0,则判断key重复,分为自然排序和定制排序(排序key),TreeMap没有调优选项,因为该树总处于平衡状态
■Hashtable:采用哈希表算法,线程安全,注意Hashtable的key和value都不能为null
注意:Hashtable的方法是同步的,HashMap的方法不是同步的。这是两者最主要的区别。
遍历方式
区别及面试题我放在下文面试热题中public static void main(String[] args) { Map3.面试热题 1.ArrayList和linkedList异同(往上翻) 2.ArrayList和Vector异同(往上翻) 3.数组和集合的区别(往上翻) 4.HashMap和Hashtable区别map = new HashMap(); map.put(1, "Jordan"); map.put(2, "Kobe"); map.put(3, "Pual"); map.put(4, "Harden"); // 第一种:通过Map.keySet遍历key和value for (Integer key : map.keySet()) { System.out.println(key + ":" + map.get(key)); } // 第二种:通过Map.entrySet使用iterator遍历key和value Iterator > it = map.entrySet().iterator(); while (it.hasNext()) { Map.Entry entry = it.next(); System.out.println(entry.getKey() + ":" + entry.getValue()); } // 第三种:通过Map.entrySet遍历key和value for (Map.Entry entry : map.entrySet()) { System.out.println(entry.getKey() + ":" + entry.getValue()); } } 1.Hashtable的方法是同步的,线程安全,HashMap的方法不是同步的,线程不安全
2.Hashtable的key不允许为null,而HashMap可以
3.HashMap效率最高,Hashtable效率最低
4.如果保证线程安全,Hashtable也不太常用,会用ConcurrentHashMap(了解)
5.List,Set,Map三者的区别(从优点入手)1.List:顺序,支持快速随机查询,效率高
2.Set:唯一,去重的优点,不会有重复的元素或对象
3.Map:类似字典,通过线索找元素,不同的key可以引用相同对象,但key不能相同
6.ArrayList扩容机制(这个不太好理解,要去看源码)辅助:ArrayList扩容机制(基于jdk1.8)_烟雨星空的博客-CSDN博客_arraylist扩容机制
7.HashSet,linkedHashSet,TreeSet对比HashSet:
不能保证元素插入顺序一致,非同步,集合元素可以是null,但最多只有一个
HashSet判断两个元素相等的标准是通过equals方法比较相等,且两个对象的HashCode()返回值相等,如果要把一个对象放入HashSet中,需要重写该对象类型的equals和hashCode方法
TreeSet:(TreeSet类型是J2SE中唯一可实现自动排序的类型)
TreeSet可确保集合元素处于排序状态,其支持自然排序和定制排序两种
自然排序需要对象类型实现Comparable接口。该接口中compareTo(Object obj)方法返回一个整数值,实现了该接口的对象就可比较大小,从而排序
定制排序需使用Comparator接口,实现int compare(x,y)方法
linkedHashSet:
linkedHashSet和HashSet一样,也算根据元素的hash值来决定排序位置,但它底层用到了链表为何元素的次序,这样看起来元素像是插入顺序保存的(注意,看起来),遍历的时候就是插入时候的顺序
8.linkedHashMap和HashMap,TreeMap对比HashMap:
最常用的Map集合,单列集合根据元素的Hash值来存储元素,HashMap则是根据key的hash值存储,访问速度很快,遍历时数据顺序随机
linkedHashMap:
和HashMap很像,只不过其底层的链表会保存插入顺序,通常情况下遍历要比HashMap慢
特殊:当HashMap容量很大,实际数据少,遍历起来要比linkedHashMap慢些,因为linkedHashMap的遍历速度只和实际数据有关,和容量无关,HashMap和容量有关(这里还是卷些为好)
TreeMap:
参考TreeSet,TreeMap采用红黑树算法,可以将保存的数据根据key排序, 默认按照key键的升序排列,注意这里是遍历出来的元素是排好序的(好好理解)
9.HashSet如何检查重复这里要简单说下过程,当添加元素的时候,HashSet会先根据对象的hash值来判断有没有和别的元素相同,如果没有则可以加入,这里根据hash值也会判断加入的位置。如何发现hash值一致的对象,这时就要调用equals方法来检查对象是否真的相同,如果相同则不会添加
可以理解为两次筛选
10.HashMap底层实现这个依旧是个很复杂的问题,需要自己去看去理解源码
在这里做些总结可以记住,以后有时间再去理解源码
底层原理:HashMap是由数组+链表组成,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的。HashMap综合了数组和链表的优点,即寻址容易修改也容易.
相关问题:
1.负载因子 0.75,即当数组元素个数达到数组容量的75%进行扩容
2.为什么设为0.75 太小会造成空间浪费,太大会造成hash冲突过多,尽可能找黄金值
3.数组默认初始长度为16
4.每次扩容都是都是2倍,(个人理解)因为计算机底层是2进制数据,2的n次方可以减少hash冲突
5.什么时候结构变成红黑树? 链表长度>=8且hash表中的元素>=64(元素个数<64扩容)
6.什么是hash冲突 添加元素的时候,key的hash值一样
7.怎么解决hash冲突 ? 用链表或者红黑树
11.comparable和Comparator的区别comparable出自java.lang包 它有一个 compareTo(Object obj)方法用来排序
comparator出自 java.util 包它有一个compare(Object obj1, Object obj2)方法用来排序
集合框架原本就是面试中的高频热点,集合种类繁多,知识点琐碎,面试问题多,本篇只是列举了一些,还希望各位不要忽视基础,多下功夫,多拿salary
生活原本艰难,希望学习能简单一些,一篇简单总结希望能帮到你们
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)