关于android:腾讯快手滴滴等10家大厂面试题掌握这些让你轻松面试

1次阅读

共计 9980 个字符,预计需要花费 25 分钟才能阅读完成。

2021 年 Android 开发的现状

当初 Android 开发的现状大抵是这个样子,人才重大过饱和,加上跨端和小程序流行,原生客户端(安卓 iOS)岗位进一步萎缩,入行之后待业极为艰难。目前行情是挪动端重大过剩,服务端供需平衡,前端供不应求。市场上前端工作好找,服务端职业下限整体较高。。客户端上百人抢一个工作岗位,竞争强烈,内卷惨烈。

客户端开发整体程度较低,大量培训进去的开发者,简历包装两三年就能进去找到一份 CV 的工作,起薪就能够超过大部分人,所以这也是造成人员过剩的一个条件,人员过剩不可避免地就会导致公司的要求变高,福利变少等一系列问题。

那为什么 Android 开发会面临如此的危机呢?

当初程序员这个行业有手就行,门槛越来越低,无需学历,没有性别限度,只有你想,花点钱学习个半年,间接就能上场,这种零售效率极高。导致 Android 开发者鱼贯而入,人数爆发式增长对于原先老一辈的 Android 开发有一个极大的冲击,行业新人带着新的工作模式,新的工作态度,以及更好的精力和更低的工资供老板抉择。

这样的条件,你被优化了也无可非议,雷同的事件,他人的性价比更高,产出也比你高,为什么不必性价比跟高的年轻人呢?当然,人都是会老去的,这对于大多数人来说都是一个死循环。

会画个 UI 就叫客户端研发了?记住了,缺的永远是真正的人才。

如何防止被优化?

对于程序员来说,赚钱最简略无效的方法就是晋升本人的技术,学习永远是最便宜最无效地晋升本人地办法。防止被优化有两种路能够走:

第一:

转行成为管理人员,在一家公司做的久了,对于公司的经营形式和管理模式都有一个较为全面的理解,对于技术层面和经营层面都有一个较为正确的了解,然而这个治理岗位是竞争力相当大的,不想当将军的士兵不是好士兵。

没人可能教你怎么去做一个“将军”,没有一个确切的学习方向和路线,只能本人摸索,老板来看,老板说你行,你就是能够的,不行就是永远不行。

第二:

晋升本人的技术,建设属于本人的技术壁垒,这是个有明确方向,学无止境的过程,这条路也是一条一直学习的路,只有一直学习能力从这条路上走得更久,把本人打造成一个“T”型人才,从涉猎到精通的过程,就是成为技术大牛的过程,成为大牛之后,你就会发现,所有的技术都是有互相关系的,也就是说,所有技术到了肯定水平上之后都是互通的。

这也是大牛的恐怖之处,可能疾速上手一门语言,搭建一个成熟的架构 …. 等等。

在本人技术牛逼之后,便是不再受公司的内卷影响了,架构师在任何一家公司都是稀缺资源。

接下来就是各公司的面经了,分享进去供大家参考。

10 家大厂面试题

尚德公司面试

1.java 有什么个性,继承有什么用途,多态有什么用途
2. 反射是什么,在哪里用到,怎么利用反射创立一个对象
3. 代理模式与装璜模式的区别,手写一个动态代理,一个动静代理
4. 对象加载的过程,属性先加载还是办法先加载
5. 垃圾回收机制与 jvm 构造
6. 自定义 View, 事件散发机制讲一讲
7.http 与 https 有什么区别
8.Activity 启动模式,以及各启动模式生命周期问题
9. 静态方法,动态对象为什么不能继承
10.Activity 怎么启动 Service,Activity 与 Service 交互,Service 与 Thread 的区别
11. 介绍一下 android 动画
12.Launcher 启动 App 的流程,两头有几种跨过程通信(socket)
13.Handler 通信,Binder 通信
14. 你碰到过什么内存透露,怎么解决
15.RXJava 怎么切换线程
16.Fragment hide show 生命周期
17. 平时有用到什么锁,synchronized 底层原理是什么

Vivo 公司

