2023年知识点5

2023-11-22  本文已影响0人  我要离开浪浪山

1、Java中是单继承,为什么不多继承?

Java 中选择单继承而不支持多继承是为了解决多继承可能引发的一些问题和复杂性。以下是一些原因:

  • 钻石继承问题:多继承可能导致钻石继承问题,即当一个类继承自两个具有共同父类的类,并且这两个父类又继承自同一个父类时,会产生冲突。这会导致编译器难以确定如何调用共同父类的方法,从而引发歧义。为了避免这种复杂性,Java 选择了单继承。
  • 继承层次的易读性和可维护性:多继承会导致继承层次的复杂性增加,并且可能变得难以理解和维护。当一个类有多个父类时,这些父类可能存在相同的方法名,并且子类必须明确指定要调用哪个父类的方法。这增加了代码的复杂性和可读性。
  • 接口的实现:Java 提供了接口的概念,它允许类实现多个接口。接口相比多继承更加灵活,可以在类中实现多个不同的行为,而不同于继承父类的特定实现。通过接口,Java 提供了一种更简单和可控的方式来实现类的多重行为。

尽管 Java 选择了单继承,但它通过接口和组合等机制提供了其他方式来实现类的复用和扩展。这种设计决策在平衡灵活性和复杂性之间起到了重要作用,并且使得 Java 语言具备了较高的可读性、可维护性和可扩展性。

2、Kotlin的继承和Java的继承一样都是单继承,区别在于Kotlin用:来代替了extends

// 父类Person
open class Person()

// 子类Man
class Man() : Person()

// 简写
class Man: Person()

特别注意:这里还需要注意的是在Kotlin中类默认都是final的(代表该类不让继承),需要在class关键词前面加上open,表示该类可以被其他类继承和Java一样Kotlin也是单继承的。

Kotlin代码

class Person {
}

编译成Java代码:
注意:class Person{}编译成Java代码,是public 修饰符

public final class com/kana/crazytv/ui/activity/Person {
}

3、Handler、Thread、Handler三者的区别?

Handler、Thread、Looper 是在 Android 平台下用于处理多线程和消息传递的三个重要组件。

通过 Handler,可以实现线程之间的通信,从而在后台线程中更新 UI、发送和处理消息等操作。综上所述,Thread 是 Java 提供的多线程机制,用于实现并发执行多个任务;Looper 是 Android 提供的消息循环机制,用于创建和管理线程中的消息队列;Handler 是 Android 提供的用于处理消息和线程间通信的机制,可以与特定的线程和 Looper 关联,从而在对应的线程中处理消息。它们三者之间存在协作关系,可以实现多线程编程和线程间的消息传递。

4、Android版本的特性,不同API的区别?

    1. Android 1.0-1.1:这是Android最早的版本,引入了基本的操作系统功能和应用程序框架,如活动、服务、内容提供者和广播接收器。
    1. Android 1.5(Cupcake):引入了一些重要的用户界面改进,如虚拟键盘、文本选择和复制粘贴功能。
    1. Android 1.6(Donut):增加了搜索框小部件、快速搜索和Android Market应用程序。
    1. Android 2.0-2.1(Eclair):引入了新的用户界面和功能,如扩展搜索框、多点触控和HTML5支持。
    1. Android 2.2(Froyo):增加了新的功能和API,如USB和Wi-Fi热点功能、Adobe Flash Player支持和性能优化。
    1. Android 2.3(Gingerbread):带来了许多用户界面和性能改进,如新的虚拟键盘、新的下载管理器和更快的图形性能。
    1. Android 3.0-3.2(Honeycomb):这些版本是专门为平板电脑设计的,引入了全新的用户界面和功能,如片段、操作栏和多面板支持。
    1. Android 4.0-4.0.4(Ice Cream Sandwich):将手机和平板电脑合并为一个统一的平台,引入了新的用户界面和功能,如全新的锁屏、人脸解锁和Android Beam。
    1. Android 4.1-4.3(Jelly Bean):带来了更流畅的用户界面和更好的性能,引入了Google Now、可调整大小的小部件和通知优化。
    1. Android 4.4(KitKat):引入了更轻量级的操作系统,优化了内存管理和性能,引入了新的Immersive Mode、透明系统栏和印刷效果。
    1. Android 5.0-5.1(Lollipop):带来了全新的Material Design用户界面风格,引入了新的动画效果、通知控制和多用户模式。
    1. Android 6.0(Marshmallow):引入了运行时权限控制、指纹识别支持和Doze模式等功能。
    1. Android 7.0-7.1(Nougat):带来了分屏模式、即时应用、通知重组和虚拟现实支持。
    1. Android 8.0-8.1(Oreo):引入了自适应图标、画中画模式、通知渠道和后台限制等功能。
    1. Android 9.0(Pie):带来了全新的手势导航、自适应亮度、应用程序操作和数字禁止等功能。
    1. Android 10.0(Q):引入了全新的系统级黑暗模式、更多的隐私和安全控制、手势导航和增强的智能回复等功能。
    1. Android 11.0:最新版本,引入了通知历史记录、聊天气泡、屏幕录制和自动重置权限等新功能。
    1. Android 12.0:最新版本,引入了安全变更、隐私保护、应用休眠等新功能。

