阿里面试-阿里云开发者社区

开发者社区> code_xzh> 正文

阿里面试

简介: 阿里面试主要问的是一些原理性的东西,比如HashMap实现原理,线程间通讯,线程间数据共享,android对java在哪些方法上 有优化,android的异步任务是怎么实现的等等,接下来我们一一讲解。 1,HashMap实现原理,HashMap是不是有序的,如果不是,那么有没有实现Map的子类? 首先说下java语音的,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),
+关注继续查看

阿里面试主要问的是一些原理性的东西,比如HashMap实现原理,线程间通讯,线程间数据共享,android对java在哪些方法上 有优化,android的异步任务是怎么实现的等等,接下来我们一一讲解。


1,HashMap实现原理,HashMap是不是有序的,如果不是,那么有没有实现Map的子类?

首先说下java语音的,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,所以HaspMap底层实现是以数组的方式实现的,如果想深入了解里面的实现,请访问下面的链接http://blog.csdn.net/xiangzhihong8/article/details/51094318。

HaspMap不是有序的,那么有没有Map的实现类是有序的呢?有,比如我们常用的TreeMap和LinkHashMap,s首先说下TreeMap吧,TreeMap<String, String> 需要重写里面一个方法compare(String o1, String o2),这里返回的是一个经过比较了大小的有序数组;LinkHashMap看名字意思就是有一个链表的,肯定是有序的,实际上

LinkedHashMap内部维持了一个双向链表,可以保持顺序。有兴趣的可以自己写一个小Demo.


2,在Android子线程中初始化handler后,为什么该子线程也能更新UI

答:首先明确在子线程是没办法更新UI线程的视图的。


3.在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存)。

关于中位数:数据排序后,位置在最中间的数值。即将数据分成两部分,一部分大于该数值,一部分小于该数值。中位数的位置:当样本数为奇数时,中位数=(N+1)/2 ; 当样本数为偶数时,中位数为N/2与1+N/2的均值(那么10G个数的中位数,就第5G大的数与第5G+1大的数的均值了)。

解法:

(1)根据整数二进制数高12位取值, 对10G个文件进行分割, 分割成2的12次方(4096)个文件, 每个文件大约有2.5M个整数。

(2)因为4096个文件按整数高12位分割的, 所以文件间是有序的, 例如高12位为0000 0000 0000的文件里的数字是所有数字里最小的, 高12位为 0000 0000 0001的文件中的数字是所有数字中相对次小的。

(3)以此按从小到大的顺序对文件中数字的个数进行统计, 分别记为x1, x2, ..., xk..., 直到某个文件i使x1+x2+...+xi和大于5G结束, 中位数就在这个文件中。然后对这个文件进行处理。

(4)第i个文件中, 大约有2.5M个数字, 取值有1M个,遍历文件对1M个数字出现的次数进行统计。

(5)对1M个取值, 按照从小到大进行加和, 第一个使总和到达5G的数字就是中位数。


4,java的多线程直接怎么通讯的?

java的线程通讯无外乎用到了Thead.wait()和notify()等,那么无聊的人肯定会问你了,这wait(),sleep(),等常用方法的区别了,其实也就是线程的阻塞,就绪,运行等,有兴趣的可以好好去查查相关的文章。


5,接下来是算法题,有一个一位数组,数组的长度很大,然后里面有唯一的两个数相等的,问你用最快的算法实现去找到这两个数及所在数组的位置。


6,说说Thead的sleep和wait的区别

sleep(100L):占用CPU,线程休眠100毫秒
wait(100L):不占用CPU,线程等待100毫秒


7,缓存策略,LruCache和DiskLruCache原理。

这个比较坑,一时半会也说不清楚,对于LruCache的原理我们可以去看系统给我们的提供的类LruCache<K, V>,

LruCache使用一个LinkedHashMap简单的实现内存的缓存,没有软引用,都是强引用。如果添加的数据大于设置的最大值,就删除最先缓存的数据来调整内存。他的主要原理在trimToSize方法中。

maxSize是通过构造方法初始化的值,他表示这个缓存能缓存的最大值是多少。

size在添加和移除缓存都被更新值,他通过safeSizeOf这个方法更新值。safeSizeOf默认返回1,但一般我们会根据maxSize重写这个方法,比如认为maxSize代表是KB的话,那么就以KB为单位返回该项所占的内存大小。

