前言
最近一位知名大厂的Android技术主管,跟我透露了他们公司的18道超难的Android面试题,有些题小编看了都觉得很刁钻。
今天小编给大家来做个剧透,你也可以对应看一下,你能回答出来几题?
下面有面试题答案,但是我的建议是先自己思考一下,将自己的答案记下来,再去看答案,对比一下有没有出入,这样就能知道自己的不足在哪里。
1、请说一说HashMap原理,存取过程,为什么用红黑树,红黑树与完全二叉树对比,HashTab、concurrentHashMap,concurrent包里有啥?2、如何开启一个线程,开启大量线程会有什么问题,如何优化? 3、GC的流程是怎么样的?介绍下GC回收机制与分代回收策略4、Android中多进程通信的方式有哪些? 5、为什么 Android 要采用 Binder 作为 IPC 机制?6、Binder线程池的工作过程是什么样? 7、ThreadLocal的原理,以及在Looper是如何应用的?8、handler.post(Runnable) runnable是如何执行的? 9、Android 系统启动流程10、Zygote进程的启动流程 11、Intent的原理,作用,可以传递哪些类型的参数? 12、打开页面,如何实现一键退出?13、startActivity(MainActivity.this,LoginActivity.class); LoginActivity配置的launchMode是何时解析的? 14、Acitvity的生命周期,如何摧毁一个Activity?15、谈谈OkHttp框架的原理 16、 app对内存是如何限制的? 应该如何合理使用内存? 17、谈谈你对TCP 流量控制与拥塞控制的理解18、WindowMangerService中token到底是什么?token的存在意义是什么?
1、请说一说HashMap原理,存取过程,为什么用红黑树,红黑树与完全二叉树对比,HashTab、concurrentHashMap,concurrent包里有啥?
这道题想考察什么?
1、HashMap,HashTab基础原理?
2、ConcurrentHashMap相比HashMap的优点是什么?
3、Concurrent包里面有什么样的的函数?
考察的知识点
HashMap,HashTab、ConcurrentHashMap
考生如何回答
HashMap的原理
HashMap内部是使用一个默认容量为16的数组来存储数据的,而数组中每一个元素却又是一个链表的头结点,所以,更准确的来说,HashMap内部存储结构是使用哈希表的拉链结构(数组+链表)。
HashMap中默认的存储大小就是一个容量为16的数组,所以当我们创建出一个HashMap对象时,即使里面没有任何元素,也要分别一块内存空间给它,而且,我们再不断的向HashMap里put数据时,当达到一定的容量限制时,HashMap就会自动扩容。
HashTab的原理
哈希表(Hash table,也叫散列表), 是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
哈希表hash table(key,value) 就是把Key通过一个固定的算法函数既所谓的哈希函数转换成一个整型数字,然后就将该数字对数组长度进行取余,取余结果就当作数组的下标,将value存储在以该数字为下标的数组空间里。而当使用哈希表进行查询的时候,就是再次使用哈希函数将key转换为对应的数组下标,并定位到该空间获取value,如此一来,就可以充分利用到数组的定位性能进行数据定位。
在使用的时候,有以下几种方式:
- Hashtable 是一个散列表,它存储的内容是键值对(key-value)映射。
- Hashtable 继承于Dictionary,实现了Map、Cloneable、java.io.Serializable接口。
- Hashtable 的函数都是同步的,这意味着它是线程安全的。它的key、value都不可以为null。
HashMap为什么要用红黑树?红黑树相对完全二叉树有有什么优点?
我们来看看红黑树的主要特性:
- 每个节点都带有颜色属性(颜色为红或黑)的平衡二叉查找树。
- 节点是红色或黑色。
- 根节点是黑色。
- 所有叶子结点都是黑色。
- 每个红色节点必须有两个黑色的子节点(从每个叶子到根的所有路径上不能有两个连续的红色节点)。
- 从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。
完全二叉树
如果二叉树中除去最后一层节点为满二叉树,且最后一层的结点依次从左到右分布,则此二叉树被称为完全二叉树。
红黑树是平衡二叉树的一种,插入时遵循二叉树“左右”定律,
该父节点的左子节点:为小于父节点中且子树中最接近父节点值得数。
该父节点的右子节点:为大于父节点中且子树中最接近父节点值得数。
Concurrent包里面有什么
ConcorrenctHashMap:将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问ConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成,Segment是一种可重入锁ReentrantLock。
CopyOnWriteArrayList:CopyOnWrite并发容器用于读多写少的并发场景,线程安全的写时复制。
ReentrantLock:效果和synchronized一样,都可以同步执行,lock方法获得锁,unlock方法释放锁。ReetrantLockqubie添加了类似锁投票、定时锁等候和可中断锁等候的一些特性争用下的 ReentrantLock 实现更具可伸缩性。ReentrantLock支持公平锁,同一个线程可以多次获取同一把锁。ReentrantLock和synchronized都是可重入锁。
CountDownLatch:CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。
Semaphore:它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。Semaphore可以控制某个资源可被同时访问的个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可实现对资源的保护。
Future:Callable接口可以看作是Runnable接口的补充,call方法带有返回值,并且可以抛出异常。runnable接口实现的没有返回值的并发编程。
CyclicBarrier:这个类是一个同步工具类,它允许一组线程在到达某个栅栏点(common barrier point)互相等待,发生阻塞,直到最后一个线程到达栅栏点,栅栏才会打开,处于阻塞状态的线程恢复继续执行。它非常适用于一组线程之间必需经常互相等待的情况。
由于文章篇幅有限,不能将完整面试题的答案展示出来,不过没有关系,我已经整理好,除此之外,还整理了近两年各种大厂的常见高频面试题,有需要的小伙伴,可以点击下方课程链接详细了解!!!
https://edu.51cto.com/course/32703.html
第一章 算法和数据结构面试题汇总
第二章 Java核心基础面试题汇总
第三章 Java深入泛型与注解面试题汇总
第四章 Java并发编程面试题汇总
第五章 Java虚拟机原理面试题汇总
第六章 Java反射类加载与动态代理面试题汇总
第七章 网络编程面试题汇总
第九章 高级UI面试题汇总
第十章 Framework内核解析面试题汇总
第十一章 Android组件内核面试题汇总
第十二章 程序性能优化与数据持久化面试题汇总
第十三章 开源框架面试题汇总
有需要的小伙伴,可以点击下方课程链接详细了解!!!
https://edu.51cto.com/course/32703.html
标签:面试题,HashMap,18,汇总,线程,二叉树,Android,节点 From: https://blog.51cto.com/u_16163453/8174961