当前位置: 首页 > news >正文

Flutter开发者必备面试问题与答案02

Flutter开发者必备面试问题与答案02

Flutter开发者必备面试问题与答案02

视频

https://youtu.be/XYSxTb0iA9I

https://www.bilibili.com/video/BV1Zk2dYyEBr/

前言

原文 Flutter 完整面试问题及答案02

本文是 flutter 面试问题的第二讲,高频问答 10 题。

正文

11. PageRoute 是什么?

在 Flutter 中,PageRoute 是一个用于管理应用中页面导航的抽象类。它定义了如何在不同的页面之间进行切换,并提供了一些控制页面行为的功能。

主要特点

  • 页面切换PageRoute 负责在不同页面(或屏幕)之间进行导航。它管理了页面的堆栈,使得用户可以前往新页面或返回到之前的页面。

  • 动画效果PageRoute 可以定义页面切换时的动画效果。Flutter 提供了一些内置的路由实现,比如:

    • MaterialPageRoute:用于 Material Design 风格的应用,提供从底部向上推入页面的动画。

    • CupertinoPageRoute:用于 iOS 风格的应用,提供从右向左推入页面的动画。

  • 生命周期管理PageRoute 提供了一些生命周期方法,如 didChangeDependenciesdispose,用于在页面进入和退出时执行特定操作。

使用示例

下面是一个使用 MaterialPageRoute 的简单示例:

import 'package:flutter/material.dart';void main() {runApp(MyApp());
}class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(home: HomePage(),);}
}class HomePage extends StatelessWidget {Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('Home Page')),body: Center(child: ElevatedButton(child: Text('Go to Second Page'),onPressed: () {Navigator.push(context,MaterialPageRoute(builder: (context) => SecondPage()),);},),),);}
}class SecondPage extends StatelessWidget {Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('Second Page')),body: Center(child: Text('Welcome to the Second Page!'),),);}
}

自定义 PageRoute

你可以创建自定义的 PageRoute 来实现特定的导航效果。例如,以下是一个简单的自定义路由实现:

class CustomPageRoute extends PageRouteBuilder {final Widget page;CustomPageRoute({required this.page}): super(pageBuilder: (context, animation, secondaryAnimation) => page,transitionsBuilder: (context, animation, secondaryAnimation, child) {const begin = Offset(1.0, 0.0);const end = Offset.zero;const curve = Curves.easeInOut;var tween = Tween(begin: begin, end: end).chain(CurveTween(curve: curve));var offsetAnimation = animation.drive(tween);return SlideTransition(position: offsetAnimation,child: child,);},);
}

12. 解释 async , await 和 Future ?

在 Flutter 和 Dart 中,asyncawaitFuture 是处理异步编程的关键概念。它们可以帮助你编写非阻塞的代码,使得应用能够在执行长时间运行的任务时保持响应。以下是对这三个概念的详细解释:

1. Future

  • 定义Future 是一个表示可能在未来某个时间点完成的异步操作的对象。它可以用于表示一个延迟的值,通常用于处理异步任务的结果。

  • 状态

    • 未完成(Pending):Future 仍在进行中。
    • 已完成(Completed):Future 执行完毕,可以获取结果。
    • 已失败(Error):Future 执行过程中出现错误。
  • 使用示例

    Future<String> fetchData() async {// 模拟网络请求await Future.delayed(Duration(seconds: 2));return 'Data fetched';
    }
    

2. async

  • 定义async 是一个修饰符,用于声明一个异步函数。使用 async 修饰的函数会返回一个 Future,即使函数内部没有显式地返回 Future

  • 特点

    • async 函数中,你可以使用 await 关键字等待一个 Future 完成。
    • async 函数会自动将返回值包装在一个 Future 中。
  • 使用示例

    Future<void> loadData() async {String data = await fetchData();print(data); // 输出 'Data fetched'
    }
    