然后你只要按着这个思路说,就好了

DiskLruCache意思是磁盘缓存,就是将网络的数据缓存到磁盘,这个用的比较多的就是我们的第三方缓存策略库了,

其实DiskLruCache并没有限制数据的缓存位置,可以自由地进行设定,但是通常情况下多数应用程序都会将缓存的位置选择为 /sdcard/Android/data/<application package>/cache 这个路径。选择在这个位置有两点好处:第一,这是存储在SD卡上的,因此即使缓存再多的数据也不会对手机的内置存储空间有任何影响,只要SD卡空间足够就行。第二,这个路径被Android系统认定为应用程序的缓存路径,当程序被卸载的时候,这里的数据也会一起被清除掉,这样就不会出现删除程序之后手机上还有很多残留数据的问题。


8,Android Handler leak 分析及解决办法

在Android中,Handler类应该是静态的,否则,可能发生泄漏。在应用程序线程的MessageQueue中排队的Message对象 还保留他们的目标Handler。所以,如果我们如果在一个类的内部使用Handler,应将它设置为static

为了避免泄漏外部类,声明一个Handler子类为静态内部类(注:这样就避免了Handler对象对外部类实例的自动引用),其内部持有一个对外部类对象的WeakReference。

那么什么情况下容易造成Handler leak 呢?(1) 排队中的Message对象对Handler的持有导致泄漏;(2)Handler对象对外部类(如Activity或Service)实例的强引用持 有。

 static class MyHandler extends Handler {
        private WeakReference<MyActivity> mOuter;
        public MyHandler(MyActivity activity) {
            mOuter = new WeakReference<MyActivity>(activity);
        }
    }


9.说说你在常用开发中,用到设计模式。
大家可以点击链接:23种设计模式

10,hashmap的实现原理。

   简单说一些,hashmap是通过哈希表实现的,HashMap里面实现一个静态内部类Entry,里面有三个重要的属性 key , value, next,从属性key,value我们就能很明显的看出来Entry就是HashMap键值对实现的一个基础bean,我们上面说到HashMap的基础就是一个线性数组,这个数组就是Entry[],Map里面的内容都保存在Entry[]里面。

有需要的可以点击链接:hashmap源码分析


11,HashMap会在什么什么情况下出现性能问题?


12,HashTable和CocurrentHashMap的区别?

hashtable是做了同步的,hashmap未考虑同步。所以hashmap在单线程情况下效率较高。hashtable在的多线程情况下,同步操作能保证程序执行的正确性。

CocurrentHashMap是hashtable和hashmap的综合实现,ConcurrentHashMap锁的方式是稍微细粒度的。具体请看: cocurrentHashMap


13.Volatile和Sychronized的区别


14,知道JVM的分区么?


15.Android中的线程池使用过哪些,介绍一下?回答用过AsyncTask,追问AsyncTask的内部机制是什么?


16 能描述一下Android的启动过程么?

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
怎么设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程
6366 0
阿里云服务器ECS远程登录用户名密码查询方法
阿里云服务器ECS远程连接登录输入用户名和密码,阿里云没有默认密码,如果购买时没设置需要先重置实例密码,Windows用户名是administrator,Linux账号是root,阿小云来详细说下阿里云服务器远程登录连接用户名和密码查询方法
2178 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
3959 0
windows server 2008阿里云ECS服务器安全设置
最近我们Sinesafe安全公司在为客户使用阿里云ecs服务器做安全的过程中,发现服务器基础安全性都没有做。为了为站长们提供更加有效的安全基础解决方案,我们Sinesafe将对阿里云服务器win2008 系统进行基础安全部署实战过程! 比较重要的几部分 1.
4964 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
10716 0
腾讯云服务器 设置ngxin + fastdfs +tomcat 开机自启动
在tomcat中新建一个可以启动的 .sh 脚本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk7 export PATH=$JAVA_HOME/bin/:$PATH export CLASSPATH=.
2004 0
+关注
code_xzh
对前端移动客户端技术比较擅长。著有《React Native移动开发实战》和《Kotlin入门与实战》和《Weex跨平台实战》,《React Native移动开发进阶》即将出版,正在努力完成《Flutter跨平台开发实战》
716
文章
1
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载