春招笔记(八)--腾讯面试一面

1.自我介绍

2.项目经验

3.Activity 和 Frament对比(为什么要有Fragment)

Fragment 类是在 Honeycomb(译注:蜂巢 3.0 API level 11)发布时被介绍的。它允许我们把应用组件分解成可重用的部件。Fragment必须被一个 activity 托管,而一个 activity 可以一次托管一个或多个 fragment。

我刚刚讲过,Honeycomb 发布时引入了 fragments。Honeycomb 版本首次对平板设备提供了正式支持。fragment 理念的最初目标之一是帮助开发者在构建手机和平板应用时提供不同的用户体验。

邮件客户端是用到 fragment 的典型例子,比如 Gmail App。手机版展示了用户的邮件列表,点击其中一个就跳转到展示邮件内容的详情界面。这个过程包含了两个界面,各自独占屏幕。

当用户在平板上使用 Gmail App 时,可以在一个屏幕上同时看到列表界面和详情界面。显然我们可以在平板上一次显示更多的信息。

Fragments 很容易实现这个功能。列表界面是一个 fragment,详情界面也是一个 fragment。activity 根据屏幕大小决定显示其中一个或全部。

Fragments 的优雅之处在于,不需要修改 fragment 类的代码就可以完成上述事情。作为 app 的可重用组件,fragments 可以以任意多种方式呈现给用户

懒加载

懒加载主要用于ViewPager且每页是Fragment的情况,场景为微信主界面,底部有4个tab,当滑到另一个tab时,先显示”正在加载”,过一会才会显示正常界面。

默认情况,ViewPager会缓存当前页和左右相邻的界面。实现懒加载的主要原因是:用户没进入的界面需要有一系列的网络、数据库等耗资源、耗时的操作,预先做这些数据加载是不必要的。

这里懒加载的实现思路是:用户不可见的界面,只初始化UI,但是不会做任何数据加载。等滑到该页,才会异步做数据加载并更新UI。

这里就实现类似微信那种效果,整个UI布局为:底部用PagerBottomTabStrip项目实现,上面是ViewPager,使用FragmentPagerAdapter。逻辑为:当用户滑到另一个界面,首先会显示正在加载,等数据加载完毕后(这里用睡眠1秒钟代替)显示正常界面。

 

4.Handle和Message,MessageQueue,Looper机制

当我们调用handler.sendMessage(msg)方法发送一个Message时,实际上这个Message是发送到与当前线程绑定的一个MessageQueue中,然后与当前线程绑定的Looper将会不断的从MessageQueue中取出新的Message,调用msg.target.dispathMessage(msg)方法将消息分发到与Message绑定的handler.handleMessage()方法中。

一个Thread对应多个Handler 一个Thread对应一个Looper和MessageQueue,Handler与Thread共享Looper和MessageQueue。 Message只是消息的载体,将会被发送到与线程绑定的唯一的MessageQueue中,并且被与线程绑定的唯一的Looper分发,被与其自身绑定的Handler消费。

5.说说你了解的设计模式

等等会有专门写设计模式的笔记

6.TCP与UDP区别

TCP协议和UDP协议特性区别总结:

     1. TCP协议在传送数据段的时候要给段标号;UDP协议不

     2. TCP协议可靠;UDP协议不可靠

     3. TCP协议是面向连接;UDP协议采用无连接

     4. TCP协议负载较高,采用虚电路;UDP采用无连接

     5. TCP协议的发送方要确认接收方是否收到数据段(3次握手协议)

     6. TCP协议采用窗口技术和流控制

7.TCP三次握手和四次挥手

 

三次握手

A 向 B 发送连接请求报文,SYN=1,ACK=0,选择一个初始的序号 x。

B 收到连接请求报文,如果同意建立连接,则向 A 发送连接确认报文,SYN=1,ACK=1,确认号为 x+1,同时也选择一个初始的序号 y。

A 收到 B 的连接确认报文后,还要向 B 发出确认,确认号为 y+1,序号为 x+1。

B 收到 A 的确认后,连接建立。

四次挥手

 

8.对比ListView和RecyleView,为什么要用RecyleView

RecyclerView的重点应该放在[flexible]上,灵活是它[最大]的特点,由于AbsListView的功能完善,所以你想要定制它其实是很困难的,换句话说,AbsLisView已经强耦合了很多和[滑动,回收]无关的功能。这个时候RecyclerView的强大之处就显示出来了,LayoutManager,Adapter,ItemAnimator,ItemDecoration等等各司其职,这使得RecyclerView能够实现深度的定制化。系统提供的三种LayoutManager可以无缝衔接ListView和GridView,瀑布流的实现也变得无分简单。滑动删除和长按交换只需要添加几个类就可以实现。

除此之外,RecyclerView的动画配以局部刷新也是它比较出色的地方,在AbsListView时代,只有一个notifyDatasetChanged方法,想要做局部刷新需要自己去实现,动画更是难做,但是在RecyclerView中,有很多适配局部刷新的api,还有ItemAnimator这样的神器去支持动画,谁用谁知道。

至于点击事件,我在想Google将RecyclerView取名叫这个名字的原因就是想让这个组件只关注[Recycle],关于点击事件,在ViewHolder中添加是轻而易举的事,封装起来也不难,而且如果把这个逻辑写在组件内部,它的position和动画将会比较难处理,AbsListView里就花了比较多的精力去处理这一方面的逻辑。此外,在我们使用ListView的过程中,如果item中有可点击组件,例如button,那么点击事件的冲突也是一个让开发者很烦恼的事情,但是RecyclerView的好处就是把点击事件的控制权完全的交给开发者,避免了这样的痛苦。

最后,RecyclerView天生支持嵌套滑动,可以很好的配合NestedScrollView或者CoordinatorLayout,而AbsListView则是需要在一定的版本上才支持这个机制,这也算是RV的一个优势吧。

9.你对数据结构的了解 HashMap 对比 链表 队列 数组

HashMap是基于hashing的原理,

HashMap的工作原理

HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap在每个链表节点中储存键值对对象。

当两个不同的键对象的hashcode相同时会发生什么? 它们会储存在同一个bucket位置的链表中。键对象的equals()方法用来找到键值对。

因为HashMap的好处非常多,我曾经在电子商务的应用中使用HashMap作为缓存。因为金融领域非常多的运用Java,也出于性能的考虑,我们会经常用到HashMap和ConcurrentHashMap。你可以查看更多的关于HashMap的文章:

http://www.importnew.com/7099.html

https://zhuanlan.zhihu.com/p/31610616

10.如何用两个队列来实现一个栈

https://blog.csdn.net/ns_code/article/details/25076689

11.逻辑题:七个水 一瓶有毒药 有三只兔子可以用来实验来找出毒药 怎么找

000 001 010 011 100 101 110 111

1号兔子喝 1 3 5 7

2号兔子喝 2 3 6 7

3号喝 4 5 6 7

 

 

12.你有什么想问的?

你可能感兴趣的:(春招笔记(八)--腾讯面试一面)