border++;
}
}
for(int j=0;j<a.length;j++){
System.out.println(a[j]);
}
}
//方法2
public void setParted1(int[] a,int left,int right){
if(left>=right||lefta.length||right0){
for(int i=0;i<a.length;i++){
System.out.println(a[i]);
}
return ;
}
while(a[left]<0){
left++;
}
while(a[right]>=0){
right–;
}
if(left>=right||lefta.length||right0){
for(int i=0;i<a.length;i++){
System.out.println(a[i]);
}
return;
}
swap(a,left,right);
left++;
right–;
setParted1(a,left,right);
}
private void swap(int a[],int left,int right){
int temp=0;
temp=a[left];
a[left]=a[right];
a[right]=temp;
}
public static void main(String[] args) {
int a[]={1,2,-1,-5,-6,7,-7,-10};
new PartTest().setParted1(a,0,a.length-1);
}
显然,第二种实现的难点比较高,不过只要此种满足条件。
第二面
1,bundle的数据结构,如何存储,既然有了Intent.putExtra,为啥还要用bundle。
2,android的IPC通信方式,是否使用过
3,Android的多点触控如何传递 核心类
4,asynctask的原理 AsyncTask是对Thread和Handler的组合包装。
5,android 图片加载框架有哪些,对比下区别
6,图片框架的一些原理知识
7,其他的一些Android的模块化开发,热更新,组件化等知识。
三面;主流框架
1. EventBus
EventBus是一个Android发布/订阅事件总线,简化了组件间的通信,让代码更加简介,但是如果滥用EventBus,也会让代码变得更加辅助。
面试EventBus的时候一般会谈到如下几点
(1)EventBus是通过注解+反射来进行方法的获取的
(2)使用ConcurrentHashMap来保存映射关系 调用实体的构建:调用实体中对于Object,也就是实际执行方法的对象不应该使用强引用而是应该使用弱引用,因为Map的static的,生命周期有可能长于被调用的对象,如果使用强引用就会出现内存泄漏的问题。
(3)方法的执行 使用Dispatcher进行方法的分派,异步则使用线程池来处理,同步就直接执行,而UI线程则使用MainLooper创建一个Handler,投递到主线程中去执行。
2.Retrofit
要明确EventBus中最核心的,就是动态代理技术。
Java中的动态代理:
Retrofit中的动态代理
Retrofit作用
3.OkHttp
请求任务队列
复用连接池
4. RxJava
从15年开始,前端掀起了一股异步编程的热潮,在移动Android编程过程中,经常会听到观察者与被观察者等概念。
观察者与被观察者通信
Observable的通过create函数创建一个观察者对象。
public final static Observable create(OnSubscribe f) {
return new Observable(hook.onCreate(f));
}
Observable的构造函数如下:
protected Observable(OnSubscribe f) {
this.onSubscribe = f;
}
创建了一个Observable我们记为Observable1,保存了传入的OnSubscribe对象为onSubscribe,这个很重要,后面会说到。
onSubscribe方法
public final Subscription subscribe(Subscriber<? super T> subscriber) {
return Observable.subscribe(subscriber, this);
}
private static Subscription subscribe(Subscriber<? super T> subscriber, Observable observable) {
…
subscriber.onStart();
onSubscribe.call(subscriber);
return hook.onSubscribeReturn(subscriber);
}
线程切换过程(Scheduler)
RxJava最好用的特点就是提供了方便的线程切换,但它的原理归根结底还是lift,使用subscribeOn()的原理就是创建一个新的Observable,把它的call过程开始的执行投递到需要的线程中;而 observeOn() 则是把线程切换的逻辑放在自己创建的Subscriber中来执行。把对于最终的Subscriber1的执行过程投递到需要的线程中来进行。
Android进阶之路
对我们开发者来说,一定要打好基础,随时准备战斗。不论寒冬是否到来,都要把自己的技术做精做深。虽然目前移动端的招聘量确实变少了,但中高端的职位还是很多的,这说明行业只是变得成熟规范起来了。竞争越激烈,产品质量与留存就变得更加重要,我们进入了技术赋能业务的时代。
**技术之路就是漫长的打怪升级,不断学习前人的踩坑经验才能提升自己,切忌闭门造车!**所谓独乐乐不如众乐乐,在我当时确立好Android方向时,就已经开始梳理自己的成长路线了,包括技术要怎么系统地去学习,都列得非常详细,免费分享给大家。
架构师筑基语言基础
目前Android APP开发主流语言就是Java语言,Java语言最大的特性就是提高了软件的交互可能性,可以说安卓手机几乎所有应用程序都是利用Java语言来进行编写的。
设计思想解读开源框架
最后
赠送大家一套完整的Android学习资料吧。
以前一直是自己在网上东平西凑的找,找到的东西也是零零散散,很多时候都是看着看着就没了,时间浪费了,问题却还没得到解决,很让人抓狂。
后面我就自己整理了一套资料,还别说,真香!
资料有条理,有系统,还很全面,我不方便直接放出来,大家可以先看看有没有用得到的地方吧。
附上白嫖地址:《Android架构视频+BATJ面试专题PDF+学习笔记》
%E4%B8%8D%E4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)**
[外链图片转存中…(img-TjjC6FXa-1643795293010)]
[外链图片转存中…(img-59CsBtTk-1643795293010)]
[外链图片转存中…(img-IOlrOmnu-1643795293011)]
[外链图片转存中…(img-ldkpKFQu-1643795293011)]
[外链图片转存中…(img-8lf4YjJO-1643795293011)]