3. await

  • 定义await 是一个关键字,用于在 async 函数中等待一个 Future 完成,并返回其结果。

  • 特点

    • await 只能在 async 函数中使用。
    • 使用 await 会暂停 async 函数的执行,直到 Future 完成,并返回结果。
    • await 让异步代码看起来像同步代码,从而提高代码的可读性。
  • 使用示例

    Future<void> main() async {print('Fetching data...');await loadData(); // 等待 loadData 完成print('Data loaded');
    }
    

整体示例

下面是一个完整的示例,展示了如何使用 asyncawaitFuture

import 'dart:async';Future<String> fetchData() async {// 模拟网络请求await Future.delayed(Duration(seconds: 2));return 'Data fetched';
}Future<void> loadData() async {String data = await fetchData();print(data);
}Future<void> main() async {print('Fetching data...');await loadData(); // 等待 loadData 完成print('Data loaded');
}
  • Future:表示一个异步操作的结果,可以是未完成、已完成或已失败。
  • async:用于声明异步函数,返回一个 Future
  • await:在 async 函数中等待一个 Future 完成,并获取其结果。

通过使用 asyncawaitFuture,你可以轻松地处理异步操作,使代码更加简洁和可读。


13. 你如何动态更新列表视图?

在 Flutter 中,动态更新列表视图通常使用 ListView 组件结合状态管理来实现。以下是几种常见的方法来动态更新列表视图:

1. 使用 StatefulWidget

利用 StatefulWidgetsetState() 方法,可以在更新数据时重新构建列表。

示例:
import 'package:flutter/material.dart';void main() {runApp(MyApp());
}class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(home: DynamicList(),);}
}class DynamicList extends StatefulWidget {_DynamicListState createState() => _DynamicListState();
}class _DynamicListState extends State<DynamicList> {List<String> items = ['Item 1', 'Item 2', 'Item 3'];void _addItem() {setState(() {items.add('Item ${items.length + 1}');});}Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('Dynamic List')),body: ListView.builder(itemCount: items.length,itemBuilder: (context, index) {return ListTile(title: Text(items[index]),);},),floatingActionButton: FloatingActionButton(onPressed: _addItem,child: Icon(Icons.add),),);}
}

2. 使用 Provider 或其他状态管理

如果你的应用较复杂,使用状态管理库(如 ProviderBlocRiverpod 等)可以更好地管理状态和更新列表视图。

示例(使用 Provider):

首先,添加 provider 依赖到 pubspec.yaml

dependencies:provider: ^6.0.0

然后,创建一个 ChangeNotifier 类来管理状态:

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';void main() {runApp(ChangeNotifierProvider(create: (context) => ItemList(),child: MyApp(),),);
}class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(home: DynamicList(),);}
}class ItemList extends ChangeNotifier {List<String> items = ['Item 1', 'Item 2', 'Item 3'];void addItem() {items.add('Item ${items.length + 1}');notifyListeners();}
}class DynamicList extends StatelessWidget {Widget build(BuildContext context) {final itemList = Provider.of<ItemList>(context);return Scaffold(appBar: AppBar(title: Text('Dynamic List')),body: ListView.builder(itemCount: itemList.items.length,itemBuilder: (context, index) {return ListTile(title: Text(itemList.items[index]),);},),floatingActionButton: FloatingActionButton(onPressed: () {itemList.addItem();},child: Icon(Icons.add),),);}
}

3. 使用 StreamBuilder

如果数据来自异步源(如网络请求或数据库),可以使用 StreamBuilder 来动态更新列表。

示例:

import 'dart:async';
import 'package:flutter/material.dart';void main() {runApp(MyApp());
}class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(home: StreamList(),);}
}class StreamList extends StatelessWidget {final StreamController<String> _controller = StreamController<String>();void _addItem() {_controller.sink.add('Item ${DateTime.now()}');}Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('Stream List')),body: StreamBuilder<String>(stream: _controller.stream,builder: (context, snapshot) {if (snapshot.hasData) {return ListTile(title: Text(snapshot.data!));}return Center(child: Text('No items'));},),floatingActionButton: FloatingActionButton(onPressed: _addItem,child: Icon(Icons.add),),);}void dispose() {_controller.close();super.dispose();}
}