5、ListView和RecyclerView的区别

ListView 和 RecyclerView 是 Android 中常用的用于展示列表数据的视图控件,它们的主要区别如下:

总的来说,如果需要更高灵活性和更好的性能,建议使用 RecyclerView。而如果只是简单地展示线性列表数据,可以选择使用更简单的 ListView。

6、Android View刷新机制

Android 中的 View 刷新机制是通过绘制流程来实现的。当 View 状态发生改变(如数据更新、用户交互等)时,系统会触发 View 的重新绘制,以保证 UI 显示的正确性。以下是 Android 中 View 刷新机制的主要流程:

需要注意的是,View 的刷新是在 UI 线程上进行的,如果在 UI 线程上执行耗时操作,会导致界面卡顿。为了避免这种情况,可以使用异步任务或线程池来执行耗时操作,以保证界面的流畅性。

7、android中activity 的四种启动模式和生命周期

Android中有四种常见的启动模式:

Activity 的生命周期包括以下几个方法:

需要注意的是,当用户离开当前 Activity 或新的 Activity 覆盖当前 Activity 时,当前 Activity 可能会调用 onPause() 和 onStop() 方法,但不一定会调用 onDestroy() 方法。只有当系统内存不足时,当前 Activity 才可能被销毁。

8、Android 低版本SDK 如何实现高版本 api

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    //运行系统大于等于指定版本,可运行高于指定版本的api
} else {
}

9、什么情况导致 oom

10、当遇到 Native 堆内存溢出时,可以采取以下几种处理方式:

11、Java堆内存溢出 如何处理?

12、什么是 Kotlin Flow?

答案:Kotlin Flow 是一种用于异步数据流处理的 Kotlin 协程库。它提供了一种类似于 RxJava 的响应式编程模型,使得处理异步数据流变得更加简洁和易于理解。

13、Kotlin Flow 和 RxJava 有什么区别?

答案:Kotlin Flow 和 RxJava 都提供了异步数据流处理的能力,但它们在语法和设计上有一些区别。Kotlin Flow 是基于 Kotlin 协程的,使用 suspend 函数来定义和处理数据流。它更加符合 Kotlin 的语言特性,并且可以无缝地与其他协程代码集成。而 RxJava 是基于观察者模式的库,使用 Observable 和 Observer 来处理数据流。

14、Kotlin Flow 中的冷流和热流有什么区别?

答案:在 Kotlin Flow 中,冷流(cold flow)和热流(hot flow)是两种不同的数据流类型。冷流是一种只在订阅时开始发射数据的流,每个订阅者都会获取到完整的数据流。而热流是一种在创建时就开始发射数据的流,订阅者只能获取到它们订阅之后发射的数据。

15、如何处理 Kotlin Flow 中的异常?

答案:在 Kotlin Flow 中,可以使用 try-catch 块或者 catch 操作符来处理异常。当 Flow 中发生异常时,异常会被捕获并包装为一个特殊的异常类型 FlowException。你可以使用 catch 操作符指定处理异常的逻辑,例如记录日志或者返回默认值。

