昨天面试了一家非常棒的互联网产品公司,聊得很不错,不过技术上有几个问题没回答出来或者答得不够好,所以特地记录下:
- Java 中堆内存和栈内存的区别
- Serilzable 和 Parcelable 的区别
- 笔试有一个 HashMap 迭代的问题,以前看过,记不清了,用得比较少
- Android 性能优化的方式
- 弱引用概念:我实际上这块比较熟,但表达的不太清楚
- ListView 实现原理(源码)
堆和栈
Java 把内存分成两种,一种叫做栈内存,一种叫做堆内存,这两个区别用通俗的话来说,或者说在面试的时候简单说可以说:
堆主要用来存放对象的,栈主要是用来执行程序的
在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。堆内存用于存放由new创建的对象和数组。
参考地址:http://www.cnblogs.com/whgw/archive/2011/09/29/2194997.html
Serilzable 和 Parcelable
为什么要将对象序列化?
- 永久性保存对象,保存对象的字节序列到本地文件中;
- 用过序列化对象在网络中传递对象;
- 通过序列化对象在进程间传递对象。
实现 Serializable接 口
Serializable
的作用是将数据对象存入字节流当中,在需要时重新生成对象,主要应用是利用外部存储设备保存对象状态,以及通过网络传输对象等。
implements Serializable
接口的的作用就是给对象打了一个标记,系统会自动将其序列化。
实现Parcelable接口
为什么要实现Parfcelable
接口来实现在Intent
中传递对象?
- 在使用内存的时候,
Parcelable
比Serializable
性能高,所以推荐使用Parcelable
类。 Serializable
在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
注意:
Parcelable
不能使用在将数据存储在磁盘上的情况,因为Parcelable
不能很好的保存数据的持续性在外界有变化的情况下。因此在这种情况下,建议使用Serializable
Android中的新的序列化机制
在 Android 系统中,针对内存受限的移动设备,因此对性能要求更高,Android 系统采用了新的 IPC (进程间通信)机制,要求使用性能更出色的对象传输方式。因此Parcel
类被设计出来,其定位就是轻量级的高效的对象序列化和反序列化机制。
Parcel
的序列化和反序列化的读写全是在内存中进行,所以效率比JAVA序列化中使用外部存储器会高很多。
参考地址:http://lydia-fly.iteye.com/blog/2029269
HashMap迭代
HashMap<String, String> emails = new HashMap<String, String>();
//方法一: 用entrySet()
Iterator it = emails.entrySet().iterator();
while(it.hasNext()){
Map.Entry m=(Map.Entry)it.next();
System.out.println("email-" + m.getKey() + ":" + m.getValue());
}
// 方法二:直接再循环中
for (Map.Entry<String, String> m : emails.entrySet()) {
System.out.println("email-" + m.getKey() + ":" + m.getValue());
}
// 方法三:用keySet()
Iterator it = emails.keySet().iterator();
while (it.hasNext()){
String key=(String)it.next();
System.out.println("email-" + key + ":" + emails.get(key));
}
不过这样看当时写出了方法一和方法三,太久没用过了,写出来也不够自信。
Android性能优化
实际上每次被问到这种问题都感觉范围很大,很多东西都想说,很容易乱,实际上像 OOM 这样的内存优化,流量,Bitmap 缓存,甚至是一些对象的复用,都算这样的优化。
一篇总结的比较好的博文:http://blog.csdn.net/hewence1/article/details/39004301
弱引用
我在项目中,WebViewActivity 中的 Handler 是通过弱引用来获取 activity 实例对象的,用弱引用主要是为了防止一些对象之间生命周期不同步的问题,有些短生命周期的对象持有一个不容易被回收的对象,当短周期对象需要销毁时,就会造成内存泄漏。只具有弱引用的对象拥有更短暂的生命周期。
博文地址:http://zhangjunhd.blog.51cto.com/113473/53092/
ListView实现原理(源码)
好吧,被问到这个问题的时候,我内心是崩溃的。。因为这源码,你看过就看过,没看过那实在是编不出来,当时只能回答说根据自己理解的一种实现方式。
我当时头脑风暴了下,就说猜测是通过继承 ViewGroup 然后通过重写 onLayout 实现一种纵向布局,并使用 UNSPECIFIED 测量模式,实现一种类似 ScrollView 的布局。然后就被质问,这样不会很卡吗。。不过我当时只能想到这么多了,只能坦诚的确没看过这方面代码。
好吧,guolin 大神的源码分析地址:http://blog.csdn.net/guolin_blog/article/details/44996879
So , read the fucking code….
这次面试公司是我面试这么多家以来最棒的一家,可以用酷来形容,Android 的负责人非常年轻,不仅技术厉害,而且人也是特别好,综合能力很强,和他聊了很多,从个人的职业规划到企业的发展以及企业的文化氛围,总体感觉这家公司非常有活力,是我一直以来向往的工作状态。还是非常期待能得到 Offer的!