1. 简略形容下 Handler,Handler 是怎么切换线程的,Handler 同步屏障
2.Glide 的缓存,有用过 Glide 的什么深刻的 API,自定义 model 是在 Glide 的什么阶段
3. 讲讲 mvc,mvp 模式,presenter 内存透露的问题
4.ANR 理解过吗?有没有理论的 ANR 定位问题的经验
5. 性能优化你做过哪些?
6. 有什么理论解决 UI 卡顿优化的经验
7. 有做过什么 Bitmap 优化的理论教训
8. 我的项目搭建过程中有什么教训, 有用到什么 gradle 脚本,分包有做什么操作
9. 组件化有具体理解过吗?ARouter 具体原理
10. 讲一下事件散发机制,RecyclerView 是怎么解决外部 ViewClick 抵触的
11.mainfest 中配置 LargeHeap,真的能调配到大内存吗?

B 站

1. 一个大抵有序的数组如何排序,最快工夫复杂度
2. 如果叫你实现,你会怎么实现一个多主题的成果
3. 如何自定义实现一个 FlexLayout
4.tinker 的原理是什么, 还用过什么热修复框架,robust 的原理是什么?
5. 说说你对注解的理解,是怎么解析的
6.synchronized 是偏心锁还是非偏心锁,ReteranLock 是偏心锁吗?是怎么实现的
7. 泛型是怎么解析的,比方在 retrofit 中的泛型是怎么解析的
8.mvp 与 mvvm 的区别,mvvm 怎么更新 UI,databinding 用得多吗,databinding 的原理?
9.kotlin ? 的原理
10. 在我的项目中有间接应用 tcp,socket 来发送音讯吗
11. 如何在网络框架里间接防止内存透露,不须要在 presenter 中开释订阅
12. 生命周期都是通过什么调用的?有用过 AIDL 吗?
13. 讲一下 RecyclerView 的缓存机制, 滑动 10 个,再滑回去,会有几个执行 onBindView
14. 如何实现 RecyclerView 的部分更新,用过 payload 吗,notifyItemChange 办法中的参数?
15. 讲讲 LinkedHashMap 的数据结构
16.put post 有什么区别
17.A Activity 关上 B Activity 的生命周期变动,会有什么办法打断吗?
18.Fragment hide show 生命周期变动
19.Fragment replace 生命周期变动

B 站二面

1. 为什么思考换工作
2. 屏幕适配做过什么工作?
3. 你们网络框架用的什么?为什么?
4. 如果让你来开发 B 站的一个页面,哪一个页面能够很快动手
5. 性能优化你做过什么工作?
6.h5 与 native 通信你做过什么工作?
7. 插件化的次要长处和毛病是什么?
8. 你感觉 B 站目前的 APP 有什么问题?
9. 如果产品要求你开发一个音频播放性能,你会怎么着手?预计会有什么坑?
10.ViewPager 切换 Fragment 什么最耗时?
11. 线程间同步的办法
12. 锁之间的区别

B 站三面

1. 介绍一下你自已和我的项目
2. 说说为什么思考到职
3. 说说对你们原来公司的印象
4. 为什么想来 B 站?你在 B 站上经常在看什么?
5. 冀望薪资是多少?
6. 你对搬到上海有什么想法?

腾讯

1. 介绍一下你们我的项目的架构
2.Rxjava 是怎么实现线程切换的
3.Rxjava 自定义操作符
4.ARouter 的原理
5.ARouter 怎么实现接口调用
6.ARouter 怎么实现页面拦挡
7.MVP 怎么解决内存透露
8.OkHttp 怎么实现连接池
9. 如果让你来实现一个网络框架,你会思考什么
10. 你做过什么性能优化的工作
11. 热修复的原理,资源的热修复的原理, 会不会有资源抵触的问题
12.ViewPager 中嵌套 ViewPager 怎么解决滑动抵触
13.android 源码中有哪些设计模式
14. 说说 binder 机制的原理

点击 此处收费获取,Android 与算法面试题和答案。

腾讯二面

1. 为什么思考换一份工作?
2. 在你们公司这几年感觉怎么样?
3. 技术选型上,为什么这么思考?从开发效率,产品性能,产品质量,产品体验等方面思考
4. 你们的产品为什么被砍掉,从哪方面思考
5. 在这几年里,你有做过什么感觉最有价值的工作
6. 你还有什么要问我的吗?目前有几个 offer,倾向性是怎么的?

网易云音乐