16、Kotlin Flow 中的 map 和 flatMap 有什么区别?

答案:map 和 flatMap 都是用于对 Flow 中的数据进行转换的操作符。map 操作符将每个元素映射为另一个元素,而 flatMap 操作符将每个元素映射为一个新的 Flow,并将这些 Flow 合并成一个。flatMap 通常用于处理嵌套的异步操作或者需要展平流的情况。

17、mmkv底层原理,总结一下

MMKV(Mutil-Model Key-Value)是一个高性能、易用的 key-value 存储框架,它的底层原理主要包括以下几个方面:

总之,MMKV 通过使用 mmap 存储引擎、字典数据结构、缓存机制和数据持久化等技术手段,实现了高性能、易用的 key-value 存储框架。它适用于 Android 平台上需要频繁读写数据的场景,例如数据缓存、配置信息存储等。

18、WorkManager 和service的区别

WorkManager 和 Service 是两种用于后台任务的不同机制。

总结:WorkManager 是一个更加灵活、强大和可靠的后台任务调度库,适用于需要精确控制任务的执行条件和周期的场景。而 Service 是一种通用的后台任务执行机制,适用于需要在后台长时间运行的任务,但不需要太多的控制和调度。

19、string中stringbuffer和stringbuilder的区别?

区别1:线程安全
StringBuffer:线程安全,StringBuilder:线程不安全。因为 StringBuffer 的所有公开方法都是 synchronized 修饰的,而 StringBuilder 并没有 StringBuilder 修饰。

StringBuffer 代码片段


22e73bd0b88dc1a2ef4269a9d4e7a22.png

区别2:缓冲区

f3123ac975736f9734aacd8a2010f76.png

可以看出,StringBuffer 每次获取 toString 都会直接使用缓存区的 toStringCache 值来构造一个字符串。

而 StringBuilder 则每次都需要复制一次字符数组,再构造一个字符串。

所以,缓存冲这也是对 StringBuffer 的一个优化吧,不过 StringBuffer 的这个toString 方法仍然是同步的。

区别3:性能

既然 StringBuffer 是线程安全的,它的所有公开方法都是同步的,StringBuilder 是没有对方法加锁同步的,所以毫无疑问,StringBuilder 的性能要远大于 StringBuffer。

20、MD5 是对称加密还是非对称加密?

总结起来,MD5 是一种对称加密算法,但它实际上是一种哈希算法,用于生成不可逆的摘要。

21、AES是对称加密还是非对称加密?

总结起来,AES 是一种对称加密算法,它使用相同的密钥进行加密和解密操作。

22、MD5和AES的区别?

MD5和AES是两种不同的加密算法,它们具有以下几个主要区别:

总结起来,MD5是一种哈希算法,用于数据摘要和完整性验证,而AES是一种对称加密算法,用于数据的加密和解密。MD5已被认为不安全,而AES具有较高的安全性和可靠性。

23、面向对象的特征有哪些?请简要描述每个特征的含义。

24、什么是类和对象?它们之间的关系是什么?

25、什么是继承?它的作用是什么?

26、什么是多态?它的实现方式有哪些?

27、什么是抽象类和接口?它们之间的区别是什么?

28、java中,那些对象可以作为GCRoots

在Java中,GCRoot是指一组根对象,它们被认为是活动对象的起点,不会被垃圾回收器回收。GCRoot对象包括以下几种:

需要注意的是,GCRoot对象是不可达对象的起点,而不是所有的不可达对象都是GCRoot。当对象不再被任何GCRoot引用时,它将被认为是不可达对象,并可以被垃圾回收器回收。

28、什么是Lottie动画?

29、Lottie动画的主要特点是什么?

30、Lottie动画通过什么方式解析和渲染?

31、Lottie动画在Android上的使用方法是什么?

32、Lottie动画可以实现哪些高级效果?

Lottie动画支持许多高级效果,包括:

33、Android中SVG和SVGA的区别

