前言
金三银四已经过完了,该上岸的的朋友已经上岸了,没上岸的朋友真的该好好努力准备了,赶紧刷刷面试题出去找工作。,给大家整理一份今年各大厂的Android面试题,有需要的朋友可以收藏了
算法和数据结构面试题汇总
1.1 请说一说HashMap,SparseArrary原理,SparseArrary相比HashMap的优点、ConcurrentHashMap如何实现线程安全?
- 这道题想考察什么?
1、HashMap,SparseArrary基础原理?
2、SparseArrary相比HashMap的优点是什么?
3、ConcurrentHashMap如何实现线程安全? - 考察的知识点
HashMap,SparseArrary、ConcurrentHashMap - 考生如何回答
HashMap和SparseArray,都是用来存储Key-value类型的数据。 - SparseArray和HashMap的区别:
双数组、删除O(1)、二分查找
数据结构方面:hashmap用的是链表。sparsearray用的是双数组。
性能方面:hashmap是默认16个长度,会自动装箱。如果key是int 的话,hashmap要先封装成
Interger。sparseArray的话就就会直接转成int。所以spaseArray用的限制是key是int。数据量小
于1k。如果key不是int小于1000的话。可以用Arraymap。 - HashMap的基本原理
HashMap内部是使用一个默认容量为16的数组来存储数据的,而数组中每一个元素却又是一个链表的头
结点,所以,更准确的来说,HashMap内部存储结构是使用哈希表的拉链结构(数组+链表)
1.2 请说一说HashMap原理,存取过程,为什么用红黑树,红黑树与完全二叉树对比,HashTab、concurrentHashMap,concurrent包里有啥?
- 这道题考察什么
1、HashMap,HashTab基础原理?
2、ConcurrentHashMap相比HashMap的优点是什么?
3、Concurrent包里面有什么样的的函数? - 考察的知识点
HashMap,HashTab、ConcurrentHashMap - 考生如何回答
HashMap的原理
HashMap内部是使用一个默认容量为16的数组来存储数据的,而数组中每一个元素却又是一个链表的头
结点,所以,更准确的来说,HashMap内部存储结构是使用哈希表的拉链结构(数组+链表)。
1.3 请说一说hashmap put()底层原理,发生冲突时,如何去添加(顺着链表去遍历,挨个比较key值是否一致,如果一致,就覆盖替换,不一致遍历结束后,插入该位置) ?
- 这道题想考察什么?
1、Hashmap的put函数基础原理? - 考察的知识点
HashMap底层的源码 - 考生如何回答
- 思路如下:
对key的hashCode()进行hash后计算数组下标index;
如果当前数组table为null,进行resize()初始化;
如果没碰撞直接放到对应下标的bucket里;
如果碰撞了,且节点已经存在,就替换掉 value;
如果碰撞后发现为树结构,挂载到树上。
如果碰撞后为链表,添加到链表尾,并判断链表如果过长(大于等于TREEIFY_THRESHOLD,默认8),就把链表转换成树结构;
数据put后,如果数据量超过threshold,就要resize。
1.4 请说一说ArrayList 如何保证线程安全,除了加关键字的方式 ?
- 这道题想考察什么?
1、ArrayList的底层原理? - 考察的知识点
ArrayList底层的源码的理解 - 考生如何回答
ArrayList 如何保证线程安全
继承Arraylist,然后重写或按需求编写自己的方法,这些方法要写成synchronized,在这些
synchronized的方法中调用ArrayList的方法。
可以使用Collections.synchronizedList()这个函数
1.5 请说一说ArrayList、HashMap、LinkedHashMap ?
- 这道题想考察什么?
1、ArrayList、HashMap和LinkedHashMap的底层原理? - 考察的知识点
ArrayList、HashMap、LinkedHashMap的源码的理解 - 考生如何回答
- ArrayList
ArrayList:底层结构是一个数组,初始长度为10 容量不足时,扩展为原来的1.5倍也就是扩展为15
ArrayList底层是一个双向链表,好处是不用扩容,坏处是当你要寻找第N个元素时,实践复杂度为O(n),
就是遍历N个元素去找到他 而ArrayList的时间复杂度是 O(1)
List:元素有序 有序值的是在内存中存放,可重复 - HashMap
底层结构是 一个元素为链表的数组 , 虽然是数组 但是是无序插入数组的。根据哈希值来插入。
当hash相同则需要用到链表结构 , 把新插入的但 hashcode值相同的 链在之前插入的后面形成链表,
当连得太多 就会形成红黑树,新加入的元素形成连头,第一存放在位置上的就成链尾 - LinkedHashMap
底层是一个元素为链表的数组 + 元素之间的形成的双向链表 , 即是单向链表形成的双向链表。 双向链
表维护元素的次序,这样使得元素看起来是以插入的顺序保存的。也就是说,当遍历LinkedHashSet集
合里元素时,HashSet将会按元素的添加顺序来访问集合里的元素,因此LinkedHashSet可以保证元素
按插入顺序输出。
1.6 请说一说HashMap实现原理,扩容的条件,链表转红黑树的条件是什么 ?
- 这道题想考察什么?
1、HashMap的底层原理?
2、HashMap的扩容条件以及链表转换红黑树的条件 - 考察的知识点
HashMap原理、HashMap扩容条件的理解 - 考生如何回答
HashMap实现原理
HashMap内部是使用一个默认容量为16的数组来存储数据的,而数组中每一个元素却又是一个链表的头
结点,所以,更准确的来说,HashMap内部存储结构是使用哈希表的拉链结构(数组+链表)
1.7 请说一说二叉树遍历步骤?
- 这道题想考察什么?
1、二叉树的基本原理和遍历的方法? - 考察的知识点
二叉树遍历的基本流量、二叉树的基本原理 - 考生如何回答
二叉树的基本概念
简单地理解,满足以下两个条件的树就是二叉树:
- 本身是有序树;
- 树中包含的各个节点的度不能超过 2,即只能是 0、1 或者 2;
1.8采用递归和非递归对二叉树进行遍历?
-这道题想考察什么?
1、二叉树的基本原理和遍历的方法?
//filename: BinTreeNode.h
template <typename T>
void travPre_R(BinTreeNode<T> * root) {//二叉树先序遍历算法(递归版)
if (!root) return;
cout << root->data;
travPre_R(root->LeftChild);
travPre_R(root->RightChild);
}
template <typename T>
void travIn_R(BinTreeNode<T> * root) {//二叉树先序遍历算法(递归版)
if (!root)
return;
travPre_R(root->LeftChild);
cout << root->data;
travPre_R(root->RightChild);
}
- 考察的知识点
二叉树遍历的基本概念、二叉树的基本原理 - 考生如何回答
二叉树的基本概念
简单地理解,满足以下两个条件的树就是二叉树:
- 本身是有序树;
- 树中包含的各个节点的度不能超过 2,即只能是 0、1 或者 2;
1.9对称和非对称加密,MD5的原理?
- 这道题想考察什么?
1、对称和非对称加密算法的原理?
2、MD5的基本的概念和原理? - 考察的知识点
MD5算法原理、对称和非对称加密算法 - 考生如何回答
对称和非对称加密算法的基本概念
对称加密和非对称加密的基本概念
1.10MD5的基本概念
- MD5的基本概念
MD5加密
MD5本身是一个128位的0/1比特。一般被表示为16进制的字符串。4个比特位组成一个16进制字符,因
此常常能见到的是(128/4=)32个16进制字符组成的字符串 4951 dd1c bff8 cbbe 4cd4 475c a939
fc8b,当然它实质是一种消息摘要算法。 - MD5加密的特点:
- 不可逆运算
- 对不同的数据加密的结果是定长的32位字符(不管文件多大都一样)
- 对相同的数据加密,得到的结果是一样的(也就是复制)。
- 抗修改性 : 信息“指纹”,对原数据进行任何改动,哪怕只修改一个字节,所得到的 MD5 值都有很大区
别. - 弱抗碰撞 : 已知原数据和其 MD5 值,想找到一个具有相同 MD5 值的数据(即伪造数据)是非常困难
的. - 强抗碰撞: 想找到两个不同数据,使他们具有相同的 MD5 值,是非常困难的
写在最后
每一章节都是站在企业考察思维出发,作为招聘者角度回答。从考察问题延展到考察知识点,再到如何优雅回答一面俱全,可以说是求职面试的必备宝典,每一部分都有上百页内容,接下来具体展示,完整版可直接下方扫码领取。