1.ViewPager2 原理
2.LifeCycle 的原理是怎么的?
3.ViewModel 为什么在旋转屏幕后不会失落状态
4.Drawable 与 View 有什么区别,Drawable 有哪些子类
5. 属性动画更新时会回调 onDraw 吗?
6.OkHttp 网络拦截器,利用拦截器?OKHttp 有哪些拦截器,别离起什么作用
7. 自定义实现一个九宫格如何实现
8.PathClassLoader 与 DexClassLoader 有什么区别
9. 这些年有做一些什么比拟难的工作?
10. 编译时注解与运行时注解,为什么 retrofit 要应用运行时注解?什么时候用运行时注解?
11.kotlin lazy 应用,lazy viewmodel
12. 有没有看一下 Google 官网的 ViewModel demo
13.ViewModel 在 Activity 初始化与在 Fragment 中初始化,有什么区别?
14.kotlin 与 Java 相互调用有什么问题?
15.retrofit 怎么做 post 申请
16. 界面优化的一些办法,ConstraintLayout 实现三等分,ConstraintLayout 动画.
17.CoordinatorLayout 自定义 behavior, 能够拦挡什么?

网易云音乐二面

1. 你们的我的项目中做过什么比拟难的工作?
2. 视频播放, 一个 player 怎么实现预加载,防止 loading 2.webView 加载本地图片,如何从平安方面思考
3.http1.0,http1.1,http1.2 有什么区别
4.https 与 http 有什么区别
5. 有用过什么加密算法?AES,RAS 什么原理?
6.android 跨过程通信理解吗?共享内存用过吗?binder 怎么验证 pid?binder 驱动理解吗?
7.SharedParence 能够跨过程通信吗?如何革新成能够跨过程通信的.commit 和 apply 的区别.
8.Seriazable 与 Parceable 的区别
9.Bundle 是什么数据结构? 利用什么传递数据
10.Jvm 的内存构造,Jvm 的垃圾回收,办法区有什么货色?
11.h5 与 native 交互,webView.loadUrl 与 webView.evaluateUrl 区别

网易云音乐三面

1. 有没有做过什么 WebView 秒开的一些优化
2. 你们的我的项目中有什么难点?
3.native 如何对 h5 进行鉴权,让某些页面能够调,某些页面不能调
4. 有看过哪些框架的源码吗?
5.viewModel 是怎么实现双向数据绑定的?
6.viewModel 怎么实现主动解决生命周期?
7. 图片加载优化有什么教训吗?
8.viewpager 切换掉帧有什么解决教训?
9. 一个 wrap_content 的 ImageView,加载近程图片,传什么参数裁剪比拟好?
10. 两个 getDrawable 获得的对象,有什么区别?
11. 补间动画与属性动画的区别,哪个效率更高?
12.jsBridge 实现形式
13. 平时是怎么理解一些新常识与业界动静的,最近有什么印象粗浅的文章
14. 平时抓包用什么工具?
15.Mvp 与 Mvvm 有什么区别?

跟谁学

1. 我的项目中的 Webview 与 native 通信
2. 我的项目中对 WebView 的性能进行了怎么的加强
3.synchronized 跟 ReentranLock 有什么区别?
4.synchronized 与 ReentranLock 产生异样的场景.
5. 算法, 删除数组中的反复元素
6. 手写双检查单例模式,各个步骤有什么区别
7.Activity 生命周期

快手

1.string,equals,== 有什么区别
2.AsyncTask 内存泄露
3.dispatchTouchEvent,onInterceptEvent,onTouchEvent 程序,关系
4.onMeasure,onLayout,onDraw 关系
5. 算法题,反转数组
6. 算法题,链表求和
7. 说说你对协程的了解
8. 协程怎么勾销
9. 说说 MVP 与 MVVM 的区别

快手二面

1. 算法题,二叉树的最大深度
2. 如果 android 端和 IOS 端调一个接口,一个通了一个没通,你会如何解决
3. 如果 android 端和 IOS 端调一个接口,一个比较慢,一个比拟快,有什么思路
4.ARouter 的原理是什么?如果不必 ARouter,你会怎么去解藕。接口?设计接口有什么须要留神的?
5.h5 与 native 交互做过什么工作?
6. 登陆性能,登陆胜利而后跳转到一个新 Activity,两头波及什么?从事件传递,网络申请,AMS 交互角度剖析
7.AMS 交互调用生命周期是程序的吗?
8.binder 过程间通信能够调用原过程办法吗?
9.mvp 与 mvvm 有什么区别?
10.token 放在本地如何保留?如何加密比拟好?