14. stream 是什么?

在 Flutter 和 Dart 中,Stream 是一种用于处理异步数据流的机制。它允许你接收一系列异步事件,而不仅仅是单个值。Streams 非常适合处理动态数据源,例如用户输入、网络请求、文件读取等。

主要特点

  • 异步数据处理

    • Stream 允许你以异步的方式接收数据,不会阻塞当前线程。这使得应用在处理数据时仍然能够保持响应。
  • 多个值

    • Future 只返回一个单一值不同,Stream 可以发送多个值,可以是事件、消息或数据。
  • 监听

    • 你可以通过添加监听器(Listener)来接收来自 Stream 的数据。每当 Stream 中有新数据可用时,监听器会被调用。

Stream 的类型

  • 单订阅 Stream

    • 只能有一个订阅者,适合处理一次性事件流,例如从文件读取数据。
  • 广播 Stream

    • 可以有多个订阅者,适合处理需要广播给多个监听者的事件,例如用户输入或网络请求。

基本使用示例

以下是一个简单的 Stream 使用示例,展示了如何创建和监听 Stream:

import 'dart:async';void main() {// 创建一个单订阅 StreamStream<int> numberStream = Stream<int>.periodic(Duration(seconds: 1), (count) => count);// 监听 StreamnumberStream.listen((number) {print('Received number: $number');});
}

停止监听

你可以通过调用 cancel() 方法来停止监听 Stream:

import 'dart:async';void main() {Stream<int> numberStream = Stream<int>.periodic(Duration(seconds: 1), (count) => count);var subscription = numberStream.listen((number) {print('Received number: $number');if (number >= 5) {subscription.cancel(); // 停止监听}});
}

使用 StreamBuilder

在 Flutter 中,通常使用 StreamBuilder 来构建 UI,自动响应 Stream 的数据变化。下面是一个使用 StreamBuilder 的示例:

import 'dart:async';
import 'package:flutter/material.dart';void main() {runApp(MyApp());
}class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(home: StreamExample(),);}
}class StreamExample extends StatelessWidget {final Stream<int> numberStream = Stream<int>.periodic(Duration(seconds: 1), (count) => count);Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('Stream Example')),body: Center(child: StreamBuilder<int>(stream: numberStream,builder: (context, snapshot) {if (snapshot.connectionState == ConnectionState.waiting) {return CircularProgressIndicator();} else if (snapshot.hasError) {return Text('Error: ${snapshot.error}');} else {return Text('Received number: ${snapshot.data}');}},),),);}
}

15. keys 在 Flutter 中是什么,你什么时候应该使用它?

在 Flutter 中,Keys 是一个用于标识 Widget 的对象,帮助 Flutter 识别和管理 Widget 的状态。Keys 在构建和更新 Widget 时起到重要作用,尤其是在涉及到状态管理、列表和动画时。

Keys 的类型

  • GlobalKey

    • 用于跨 Widget 树访问状态。可以在不同的地方引用同一个 Widget 的状态。

    • 示例:在页面间导航时,保持表单状态。

  • ValueKey

    • 根据给定的值来识别 Widget,通常用于列表中的元素。

    • 示例:在列表中修改顺序时,确保正确更新每个元素的状态。

  • ObjectKey

    • 通过对象的引用来识别 Widget,适用于需要比较对象的情况。
  • UniqueKey

    • 每次创建时都会生成一个唯一的 Key,适合临时 Widget。

使用场景

列表的动态更新

  • 当你在列表中添加、删除或重新排序项时,使用 Keys 可以帮助 Flutter 确定哪些 Widget 需要更新,从而避免不必要的重建。