在Android中,SVG(Scalable Vector Graphics)和SVGA(Scalable Vector Graphics Animation)是两种不同的图形格式。
它们的区别如下:

  • SVG是一种静态的矢量图形格式,它使用XML描述图形,可以通过CSS和JavaScript进行样式和交互操作。SVG文件通常具有.svg的文件扩展名。
  • SVGA是基于SVG的矢量动画格式,它扩展了SVG,支持动画效果。SVGA文件包含了描述动画的逐帧矢量图形数据,可以通过播放器播放动画。SVGA文件通常具有.svga的文件扩展名。
  • SVG通常用于绘制静态图形,可以通过CSS和JavaScript实现一些简单的动画效果,如变换、渐变、过渡等。但SVG本身不支持复杂的逐帧动画效果。
  • SVGA是专门用于实现矢量动画的格式,它支持逐帧动画,可以实现复杂的动画效果,如位移、缩放、旋转、淡入淡出、路径动画等。
  • SVG文件通常比较小,因为它使用矢量图形描述图像,可以进行压缩,并且只需存储一份静态图像数据。
  • SVGA文件相对较大,因为它包含了描述动画的逐帧矢量图形数据,可能需要存储多帧图像数据。但SVGA文件可以进行压缩,以减小文件大小。
  • 在性能方面,由于SVG是静态图形格式,渲染和展示较为轻量,而SVGA需要进行动画渲染,可能需要较多的计算资源和时间。

总结:SVG是一种静态的矢量图形格式,适用于绘制静态图形,而SVGA是一种基于SVG的矢量动画格式,适用于实现复杂的矢量动画效果。

34、什么是SVGA?

35、SVGA的优势和特点是什么?

36、如何在Android应用中使用SVGA?

在Android应用中使用SVGA,可以按照以下步骤:

37、SVGA与其他动画格式(如GIF、APNG)的比较?

相比之下,SVGA作为一种矢量动画格式,具有更高的动画质量和更小的文件体积,适用于移动设备上播放高质量的动画效果。

38、TCP和UDP的区别

TCP(传输控制协议)和UDP(用户数据报协议)是两种常用的互联网传输协议,它们有以下几个主要区别:

总结起来,TCP提供可靠的、有序的、面向连接的数据传输,适用于对数据完整性要求较高的应用;而UDP提供快速的、无连接的数据传输,适用于对实时性要求较高的应用。

39、什么是Socket?

Socket是一种用于网络通信的编程接口,它定义了一套用于网络通信的函数或方法。通过Socket,可以实现不同计算机之间的数据传输和通信。

40、什么是WebSocket?

WebSocket是一种在单个TCP连接上进行全双工通信的协议。它允许服务器主动向客户端推送数据,而不需要客户端发送请求。WebSocket在Web开发中常用于实时通信和实时数据更新。

41、WebSocket与HTTP的区别是什么?

42、WebSocket的优势是什么?

43、socket和webSocket的区别

Socket是一种通信协议,用于在网络上进行数据传输。它提供了一种可靠的、面向连接的、全双工的通信方式,可以在客户端和服务器之间进行双向通信。
WebSocket是一种基于HTTP协议的通信协议,它允许在客户端和服务器之间进行双向通信。与传统的HTTP请求-响应模式不同,WebSocket建立了一个持久的连接,可以在任何时候进行双向通信,而不需要每次通信都建立新的连接。

以下是Socket和WebSocket的主要区别:

总的来说,Socket是一种通用的网络通信协议,可以用于各种应用场景,而WebSocket是一种基于HTTP的协议,专门用于实现实时通信。

44、Java 多线程有几种状态

Java多线程有以下几种状态:

45、java线程的join 和yield 有什么区别

Java线程的join和yield都是用于控制线程执行顺序的方法,但是它们的作用和使用方式有所不同。
1、join方法:

2、yield方法:

总结:

46、java 线程的拒绝策略有几种?

在Java中,线程池的拒绝策略有四种:

ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize,
keepAliveTime, TimeUnit.SECONDS, new LinkedBlockingQueue<>(queueSize), new ThreadPoolExecutor.AbortPolicy());

47、java 有几种创建线程的方式

Java有两种创建线程的方式:

上一篇 下一篇

猜你喜欢

热点阅读