快手三面

1.viewModel 的原理,为什么能够在 Activity 销毁后保留数据
2.mvvm 双向数据绑定的原理是怎么的?ViewModel
3. 说说你们我的项目中的难点是怎么的?
4. 伪代码实现一个长按事件
5. 实现一个下载性能的接口

猿辅导

1. 泛型有什么长处?
2. 动静代理有什么作用?
3. 拉圾回收的 GCRoot 是什么?
4.Handler 机制理解吗?一个线程有几个 Looper?为什么?
5. 你理解协程吗?协程有什么作用?能够齐全取代 rxjava 吗?
6. 你们用的什么音讯通信机制
7. 你的我的项目有什么难点?介绍一下?
8. 算法题,二叉树最长结点汇合

猿辅导 2 面

1. 你们我的项目中的难点是什么?
2. 编译期注解解决的是字节码还是 java 文件
3. 你在我的项目中有用到什么设计模式吗?
4.ARouter 的原理是怎么的?
5. 插件化的原理是怎么的?
6. 算法题,K 个一组反转链表
7. 播送与 RxBus 的区别,全局播送与部分播送区别

猿辅导 3 面

1. 你们我的项目中有什么难点?
2.@JavaScriptInterface 为什么不通过多个办法来实现?
3. 为什么不利用同步办法来做 jsBridge 交互?同步能够做异步,异步不能做同步
4. 网络封装怎么实现?
5. 算法题,不同面值的几个硬币,怎么求满足条件的最小值

斗鱼

1. 说说 HashMap 的原理
2. 说说 Java 的内存分区
3. 讲讲你对垃圾回收机制的理解,老年代有什么算法?
4. 说说你对 volatile 字段有什么用处?
5. 说说事件散发机制,怎么写一个不能滑动的 ViewPager
6. 说说你对类加载机制的理解?DexClassLoader 与 PathClassLoader 的区别
7. 说说插件化的原理,资源的插件化 id 反复如何解决?
8.mvp 与 mvvm 模式的区别是什么?
9.JetPack 组件用过哪些?lifeCycle 的原理是什么?如果在 onStart 外面订阅,会回调 onCreate 吗?
10. 单例模式有什么毛病?
11. 说说 App 的启动过程, 在 ActivityThread 的 main 办法外面做了什么事,什么时候启动第一个 Activity?
12. 说说你对 Handler 机制的理解,同步音讯,异步音讯等
13. 说说你对屏幕刷新机制的理解,双重缓冲,三重缓冲,黄油模型
14.onCreate,onResume,onStart 外面,什么中央能够取得宽高
15. 为什么 view.post 能够取得宽高,有看过 view.post 的源码吗?
16.attachToWindow 什么时候调用?
17.DataBinding 的原理理解吗?

滴滴一面

1.JVM 类加载机制理解吗,类什么时候会被加载?类加载的过程具体生命周期是怎么的?
2.Handler 内存透露的 GCRoot 是什么?
3. 动画外面用到了什么设计模式?
4.OkHttp 外面用到了什么设计模式?
5.OkHttp 连接池是怎么实现的?外面怎么解决 SSL?
6. 泛型为什么要擦除?kotlin 的泛型理解吗?泛型的 pecs 准则
7. 同步屏障
8. 性能优化做过什么工作?
9.RecyclerView 的缓存构造是怎么的?缓存的是什么?cachedView 会执行 onBindView 吗?
10.RecyclerView 嵌套 RecyclerView,NestScrollView 嵌套 ScrollView 滑动抵触
11.ViewGroup 在 Action_Move 时 onIntercept 返回 true,事件怎么传递
12.Launcher 启动图标,有几个过程?
13.JMM 可见性,原子性,有序性,synchronized 能够保障什么?
14. 源码中有哪里用到了 AtomicInt
15.AQS 理解吗?
16.Activity 内 LinearLayout 红色 wrap_content, 蕴含 View 绿色 wrap_content, 求界面色彩
17.ViewModel 的应用中有什么坑?
18. 有用 DSL,anko 写过布局吗?
19.HashMap 查找的工夫复杂度是多少?
20. 阿里编程标准不倡议应用线程池,为什么?
21. 四种线程池原理?
22. 理解哪些算法?
23.IdleHandler 用过吗?

