面试宝典
面试必问知识点、BATJ历年历年面试真题+解析
学习经验总结
(一)调整好心态
心态是一个人能否成功的关键,如果不调整好自己的心态,是很难静下心来学习的,尤其是现在这么浮躁的社会,大部分的程序员的现状就是三点一线,感觉很累,一些大龄的程序员更多的会感到焦虑,而且随着年龄的增长,这种焦虑感会越来越强烈,那么唯一的解决办法就是调整好自己的心态,要做到自信、年轻、勤奋。这样的调整,一方面对自己学习有帮助,另一方面让自己应对面试更从容,更顺利。
(二)时间挤一挤,制定好计划
一旦下定决心要提升自己,那么再忙的情况下也要每天挤一挤时间,切记不可“两天打渔三天晒网”。另外,制定好学习计划也是很有必要的,有逻辑有条理的复习,先查漏补缺,然后再系统复习,这样才能够做到事半功倍,效果才会立竿见影。
(三)不断学习技术知识,更新自己的知识储备
对于一名程序员来说,技术知识方面是非常重要的,可以说是重中之重。**要面试大厂,自己的知识储备一定要非常丰富,若缺胳膊少腿,别说在实际工作当中,光是面试这一关就过不了。**对于技术方面,首先基础知识一定要扎实,包括自己方向的语言基础、计算机基础、算法以及编程等等。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
注意:上面这个分割鸡的例子是在我写完后面的内容后,为了解释“变换”而临时加入的,后面的内容又重新说回了警察与小偷的故事,我懒得再改了,所以情节上显得有点跳跃。
8 我突然对“变换”很感兴趣,能说一下map操作符吗?
答:
RxJava有很多操作符,我们就从map操作符说起吧。
我们说回那个小偷吧
上文说到了小偷每行窃一次,就会把被窃者的体貌特征发送给警察,警察根据这个被窃者的体貌特征来定位,从而抓住了小偷。
上文中警察订阅了小偷,这次我们要换个观察者—“寻找失主的警察”,我们让“寻找失主的警察”来订阅小偷。
小偷被抓后,他把偷到的钱包作为数据传递给了警局,“寻找失主的警察”要在上交的钱包里找到失主的身份证,并把失主的身份证号码记录下来,然后调用“lookForOwner(iDnumber)”的方法,来找到失主,代码怎么体现呢?
//模拟钱包里装了一张身份证,身份证的号码是“123123123123123”
Wallet wallet = new Wallet();
IDcard iDcard = new IDcard();
iDcard.iDnumber="123123123123123";
wallet.iDcard=iDcard;
//小偷把钱包作为数据传递给警察
Observable.just(wallet).subscribe(new Action1<Wallet>() {
@Override
public void call(Wallet wallet) {
//警察打开钱包,找到了身份证
IDcard iDcard = wallet.iDcard;
//警察记录下身份证的号码
String iDnumber = iDcard.iDnumber;
//警察通过身份证号码去找失主
lookForOwner(iDnumber);
}
});
貌似需求已经解决了,但是“寻找失物的警察”这个观察者,做了太多的事情,他要翻开钱包找身份证,还得记录身份证号码,还得调用方法来找失主,警察好烦呀。碰巧这又是一个傲娇的警花,她会说:“人家不会翻钱包,钱包又脏又臭的,你直接告诉我失主的身份证号码,其他的事情不归我管!!!!!!!!!”。
所以说:这种方式仍然不能让人满意,因为我希望我的Subscribers(观察者:警察)越轻量越好,做的事情越少越好。另外,根据响应式函数编程的概念,Subscribers更应该做的事情是“响应”,响应Observable发出的事件,而不是去修改。如果我能在某些中间步骤中对“wallet”进行变换,使其转变成“IDnumber”,再把“IDnumber”传递给Subscribers(观察者:警察),那么警花做的事情就很少了,警花就会很开心。
使用操作符:map就是用来把一个事件转换为另一个事件的操作符,看看代码怎么实现吧
//小偷把钱包作为数据传递给警察
Observable.just(wallet)
.map(new Func1<
Wallet //接收到的数据类型,
String //要转换成的数据类型
>() {
@Override
public String call(Wallet wallet) {
return wallet.iDcard.iDnumber;//在这里完成了翻钱包、找身份证、记录身份证号码的操作
}
}).subscribe(new Action1<
String //接收到的数据类型
>() {
@Override
public void call(String iDnumber /接收到map转换后的数据:一个身份证号码) {
lookForOwner(iDnumber);//警花好开心,只需要拿着身份证号码去找失主就OK了
}
});
为了注释那几个泛型,使得代码阅读性降低,大家自行去掉注释,会好看一些,我觉得这几个泛型的意义是很重要的,它体现了“转换”这个精髓
这就是map的作用,把一件事情转换成了另一件事情,使得观察者只接受自己关心的数据(在读这段时,是不是脑子里还在想着那只被宰割的鸡)
这是接触的第一个操作符,所以说的比较详细,因为我刚开始也是,不能理解到为什么要转换呀,观察者拿到数据,自己操作不就行了吗?大家记住这个傲娇的警花,就能领会map转换的精髓了.
其实map操作符还有一个重要的使用场景:如果翻找钱包、记录身份证号码这些繁琐操作与警花根据身份证号码找失主这个操作处于不同的线程时,你通过map操作符将这两种操作分离后,就可以通过Scheduler 来控制线程,关于**线程控制(RxJava精华所在)**稍后再说
9.听说flatMap是一个很有用但非常难理解的变换,说说flatMap吧
答:
这次咱们不说那个小偷了,这次警察抓住的是一个江洋大盗,被捕之后,他供出了所有的赃物,赃物在一个旅行包里,旅行包里装了100个钱包,钱包里有100个失主的身份证,傲娇的警花要通过100个身份证号码去找这100个失主。警花瞬间憔悴了,甚至想辞职不干了。
好吧,我们试着用map来解决这个事情
//模拟一个包内,装了100个钱包,每个钱包里有一个身份证,身份证号码是"1001001"+i
Bag bag = new Bag();
List<Wallet> wallets=new ArrayList<>();
for (int i = 0; i < 100; i++) {
Wallet wallet = new Wallet();
IDcard iDcard = new IDcard();
iDcard.iDnumber="1001001"+i;
wallet.iDcard=iDcard;
wallets.add(wallet);
}
bag.wallets=wallets;
Observable.just(bag).map(new Func1<Bag, List<Wallet>>() {
@Override
public List<Wallet> call(Bag bag) {
return bag.wallets;
}
//在这里通过map,把旅行包bag,变换成了一堆钱包List<Wallet>,
//我们帮警花省去了打开旅行包这一步骤,我们还想把这一堆钱包List<Wallet>,
//变换成一个个钱包Wallet,并把找到每个钱包里的身份证,把身份证号码记录下
//来,直接把一个个身份证号码交给警花。最后的两件事map可以做到(上文已经提到
//了),但是我们卡在了将List<Wallet>变换成一个个钱包Wallet这一步,map无法做到这一点
}).subscribe(new Action1<List<Wallet>>() {
@Override
public void call(List<Wallet> wallets) {
//由于map做不到List<Wallet>变换Wallet,所以劳累警花自己遍历100个钱包
for (Wallet wallet:wallets){
String iDnumber = wallet.iDcard.iDnumber;
lookForOwner(iDnumber);
}
}
});
private void lookForOwner(String iDnumber) {
Log.e("警花","根据身份证号码"+iDnumber+"找到了失主");
}
下面log打印
07-19 23:27:32.405 2959-2959/pic.com.rxjavademo E/警花: 根据身份证号码10010010找到了失主
07-19 23:27:32.405 2959-2959/pic.com.rxjavademo E/警花: 根据身份证号码10010011找到了失主
07-19 23:27:32.405 2959-2959/pic.com.rxjavademo E/警花: 根据身份证号码10010012找到了失主
..............
#### 总结
现在新技术层出不穷,如果每次出新的技术,我们都深入的研究的话,很容易分散精力。新的技术可能很久之后我们才会在工作中用得上,当学的新技术无法学以致用,很容易被我们遗忘,到最后真的需要使用的时候,又要从头来过(虽然上手会更快)。
我觉得身为技术人,针对新技术应该是持拥抱态度的,入了这一行你就应该知道这是一个活到老学到老的行业,所以面对新技术,不要抵触,拥抱变化就好了。
Flutter 明显是一种全新的技术,而对于这个新技术在发布之初,花一个月的时间学习它,成本确实过高。但是周末花一天时间体验一下它的开发流程,了解一下它的优缺点、能干什么或者不能干什么。这个时间,并不是我们不能接受的。
如果有时间,其实通读一遍 Flutter 的文档,是最全面的一次对 Flutter 的了解过程。但是如果我们只有 8 小时的时间,我希望能关注一些最值得关注的点。
> (跨平台开发(**Flutter**)、java基础与原理,自定义view、NDK、架构设计、性能优化、完整商业项目开发等)
> 
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.youkuaiyun.com/topics/618156601)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
性能优化、完整商业项目开发等)
> [外链图片转存中...(img-wHfyzcfl-1715716747512)]
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.youkuaiyun.com/topics/618156601)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**