2017年总结

闲谈

有些时候真的不得不佩服有一些人真的是牛逼,跟我同事对比才发现人家看了编程思想是真的读懂了,我看了编程思想是看了一遍。最近问了他一些问题感觉他都能对答如流,想各种解决方案,不禁感觉自己书是不是白看了。最近重新把java编程思想拿起来看,才发现有很多以前没注意到的细节。书确实要多读,一遍没读透就读两遍,三遍。再困难也不要忘了提升自己!!

反思

这边其实更多的是对去年的反思吧,感觉很多时候基本都是要打脸之后才能明白自己所处的位置。在经过了一轮简历的投递和内推之后发现自己并没有特别多的优势,基本上全军覆没了,连面试机会都没有,这里分析一下问题根本原因,现在Android开发真的是烂大街,作为一个两年工作经验的,想找一份好的工作真的很难。去年一整年也基本没有太大的提升,仅仅是把重复工作做的更加熟练而已,所以也思考出自身的一些问题和解决方案。

问题

  1. 大厂基本都直接校招,社招的要求基本很严格。
  2. 小公司大部分技术不成熟,很多时候一个人要做很多的活,接触的面虽然广,但是不精,这个其实就跟做重复工作没什么区别了。
  3. 个人上跳槽频繁,让HR觉得稳定性不高。
  4. 技术并不是过硬,虽有博客github,并没有多大优势。

解决方案

  1. 了解一线大厂需求,充实简历
  2. 小公司尽量避免不去了。
  3. 找一家的公司稳定待个几年。
  4. 技术充实,每个月一篇博客,每天坚持github push开源
  5. 打好扎实的java基础,多线程编程,网络编程思想,内存管理,java虚拟机

以上!!


2018-03-17 00:44:37

那个…. 找到简历没回复的原因了,个人简历都忘了填联系方式了。一个朋友帮我内推的时候发现的。艾玛,果然本命年!!

2018年3月22日 22:52:52

思考了一下最近面试的一些问题(没回答好的)。

1.如何优化页面加载

在这边其实我一直在View层面考虑这个问题
回答了一些点,比如
1.减少View的层级,尽量不使用背景
2.List中复用View
3.自定义控件开硬件加速(- -!!然后被问了硬件加速原理,呃,这边其实就是想让你知道GPU可以加速绘制)还是没有回答到点,然后面试官引导了一下我,ListView的加载卡顿怎么办。
4.一想就是把耗时操作写到线程中去(还是没get到点)
5.等到滑动结束后再做加载(还是没get到点)
6.最后其实是CPU可能在做一些其他计算也会影响界面的性能。那这里其实可以在页面加载的时候减少一些后台操作。

2.关于性能优化这一块
1.我直接回答MAT,找到一些无法被释放的对象,排查相应的内存泄露原因。
面试官继续问直接用MAT吗?还有其实你这个只是在排查内存溢出的情况,如果是性能优化其实更多的是从一些对象维护了一些冗余的数据。导致这些类没办法做释放,这一块需要考虑到性能优化。
那么这边其实,可以先用Memory Monitor看页面内存结构,有哪一些大对象,System Trace,来看一下哪一些页面启动花时间(耗CPU)。然后再用MAT来分析具体是哪些对象。
性能优化无异于以下几个点
1.从渲染过程优化 View绘制,层级等。
2.一些计算过程可以简化尽量简化
3.内存相关,这个时候就是排查大对象,内存占用。
4.电量相关,啊这个一般没人管。Android8.0对后台进程耗电做了优化。
5.具体可以看看这个 http://hukai.me/android-performance-patterns/ 总共6季

以上是性能优化相关接下来是java基础Android基础和一些数据结构,算法和设计模式了。

java基础

1.接口和抽象的区别

接口 implements 多继承,灵活易扩展组合。

抽象 extends abstracts关键字修饰 单继承 内部可以带有实现。

抽象不易于维护,接口优于抽象

2.集合框架:HashMap的实现原理

散列桶,每个桶都实现了一个链表,如果hash值相等了,那么就往相应链表里加。链表的查询效率是O(n) jdk1.8采用了红黑树结构,当链表长度大于阈值8则转为红黑树 查询效率更高O(lgn)
扩容系数是0.75,2倍扩容,默认大小16。 java建议容器类如果能确定大小需手动指明大小。

hashmap和hashtable 的区别,hashtable的方法带有synchronize关键字,是线程安全的。hashmap不是。
jdk1.4出的ConcurrentUtil包 有一个 ConcurrentHashMap提供了一种分段锁机制,比hashtable更高效。
CopyOnWriteArrayList,CopyOnWriteArraySet这个是concurrent工具包里面的另外两个线程安全的集合。

3.多线程

violate关键字和synchronized 关键字

乐观锁悲观锁,讲一下乐观锁,乐观锁就是不对数据加锁,每次更新拉一个版本,谁先提交算谁赢。
悲观锁则是需要对数据做加锁。以实现资源同步。

Lock和synchronized

这边也没回答好,但其实是Lock更灵活,他可以放在异常捕获finally中来解除资源占用。

5.内存相关

1.内存分区 方法区,虚拟机栈,本地方法栈,堆,程序计数器 他们分别做什么的。这个就答不出来了
2.类引用的引用什么,当然是地址啦。不要覆盖toString方法可以打印的。

算法

几种排序算法还有他们的时间复杂度。 时间按复杂度。。。。

1.选择排序:不稳定,时间复杂度 O(n^2)
2.插入排序:稳定,时间复杂度 O(n^2)
3.冒泡排序:稳定,时间复杂度 O(n^2)
4.堆排序:不稳定,时间复杂度 O(nlog n)
5.归并排序:稳定,时间复杂度 O(nlog n)
6.希尔排序:不稳定,时间复杂度 平均时间 O(nlogn) 最差时间O(n^s) 1<s<2
7.快速排序:不稳定,时间复杂度 最理想 O(nlogn) 最差时间O(n^2)

快排就选取一个点其他数据往两边排,然后两边选点再排,分治思想

设计模式

单例,工厂,享元,策略,装饰器,适配器,建造者,动态代理,代理…等等等

反正我是很容易把策略,装饰器,适配器搞混。。 艾玛24种,这个得整理一下.

被问的一个问题是最快的单例模式,用枚举实现。听的我一脸懵,后面发现Effective Java 上面有相关的内容。

Android基础

老生常谈的那些,Activity启动,数据存储,页面恢复,事件分发,View绘制,三种动画,IPC,多线程的几种方式,Binder,Handler,ThreadLocal。
然后就是个gradle 构建项目
然后就是一些能使用到的技术,插件化,模块化,AOP编程。
然后就是闲谈一些经验了。

TCP/IP

三次握手

IO/NIO

普通IO:直接操作流

NIO:操作数据缓冲区 ,DataBuffer,Channel,Selector

这是两场面试的心得。有没写到的再补充

总结:2年了,还是那么菜。

接下来要看的一些东西

  1. Effective JAVA
  2. JAVA多线程编程
  3. JVM虚拟机
  4. JAVA网络编程
  5. 设计模式
  6. IO/NIO

2018年4月1日 18:17:40

找工作的事情放缓,着手学习,写代码,感谢这次面试经历。特别是美图的Boss!!

By xiaolong:You have a dream,you got to protect it!