前言

金三银四已经过完了,该上岸的的朋友已经上岸了,没上岸的朋友真的该好好努力准备了,赶紧刷刷面试题出去找工作。,给大家整理一份今年各大厂的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、二叉树的基本原理和遍历的方法?
  • 考察的知识点
    二叉树遍历的基本流量、二叉树的基本原理
  • 考生如何回答
    二叉树的基本概念
    简单地理解,满足以下两个条件的树就是二叉树:
  1. 本身是有序树;
  2. 树中包含的各个节点的度不能超过 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);
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 考察的知识点
    二叉树遍历的基本概念、二叉树的基本原理
  • 考生如何回答
    二叉树的基本概念
    简单地理解,满足以下两个条件的树就是二叉树:
  1. 本身是有序树;
  2. 树中包含的各个节点的度不能超过 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加密的特点:
  1. 不可逆运算
  2. 对不同的数据加密的结果是定长的32位字符(不管文件多大都一样)
  3. 对相同的数据加密,得到的结果是一样的(也就是复制)。
  4. 抗修改性 : 信息“指纹”,对原数据进行任何改动,哪怕只修改一个字节,所得到的 MD5 值都有很大区
    别.
  5. 弱抗碰撞 : 已知原数据和其 MD5 值,想找到一个具有相同 MD5 值的数据(即伪造数据)是非常困难
    的.
  6. 强抗碰撞: 想找到两个不同数据,使他们具有相同的 MD5 值,是非常困难的

写在最后


第一章 算法和数据结构面试题汇总

2024最全Android面试题及答案整理1【持续更新】_android

第二章 Java核心基础面试题汇总

2024最全Android面试题及答案整理1【持续更新】_数组_02

第三章 Java深入泛型与注解面试题汇总

2024最全Android面试题及答案整理1【持续更新】_链表_03

第四章 Java并发编程面试题汇总

2024最全Android面试题及答案整理1【持续更新】_android_04

第五章 Java虚拟机原理面试题汇总

2024最全Android面试题及答案整理1【持续更新】_数组_05

第六章 Java反射类加载与动态代理面试题汇总

2024最全Android面试题及答案整理1【持续更新】_二叉树_06

第七章 网络编程面试题汇总

2024最全Android面试题及答案整理1【持续更新】_二叉树_07

第九章 高级UI面试题汇总

2024最全Android面试题及答案整理1【持续更新】_二叉树_08

第十章 Framework内核解析面试题汇总

2024最全Android面试题及答案整理1【持续更新】_二叉树_09

第十一章 Android组件内核面试题汇总

2024最全Android面试题及答案整理1【持续更新】_链表_10

第十二章 程序性能优化与数据持久化面试题汇总

2024最全Android面试题及答案整理1【持续更新】_链表_11

第十三章 开源框架面试题汇总

2024最全Android面试题及答案整理1【持续更新】_数组_12