滴滴二面

1. 如何封装一个字符串转数字的工具类
2. 如何求以后 Activity View 的深度
3. 多过程怎么实现?如果启动一个多过程 APP,会有几个过程运行?
4. 反射能够反射 final 润饰的字段吗?
5.Activity 与 AppCompactActivity 区别,Activity 会打包到包外面去吗?
6. 如何让两个线程循环交替打印
7. 怎么停止一个线程,Thread.Interupt 肯定无效吗?
8. 动画间断调用的原理是什么?
9. 做过一些 SDK 的操作吗?
10. 协程能够在 Java 我的项目中应用吗?
11.SharedPreference 原理?读取 xml 是在哪个线程?
12. 理解 APK 打包的过程吗?
13.class 文件的组成?常量池外面有什么内容?
14. 主动装箱产生在什么时候?编译期还是运行期
15.bugly 日志收集的原理是什么?
16. 启动优化做过什么工作?如果首页就要用到的初始化?
17.DataBinding 原理

滴滴 3 面

1. 插件化的原理是什么?有没有什么非运行时插件化的解决方案?
2.ARouter 的原理是怎么的?注解处理器是解决 java 还是字节码
3.java 和字节码有什么区别?
4.kotlin 空平安的原理是什么?
5. 性能优化做过什么工作? 有用过什么工具?有没有精确测量的工具?
6.kotlinc 与 javac 编译字节码有什么区别?
7. 你在团队中是怎么一个角色?
8. 你有没有做什么推动我的项目的工作
9. 说说热修复的原理?

字节跳动

1. 你们的我的项目中有什么难点?
2. 你们我的项目的稳定性如何?有做过什么稳定性优化的工作?
3.WebView 性能优化做过什么工作?
4.AIDL in out oneWay 代表什么意思?
5. 线程池理解多少?回绝策略有几种, 为什么有 newSingleThread
6. 跨过程通信理解多少?管道理解吗?
7. 协程介绍一下,讲一个协程的 scope 与 context,协程的 + 号代表什么
8.Handler 休眠是怎么的?epoll 的原理是什么?如何实现延时音讯,如果移除一个延时音讯会解除休眠吗?
9. 算法斐波那契台阶
10. 手写生产者音讯者模型
11.IdleHandler 利用场景

字节跳动 2 面

1. 自定义圆角图片
2. 自定义 LinearLayout,怎么测量子 View 宽高
3.setFactory 和 setFactory2 有什么区别?
4. 插件化换肤计划
5. 插件化的原理,startActivity hook 了哪个办法
6. 手势操作 ActionCancel 后怎么勾销
7. 怎么优化 xml inflate 的工夫,波及 IO 与反射。理解 compose 吗?
8. 算法题:二叉树的每一层最右边节点
9.RecyclerView 缓存构造,RecyclerView 预取,RecyclerView 部分刷新
10.setOnTouchListener,onClickeListener 和 onTouchEvent 的关系

总结

生命不止,学习不止,程序员这一行,以我的眼光看,就是底层人民翻身的最好职业,它只看你的技术,相对不会因为其余任何货色去歧视你,只有你技术好,便是超过了极大局部人,有人会说,996,内卷等一系列针对于程序员这个行业的贬义词。

然而我想说的是,在任何行业这种状况都是不可避免的,当咱们埋怨着 996 没有劳动的时候,却不曾想到工人全年无休,当咱们埋怨内卷重大的时候,不少表演系的大学生还没毕业毕业就就曾经开始被各种卷,各种。。。

生存不易,吾辈且奋发图强!

技能晋升

最初我想说,没有欲速不达的事件,很多事件都是星火燎原,倡议大家 工作之余还是要放弃学习的状态,比方关注一些出名的技术公众号,理解业界最新动静,时刻筹备着。

如果你感觉本人学习效率低,不足正确的领导,能够参考下上面分享我多年工作以来收集整理的学习路线,给大家做个参考:

确定好方向,梳理成长路线图

不必多说,置信大家都有一个共识:无论什么行业,最牛逼的人必定是站在金字塔端的人。所以,想做一个牛逼的程序员,那么就要让本人站的更高,成为技术大牛并不是久而久之的事件,须要工夫的积淀和技术的积攒。

