Q&A
Q&A
熊就该有个熊样_RQ:安卓四大组件是什么?Activity的生命周期是什么?有几种启动模式?Activity和fragment的区别是?
A:安卓四大组件包括Activity(活动)、Service(服务)、BroadcastReceiver(广播接收器)、ContentProvider(内容提供者);Activity的生命周期有onCreate(创建Activity是调用的)、onStart(Activity可见但不在前台时调用的)、onResume(Activity在前台运行是调用的)、onPause(Activity失去焦点时调用的,如对话框弹出、切换到了另一个应用)、onStop(Activity完全不可见时调用的)、onDestroy(当Activity被销毁前调用的);启动模式有标准(standard)、单一实例(singleTop)、单一任务(singleTask)、和单一后台(singleInstance)四种;Activity和Fragment的区别主要在于Activity是一个独立的界面,而Fragment是一个可以嵌入到Activity中的模块,它没有自己的生命周期,需要依赖于Activity。Fragment可以提高代码的复用性,让界面更加灵活。
Q:ArrayList和LinkedList的区别是什么?
A:ArrayList是基于数组实现的,通过索引来访问元素,支持快速随机访问,LinkedList是基于链表实现的,每个元素都包含一个指向前一个元素和后一个元素的引用,适合插入和删除操作。ArrayList的时间复杂度是O(1),LinkedList的时间复杂度是O(n),LinkedList需要从头部或者尾部开始遍历链表,直到找到目标元素的位置。ArrayList使用数组来存储数据,占用的空间是连续的,可能会产生内存碎片,LinkedList通过链表来连接元素,每个元素包含前后节点的引用,占用的空间相对会比较大。
Q:重写和重载的区别是什么?
A:重载是是在同一个类里,有多个同名的方法,但它们的参数列表不同,这样可以实现不同的功能。重写是子类继承父类之后,对父类里的方法进行重新实现,让子类用自己的行为。
Q:解释封装、继承、多态
A:封装就是把数据和操作数据的方法打包在一起,就像一个包裹,不让外部直接访问数据,只能通过方法来操作,提高安全性。继承是子类可以继承父类的属性和方法,这样就可以减少代码重复,提高代码的复用性。多态是一个方法可以有多种形态,根据对象的表现不同,就比如动物类里面有一个叫的方法,小狗汪汪叫,小猫喵喵叫,他们的叫声不同,这就是多态。
Q:什么是面向对象?面向对象的三大特性是什么?面向对象和面向过程的区别?
A:面向对象就是把现实里的事物看成一个个对象,每一个对象都有自己的属性和行为。三大特性就是封装、继承、多态。面向独享和面向过程的区别在于,面向对象是以对象为中心,关注对象的属性和行为,面向过程是以过程为中心,关注程序执行的步骤。
Q:什么是抽象类和接口?它们有什么区别?什么时候使用抽象类?什么时候使用接口?
A:抽象类和接口都是为了将方法进行抽象,然后让子类去实现,他们都不能创建本类对象,只能由子类去实例化子类对象,抽象类用的是extend关键字,接口用的是implement关键字,抽象类可以实现接口,而接口只能继承接口不能继承类,一个类最多只能继承一个父类,但可以实现多个接口。抽象类更进一步的抽象后就诞生了接口,接口比抽象类更纯粹,它没有成员属性只有方法,子类实现接口之后,唯一能做的就是重写方法,不像抽象类子类继承抽象类之后,连带着父类的成员属性也继承过来了。
Q:构造方法是什么?为什么需要构造方法?构造方法有什么特点?
A:构造方法是用来创建对象的,创建对象时需要给它一些初始的设置。构造方法的特点是它的名字和类名完全一样,而且他没有返回值,当我们创建对象时会自动调用构造方法。
Q:什么是进程和线程? 它们有什么区别?创建线程的方式有哪些?线程池、线程锁
A:进程是计算机中一个独立运行的程序,可以看做是一整列火车,而线程是进程中的一个执行流程,就像是火车上的一个车厢,每一个车厢都可以有不同的任务,但他们都同属于同一列火车。创建线程的方式有继承Thread类,然后重写run方法;另一种是实现Runnable接口,然后在实现类中定义要执行的代码。线程池就像是一个工厂,有很多工人(线程),可以同时处理很多任务(线程任务)。它能提高效率,因为不需要每次都创建新的工人。线程锁就是用来控制多线程访问共享资源的,确保一次只能一个人进,防止冲突和数据混乱。
Q:http和https的区别?
A:HTTP是超文本传输协议,数据在传输过程中是不加密的,这意味着信息可能会被第三方截获。而HTTPS在HTTP的基础上加入了SSL/TLS协议,确保了数据传输过程中的加密,防止了信息被截获或篡改。
Q:网络七层架构是什么?
A:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
Q:TCP和udp的区别?TCP为什么可靠?TCP三次握手四次挥手?
A:TCP和UDP都是传输层的协议,但是它们的工作方式不同。TCP能够确保数据报准确无误的送达,如果丢失了还会重发,所以他很可靠,而UDP不保证数据包一定会到达,速度更快但是可靠性低。TCP之所以可靠是因为他有确认机制,发送方会等待接收方的确认信息,如果没有收到就会重发数据。三次握手是在建立连接时客户端和服务器互相确认彼此准备通信的过程,首先客户端会发送一个SYN标志的数据包给服务器请求建立连接,然后服务器收到这个请求后会回复一个SYN和ACK标志的数据包给客户端,表示它已经准备好建立连接,最后客户端收到服务器的响应之后,会再发送一个ACK标志的数据包给服务器,表示他也准备好了,这样双方都确认了彼此都准备好之后连接就建立起来了。四次挥手是在断开连接时,双方互相确认不在通信的过程,首先客户端发送一个FIN标志灯数据包给服务器表示他想关闭连接,服务器收到这个请求之后会回复一个ACK标志的数据包给客户端表示已经收到关闭请求。然后服务器也会发送一个FIN标志的数据包给客户端表示他也想要关闭连接,接着客户端收到服务器的FIN请求之后会回复一个ACK标志的数据包给服务器表示他也同意关闭连接了,最后连接就正式关闭了。
Q:RecyclerView 和 ListView 的区别? 为什么要使用 RecyclerView?
A:RecyclerView 和 ListView都是用来显示列表的,但是他们的回收机制不一样,RecyclerView 的回收机制更先进,他有四级缓存,而Listview只有两级缓存,所以在处理大量数据时,RecyclerView 的性能更好、更省内存。RecyclerView 会自动管理视图的复用,不需要自己去写代码去回收视图,能让代码更简洁,性能也更好。
Q:了解sqlite吗?讲一下shareperfernce的优缺点
A:SQLite 是一个嵌入式关系型数据库引擎,它占用资源少,可以方便地嵌入到 Android 应用程序中使用。 它提供了一种结构化的方式来存储和管理数据。可以存储结构化的数据,方便进行数据的查询、排序和管理。可以使用 SQL 语句进行增删改查操作。支持事务处理和索引。但是不适合存储海量数据,并发性能也不如大型数据库。SharedPreferences 是 Android 平台上一个轻量级的存储机制,用于存储应用程序的配置信息。 它以键值对的形式存储数据,读写速度快、使用简单,他的缺点是存储空间有限而且只能存储键值对数据,不适合存储大量或复杂的数据结构。
Q:跨进程通信的方式有哪些?binder相对于其他通信方式的优点在哪里?
A:Handle、Socket,binder通过内核空间传递数据,这样只需要一次数据拷贝,效率比较高,而且在安全性上,每一个进程都有一个UID,在通信的时候会验证这个UID,可以防止恶意访问,还有就是Binder的使用也比较简单,他支持面向对象的调用方式,相对于Socket需要网络协议的支持,Binder效率相对高一些,而Handle是用于线程间通信的,他通过消息队列传递,适合同一个进程的不同线程之间通信。
Q:了解过Handle吗?讲一下Handler 的作用? Handler 的工作原理? 如何避免 Handler 造成的内存泄漏?
A:Handle负责在不同的线程之间传递消息,工作原理是将需要传递的消息通过Handle发送和处理消息发送给MessageQueue,MessageQueue用于存储消息队列,而Looper负责循环读取MessageQueue中的消息并将消息传递给Handle对象,最后Handle在主线程中处理消息和更新UI。为了避免Handle造成的内存泄漏,主要是不要让Handle长时间引用Activity,比如在Activity结束时,解除所有的Handle引用或者使用WeakReference 来包装Handle,这样及时Handler还在,也不会阻止Activity被回收。
Q:什么是死锁? 如何避免死锁?怎么解除死锁?
A:死锁就是几个进程互相等待对方释放资源。要避免死锁可以尽量让进程按照顺序使用资源,其次是让进程使用资源的时间不要太长,或者是设置超时时间,如果等待时间太长就放弃等待。解除死锁可以让其中一个线程主动释放资源,这样其他线程就可以继续执行了,还有一种是操作系统强行结束死锁的进程。
Q:MVC、MVP、MVVM的区别
A:MVC (Model-View-Controller):Model (模型): 负责处理应用程序的数据和业务逻辑。View (视图): 负责显示用户界面,并将用户的操作传递给 Controller。Controller (控制器): 负责接收用户的输入,并根据用户的输入来更新 Model 和 View。MVP (Model-View-Presenter):Model (模型): 负责处理应用程序的数据和业务逻辑。View (视图): 负责显示用户界面,并将用户的操作传递给 Presenter。Presenter (展示器): 负责从 Model 中获取数据,并将数据传递给 View 进行显示。 Presenter 还负责接收用户的输入,并根据用户的输入来更新 Model。MVVM (Model-View-ViewModel):Model (模型): 负责处理应用程序的数据和业务逻辑。View (视图): 负责显示用户界面,并通过数据绑定 (Data Binding) 与 ViewModel 进行交互。ViewModel (视图模型): 负责从 Model 中获取数据,并将数据转换成 View 可以直接显示的形式。 ViewModel 还负责接收用户的输入,并根据用户的输入来更新 Model。 ViewModel 通过数据绑定将数据传递给 View,并监听 View 的事件。
Q:安卓的内存方面有了解过吗?比如内存泄漏、内存溢出?什么会导致内存泄漏和溢出?怎么查看
A:内存泄漏是指程序在运行时分配了内存,但没有正确释放,导致这些内存无法被系统回收,内存溢出是指程序请求的内存空间超过了系统实际能够分配的资源,通常发生在程序尝试创建过大的数据结构和处理大量数据时。要查看和解决内存泄漏,可以使用Android Studio的profile工具,实时监控应用的内存使用情况,此外还可以使用LeakCanary库,他可以自动检测应用中的内存泄漏,并且在发生泄漏时给出详细的信息。
Q:设计模式了解哪些?(单例模式等)
A:单例模式,用来保证一个类只有一个实例,并提供一个全局访问点;工厂模式,用来创建对象的接口让子类决定实例化哪个类;观察者模式,就是对象之间的一对多的依赖关系,一个对象改变状态,所有依赖他的对象都会收到通知并自动更新。
Q:Android 中进行网络请求的方式有哪些? (OkHttp, Retrofit)Retrofit 的作用? 如何使用 Retrofit 进行网络请求?
A:一种是HttpURLConnection,另一种是Retrofit和Okhttp库。Okhttp的作用是发送网络请求,处理连接和读取响应,而Retrofit的作用是将网络请求比如Gson转换成Java方法调用,定义网络请求的接口通过注解来指定请求的URL、方法和参数。
Q:了解过RxJava吗?他的工作模式是什么?如何进行线程切换?
A:RxJava是一种用于在Java中处理异步数据流的库,他的作用是能够更方便的进行多线程操作和处理数据流。工作模式主要是通过Observable发送数据,Subscriber接受数据,Scheduler控制线程。线程切换可以通过SubscribeOn和observeOn来实现,还有就是背压处理。
Q:Map和HashMap的区别是什么?HashMap的工作原理是什么?
A:Map是一个接口,他定义了键值对的存储和操作,而HashMap是Map接口的一个具体实现,他基于哈希表,可以快速定位和存储数据,但是HashMap是非线程安全的,他允许一个null键和多个null值。
Q:了解过Kotlin吗?Kotlin的协程是什么?
A:Kotlin是安卓开发的官方支持语言,他简洁、安全、支持函数式编程。协程是一种计算模型,他允许你编写看起来是同步的代码,但实际上这些任务都是在异步执行的,在Kotlin中可以用CoroutineScope来启动协程,并用suspend关键字标记,这样函数就可以在协程中挂起和恢复。
Q:JSON 的格式? 如何解析 JSON 数据? (JSONObject, Gson)
A:JSON是一种轻量级的数据交换格式,主要由键值对组成,键是字符串,值可以是字符串、数字、数组、对象或布尔值。解析JSON可以用原生的JSONobject,或者第三方库Gson。
Q:ConstraintLayout怎么实现多分辨率适配?
A:主要是靠dp单位来定义元素大小,这样就能自动适应不同屏幕的密度,他还支持链式布局和响应式设计,根据屏幕变化自动调整布局。
Q:怎么优化列表性能,通过recycleview多类型复用机制以及Glide图片加载优化,使列表滑动帧率稳定在60fps?
A:通过recycleview的viewholder复用机制减少创建和销毁视图的次数,降低内存开销,Glide加载图片的时候设置占位图和错误图,这样加载过程中就不会出现白屏或者闪烁,然后还可以限制图片的大小,避免加载大图导致的内存溢出。