ListView.builder(itemCount: items.length,itemBuilder: (context, index) {return ListTile(key: ValueKey(items[index]), // 使用 ValueKeytitle: Text(items[index]),);},
);

保持状态

  • 使用 GlobalKey 时,可以在 Widget 重建时保留其状态。例如,在使用 Form 组件时,可以通过 GlobalKey 访问表单状态。
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();Form(key: _formKey,child: TextFormField(// ...),
);

动画和过渡

  • 在使用动画时,Keys 可以帮助 Flutter 确定哪个 Widget 应该保持其状态或动画效果,从而实现更流畅的过渡。

构建条件 Widget

  • 当根据某些条件创建 Widget 时,使用 Keys 可以确保 Flutter 正确管理这些 Widget 的状态。

16. GlobalKeys 是什么?

在 Flutter 中,GlobalKey 是一种特殊的 Key,用于跨 Widget 树访问状态和方法。GlobalKey 允许你在不同的 Widget 之间共享状态,特别是在使用 StatefulWidget 时。它的主要用途是确保在 Widget 树重建时仍能保留和访问 Widget 的状态。

GlobalKey 的特点

  • 跨 Widget 树访问

    • GlobalKey 允许你从不同的地方访问同一个 Widget 的状态。使用 GlobalKey,你可以在 Widget 的外部调用其状态方法,比如在表单中验证字段。
  • 唯一性

    • 每个 GlobalKey 都是唯一的,因此 Flutter 能够确保在 Widget 树中识别每个 Widget。
  • 持久性

    • 当 Widget 被重建时,GlobalKey 保持对其状态的引用,因此可以在重建过程中保持状态。

使用场景

  • 表单状态管理
    • 在处理表单时,你可以使用 GlobalKey 来访问和验证表单的状态。
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
Widget build(BuildContext context) {return Form(key: _formKey,child: Column(children: [TextFormField(validator: (value) {if (value == null || value.isEmpty) {return 'Please enter some text';}return null;},),ElevatedButton(onPressed: () {if (_formKey.currentState?.validate() ?? false) {// 处理表单提交}},child: Text('Submit'),),],),);
}
  • 控制 Widget 的状态

    • 使用 GlobalKey 可以直接控制 Widget 的状态方法,比如在动画中调用。
  • 在复杂布局中保持状态

    • 当你的 Widget 树结构复杂,且多个子 Widget 可能会被重建时,GlobalKey 可以帮助你保持子 Widget 的状态。

17. 何时应使用 mainAxisAlignment 和 crossAxisAlignment?

mainAxisAlignment


18. 你什么时候可以使用 double.INFINITY ?

当你希望该小部件的大小与父小部件相同,请允许


19. Ticker 、 Tween 和 AnimationController 是什么?

在 Flutter 中,TickerTweenAnimationController 是用于实现动画的关键组件。它们各自有不同的角色和功能,下面是对它们的详细解释:

1. Ticker

  • 定义Ticker 是一个用于生成时间片的对象,它会在每一帧(frame)中调用一个回调函数。它通常与动画相关联,并用于控制动画的更新频率。

  • 工作原理

    • Ticker 会在每一帧调用回调,并提供当前的时间戳。你可以使用这个时间戳来更新动画的状态。
  • 使用场景

    • 通常在自定义动画或使用 AnimationController 时,Ticker 是由 AnimationController 自动创建和管理的。

2. Tween

  • 定义Tween 是一个用于定义动画起始值和结束值的对象。它帮助你在动画的不同状态之间插值(interpolate)。

  • 工作原理

    • Tween 接受两个值,分别是起始值和结束值,然后在这两个值之间生成中间值。你可以使用 Tween 来处理各种类型的值,例如颜色、尺寸、位置等。
  • 使用示例

    Tween<double> tween = Tween<double>(begin: 0.0, end: 1.0);
    double value = tween.transform(0.5); // value = 0.5
    

3. AnimationController

  • 定义AnimationController 是一个特殊的 Animation,它可以控制动画的播放。它负责管理动画的生命周期,包括启动、停止、反转等。

  • 工作原理

    • AnimationController 需要一个 vsync 参数,这通常是 SingleTickerProviderStateMixinTickerProviderStateMixin 的实例。它生成一个从 0.0 到 1.0 的值,表示动画的进度。
  • 使用场景

    • 在需要控制动画的开始、停止和反转时使用 AnimationController

示例:结合使用 Ticker、Tween 和 AnimationController

以下是一个简单的示例,展示如何使用 TickerTweenAnimationController 创建一个动画:

import 'package:flutter/material.dart';void main() {runApp(MyApp());
}class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(home: AnimatedBox());}
}class AnimatedBox extends StatefulWidget {_AnimatedBoxState createState() => _AnimatedBoxState();
}class _AnimatedBoxState extends State<AnimatedBox> with SingleTickerProviderStateMixin {late AnimationController _controller;late Animation<double> _animation;void initState() {super.initState();_controller = AnimationController(duration: const Duration(seconds: 2),vsync: this,);_animation = Tween<double>(begin: 0.0, end: 300.0).animate(_controller);_controller.forward(); // 启动动画}void dispose() {_controller.dispose(); // 释放资源super.dispose();}Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('Animation Example')),body: Center(child: AnimatedBuilder(animation: _animation,builder: (context, child) {return Container(width: _animation.value,height: _animation.value,color: Colors.blue,);},),),);}
}
  • Ticker:用于生成时间片,通常与动画相关联。
  • Tween:定义动画的起始值和结束值,用于在值之间插值。
  • AnimationController:控制动画的播放,包括启动、停止和反转。它生成一个时间值(通常在 0.0 到 1.0 之间),用于与 Tween 结合使用。

20. ephemeral 状态是什么?

在 Flutter 中,ephemeral 状态(短暂状态)指的是一种状态,它是局部的、短期的,并且只在当前 Widget 的生命周期内有效。这种状态通常不需要持久化,也不需要在 Widget 树之外共享。

特点

  • 局部性

    • Ephemeral 状态通常只与一个特定的 Widget 相关联。它不会影响其他 Widget。
  • 短暂性

    • 该状态在 Widget 被创建时存在,在 Widget 被销毁时消失。它不需要跨多个 Widget 或屏幕保持。
  • 使用 StatefulWidget

    • Ephemeral 状态通常通过 StatefulWidget 来管理。StatefulWidgetState 对象可以包含所有的局部状态。

使用场景

  • 用户输入:例如,文本框的内容、复选框的选中状态等。
  • 动画状态:例如,动画的当前进度或状态。
  • UI 状态:例如,按钮的启用和禁用状态、加载指示器的可见性等。

示例

下面是一个简单的例子,演示如何在 StatefulWidget 中管理 ephemeral 状态:

import 'package:flutter/material.dart';void main() {runApp(MyApp());
}class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(home: Counter());}
}class Counter extends StatefulWidget {_CounterState createState() => _CounterState();
}class _CounterState extends State<Counter> {int _count = 0; // 这是一个 ephemeral 状态void _incrementCounter() {setState(() {_count++; // 更新局部状态});}Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('Ephemeral State Example')),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: [Text('You have pushed the button this many times:'),Text('$_count',style: Theme.of(context).textTheme.headline4,),],),),floatingActionButton: FloatingActionButton(onPressed: _incrementCounter,tooltip: 'Increment',child: Icon(Icons.add),),);}
}

Ephemeral 状态是 Flutter 中一种局部且短期存在的状态,适合用于管理特定 Widget 的状态。它通过 StatefulWidget 管理,适用于用户输入、动画和 UI 状态等场景。与之相对的是 app 状态(应用状态),后者是需要在多个 Widget 之间共享的持久状态。


小结

感谢阅读本文

如果有什么建议,请在评论中让我知道。我很乐意改进。


猫哥 APP

  • SaaS Fast
  • Flutter GetX Generator

flutter 学习路径

  • Flutter 优秀插件推荐
  • Flutter 基础篇1 - Dart 语言学习
  • Flutter 基础篇2 - 快速上手
  • Flutter 实战1 - Getx Woo 电商APP
  • Flutter 实战2 - 上架指南 Apple Store、Google Play
  • Flutter 基础篇3 - 仿微信朋友圈
  • Flutter 实战3 - 腾讯即时通讯 第一篇
  • Flutter 实战4 - 腾讯即时通讯 第二篇

© 猫哥
ducafecat.com

end

相关文章:

Flutter开发者必备面试问题与答案02

Flutter开发者必备面试问题与答案02 视频 https://youtu.be/XYSxTb0iA9I https://www.bilibili.com/video/BV1Zk2dYyEBr/ 前言 原文 Flutter 完整面试问题及答案02 本文是 flutter 面试问题的第二讲&#xff0c;高频问答 10 题。 正文 11. PageRoute 是什么&#xff1f; …...

拥抱真实:深度思考之路,行动力的源泉

在纷繁复杂的现代社会&#xff0c;人们往往被表象迷惑&#xff0c;忙碌于各种事务之中&#xff0c;却很少停下来进行深度思考。这种忙碌往往是表面的、无效的&#xff0c;因为它缺乏对自我和目标的深刻理解与追求。提升行动力&#xff0c;避免假勤奋&#xff0c;关键在于深度思…...

【Python爬虫实战】深入理解Python异步编程:从协程基础到高效爬虫实现

#1024程序员节&#xff5c;征文# &#x1f308;个人主页&#xff1a;易辰君-CSDN博客 &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html ​ 目录 前言 一、异步 &#xff08;一&#xff09;核心概念 &#xff08;二&#xff09;…...

OpenCV图像处理方法:腐蚀操作

腐蚀操作 前提 图像数据为二值的&#xff08;黑/白&#xff09; 作用 去掉图片中字上的毛刺 显示图片 读取一个图像文件&#xff0c;并在一个窗口中显示它。用户可以查看这个图像&#xff0c;直到按下任意键&#xff0c;然后程序会关闭显示图像的窗口 # cv2是OpenCV库的P…...

PG数据库之流复制详解

一、流复制的定义 PostgreSQL流复制&#xff08;Streaming Replication&#xff09;是一种数据复制技术&#xff0c;它允许实时传输数据更改&#xff0c;从而在主服务器和一个或多个备用服务器之间保持数据同步。流复制是PostgreSQL数据库管理系统&#xff08;DBMS&#xff09…...

Python酷库之旅-第三方库Pandas(174)

目录 一、用法精讲 801、pandas.Categorical类 801-1、语法 801-2、参数 801-3、功能 801-4、返回值 801-5、说明 801-6、用法 801-6-1、数据准备 801-6-2、代码示例 801-6-3、结果输出 802、pandas.Categorical.from_codes方法 802-1、语法 802-2、参数 802-3、…...

【Linux网络】基于TCP的全连接队列与文件、套接字、内核之间的关系

W...Y的主页 &#x1f60a; 代码仓库管理&#x1f495; 前言&#xff1a;之前我们已经学习了TCP传输协议&#xff0c;而无论是TCP还是UDP都是使用socket套接字进行网络传输的&#xff0c;而TCP的socket是比UDP复杂的&#xff0c;当时我们学习TCPsocket编程时使用listen函数进行…...

IDE(集成开发环境)

IDE&#xff08;集成开发环境&#xff09;是软件开发过程中不可或缺的工具&#xff0c;它集成了代码编写功能、分析功能、编译器、调试器等开发工具&#xff0c;旨在提高开发效率。不同的IDE支持不同的语言和框架&#xff0c;下面是一些通用的IDE使用技巧和插件推荐&#xff0c…...

一键导入Excel到阿里云PolarDB-MySQL版

今天&#xff0c;我将分享如何一键导入Excel到阿里云PolarDB-MySQL版数据库。 准备数据 这里&#xff0c;我们准备了一张excel表格如下&#xff1a; 连接到阿里云PolarDB 打开的卢导表&#xff0c;点击新建连接-选择阿里云PolarDB-MySQL版。如果你还没有这个工具&#xff0c;…...

Oracle有哪些版本

目录 Oracle 1(1979年) Oracle 2(1983年) Oracle 7(1992年) Oracle 8i(1999年) Oracle 9i(2001年) Oracle 10g(2004年) Oracle 11g(2007年) Oracle 12c(2013年) Oracle 18c(2018年) Oracle 19c(2019年) Oracle 21c(2023年) Oracle 23ai(202…...

先来先服务(FCFS,First-Come, First-Served)调度算法

有利于CPU繁忙作业的原因 充分利用CPU资源&#xff1a; 当一个CPU繁忙型的作业到达后&#xff0c;它会立即被执行&#xff0c;并且在没有其他作业等待的情况下&#xff0c;可以一直占用CPU直到完成。这使得CPU能够持续地执行作业&#xff0c;最大化利用CPU资源。 减少上下文切换…...

Windows操作系统忘记密码怎么办 这个方法屡试不爽 还不来试一下

Windows操作系统重置密码的操作步骤如下&#xff1a; 本方法适用于Windows Server 2008R2及其之后的操作系统。 第一步&#xff1a;从Windows 2008R2之后的操作系统光盘启动到安装界面&#xff0c;一直下一步到磁盘分区界面&#xff0c;按shiftF10调出cmd命令行界面。 第二步&…...

基于java的山区环境监督管理系统(源码+定制+开发)环境数据可视化、环境数据监测、 环境保护管理 、污染防治监测系统 大数据分析

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…...

jQuery Mobile 表单输入

jQuery Mobile 表单输入 引言 在移动设备上,表单输入是用户与移动应用交互的重要方式。jQuery Mobile 是一个基于 jQuery 的移动设备友好的开发框架,它提供了丰富的组件和工具来帮助开发者创建响应式和交互式的移动界面。本文将详细介绍如何使用 jQuery Mobile 来创建和定制…...

IoC详解

共有两类注解类型可以实现&#xff1a; 1. 类注解&#xff1a;Controller、Service、Repository、Component、Configuration. 2. 方法注解&#xff1a;Bean. 类注解 Controller&#xff08;控制器存储&#xff09; 使⽤Controller存储bean的代码如下所⽰&#xff1a; Con…...

基于 ThinkPHP+Mysql 灵活用工_灵活用工系统_灵活用工平台

基于 ThinkPHPMysql 灵活用工灵活用工平台灵活用工系统灵活用工小程序灵活用工源码灵活用工系统源码 开发语言 ThinkPHPMysql 源码合作 提供完整源代码 软件界面展示 一、企业管理后台 二、运用管理平台 三、手机端...

etcd之etcd分布式锁及事务(四)

1、etcd分布式锁及事务 1.1 前言 分布式锁是控制分布式系统之间同步访问共享资源的一种方式。在分布式系统中&#xff0c;常常需要协调他们的动作。如 果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源&#xff0c;那么访问这些资源的时候&#xff0c;往往需要…...

智慧旅游微信小程序平台

作者介绍&#xff1a;✌️大厂全栈码农|毕设实战开发&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 &#x1f345;获取源码联系方式请查看文末&#x1f345; 推荐订阅精彩专栏 &#x1f447;&#x1f3fb; 避免错过下次更新 Springboot项目精选实战案例 更多项目…...

C++设计模式创建型模式———简单工厂模式、工厂方法模式、抽象工厂模式

文章目录 一、引言二、简单工厂模式三、工厂方法模式三、抽象工厂模式四、总结 一、引言 创建一个类对象的传统方式是使用关键字new &#xff0c; 因为用 new 创建的类对象是一个堆对象&#xff0c;可以实现多态。工厂模式通过把创建对象的代码包装起来&#xff0c;实现创建对…...

C++ 类与对象(中) 默认成员函数

我们知道在类中&#xff0c;有成员变量和成员函数&#xff0c;我们可以通过创造不同的成员函数来实现这个类不同的功能&#xff0c;如果我们创造一个类&#xff0c;却不实现它的成员函数会如何呢&#xff1f;这个就涉及到类中的默认成员函数的概念了。但在本文我们主要介绍以下…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...