对于这一点,在我过后确立好 Android 方向时,就曾经开始梳理本人的成长路线了,包含技术要怎么系统地去学习,都列得十分具体。

常识梳理完之后,就须要进行查漏补缺,所以针对这些知识点,我手头上也筹备了不少的电子书和笔记,这些笔记将各个知识点进行了完满的总结。

学习一线大厂的各项技术:

1. 大厂面试高频知识点

  • 图片
  • 网络和平安机制
  • 数据库
  • 插件化、模块化、组件化、热修复、增量更新、Gradle
  • 架构设计和设计模式
  • 性能优化
  • Android Framework
  • Android 优良三方库源码

2.Jetpack 架构组件从入门到精通

  • Android Jetpack – Navigation
  • Android Jetpack – Data Binding
  • Android Jetpack – ViewModel & LiveData
  • Android Jetpack – Room
  • Android Jetpack – Paging
  • Android Jetpack – WorkManger
  • Android Jetpack 架构组件之 Lifecycle
  • Android Jetpack Compose 最全上手指南

3.Framework 精编内核解析

次要内容蕴含:

  • 深刻解析 Binder
  • 深刻解析 Handler
  • Dalvik VM 过程零碎
  • 深刻解析 WMS
  • PackagerManagerService

4.Kotlin 强化实战(附 Demo)

  • 第一章 Kotlin 入门教程
  • 第二章 Kotlin 实战避坑指南
  • 第三章 我的项目实战《Kotlin Jetpack 实战》

    • 从一个膜拜大神的 Demo 开始
    • Kotlin 写 Gradle 脚本是一种什么体验?
    • Kotlin 编程的三重境界
    • Kotlin 高阶函数
    • Kotlin 泛型
    • Kotlin 扩大
    • Kotlin 委托
    • 协程“鲜为人知”的调试技巧
    • 图解协程:suspend

5.Android 设计思维解读开源框架

  • 热修复
  • 插件化
  • 组件化框架设计
  • 图片加载框架
  • 网络申请框架
  • RXJava 响应式编程框架设计
  • IOC 架构设计
  • Android 架构组件 Jetpack

6.NDK 模块开发

  • NDK 模块开发
  • JNI 模块
  • Native 开发工具
  • Linux 编程
  • 底层图片解决
  • 音视频开发
  • 机器学习

看视频进行零碎学习

前几年的 Crud 经验,让我明确本人真的算是菜鸡中的战斗机,也正因为 Crud,导致本人技术比拟零散,也不够深刻不够零碎,所以从新进行学习是很有必要的。我差的是零碎常识,差的构造框架和思路,所以通过视频来学习,成果更好,也更全面。对于视频学习,集体能够举荐去 B 站进行学习,B 站上有很多学习视频,惟一的毛病就是收费的容易过期。

另外,我本人也收藏了好几套视频,有须要的我也能够分享给你。

简历准备充分

能够去知乎下面搜搜他人写的无关简历的帖子,怎么筹备,吸引 hr, 突出本人的长处和能力,或者让敌人帮你看看简历有没有问题,比方过于简略或者虚夸,没有重点等。

尽量把你的亮点总结成一句简练的话,再加上数字来阐明它的影响和意义。

其次在简历里中退出了可交互、可展现的内容,更能显出你的能力不同凡响。

定期面试:

光学习了大厂的技术还不够,如何理解当下 Android 市场须要哪些技术呢?

定期的面试足以让你理解当下市场须要哪些技术,也更加容易确定本身的短板在哪,同时,也能够督促本人学习晋升(小伙子,你理解的技术有点掉队了呀…)

万一拿到了高薪 Offer,岂不是更赚?

多看大佬的学习笔记,学习大佬的设计思维:

只有是程序员,不论是 Java 还是 Android,如果不去浏览源码,只看 API 文档,那就只是停留于皮毛,这对咱们常识体系的建设和齐备以及实战技术的晋升都是不利的。

真正最能锤炼能力的便是间接去浏览源码,不仅限于浏览各大零碎源码,还包含各种优良的开源库。

以上这些材料都已打包整顿结束,退出 Android 交换裙:535010262,即可收费支付 PDF 完整版。

正文完
 0