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

kotlin 基础

文章目录

      • 1、安装 Java 和 Kotlin 环境
      • 2、程序代码基本结构
      • 3、变量的声明与使用
      • 4、数据类型
      • 5、数字类型的运算
        • 1)布尔类型
        • 2)字符类型
        • 3)字符串类型
      • 6、 选择结构
        • 1)(if - else)
        • 2) 选择结构(when)——适用于多分支结构
      • 7、循环结构
        • 1)for
        • 2)循环结构——while
      • 8、函数的定义及使用
        • 1)用 fun 关键字声明
        • 2)函数的调用
        • 3)有参数的函数
        • 4)有返回值的函数
        • 5)全局变量
        • 6)函数类型变量
          • 1 变量可以接收函数
          • 2 函数也可以接收函数
          • 3 总结
      • 9、类与对象
        • 1) 类的定义与对象的创建
        • 2) 对象的创建
        • 3)对象的初始化
        • 4)类的成员函数
        • 5) 再谈基本类型
          • a、空值和空类型
        • 6)修饰符
        • 7)封装
        • 8)继承
        • 9)属性的覆盖——多态
        • 10)接口
      • 10、数组的创建与使用
      • 11、集合类
        • 1)数组局限性
        • 2)集合的分类
        • 3)集合简介

1、安装 Java 和 Kotlin 环境

2、程序代码基本结构

fun main(args: Array<String>) {println("Hello World!")
}
  • 注意点:Kotlin 严格区分大小写

3、变量的声明与使用

fun main(args: Array<String>) {var x = 30println(x)
}// 自动判断变量类型
fun main(args: Array<String>) {var x = 30println(x)
}// 变量值赋值给变量
fun main(args: Array<String>) {var x = 30var y = xprintln(y)
}fun main(args: Array<String>) {var x = 30var y = x / 30println(y)
}fun main(args: Array<String>) {var x = 30var y = 70println(x + y)
}fun main(args: Array<String>) {var x = 30x = 20println(x)
}// 定义常量
fun main(args: Array<String>) {val x = 30  // 常量println(x)
}

4、数据类型

  • Byte、Short、Int、Long
  • Float、Double
val pi = 3.1415 // 默认推断为 Double 类型
val one : Double = 1  // 这种写法错误,无法编译通过
val one : Double = 1.0 // 这种写法是对的
val a : Float = 1.0f
  • 与其他语言不同,Kotlin 中的数字类型没有隐式转换的操作
var a:Int = 1;
var b:Double = a;  // 报错,不能隐式转换

5、数字类型的运算

1)布尔类型
var a: Boolean = false
2)字符类型
var c: Char = 'D'
3)字符串类型
    // 字符串中的字符一旦确定是无法进行修改的var str: String = "Hello World"str = "Helle World"  // 整体修改val text = "Hello\nWorld"  // 字符串中换行,需要用到转义字符		      

6、 选择结构

1)(if - else)
if 
if {}if {
} else {
}if
else if 
else if 
else if {if }// if-else 还可以用作结果判断
var score = 2
var res = if (score > 60) "Yes" else "NO"
2) 选择结构(when)——适用于多分支结构
//代码结构
when (目标) {匹配值1 -> 代码匹配值2 -> 代码匹配值3 -> 代码else -> {  // 可以没有else语句,类似于之前的 if-else if-else代码  // 如果以上条件都不满足,就进入else中}
}
val c = 'A'
when (c) {'A' -> println("尖子班")'B' -> println("中等班")'C' -> println("普通班")
}val c = 'A'
var value = when (c) {'A' -> 1'B' -> 2'C' -> 3else -> 0  // 要把所有能表示的情况都写完才不会报错(必加)
}val c : Boolean = true
var value = when (c) {true -> 1false -> 2  // 所有情况中只有这两种情况所以不用加else 
}// 某些值属于同一种情况,可以使用逗号将其条件组成一行
var x = 0;
when (x) {0, 1 -> print("x == 0 or x == 1")else -> print("otherwise")
}// in 表示区间
var score = 10;
var grade= when (score) {// 使用 in 判断目标标量值是否在指定范围in 100 .. 90 -> {println();"优秀"}in 89 .. 80 -> "良好"in 79 .. 70 -> "及格"else -> "不及格"
}

7、循环结构

1)for
// 结构
for (遍历出来的单个目标 in 可遍历目标) 循环体
  • 可遍历目标
    • 数组
    • 区间
    • 任何实现了运算符重载函数iterator的类
// 可遍历目标为区间
for (i in 1..3)println(i)val range: IntRange = 1..3
for (i in range)println(i)val range: IntRange = 1..3
var x = 0
for (i in range) {  // i 的作用范围只在括号中println(i)x = i
}
// for 循环的嵌套
for (i in 0..2) {for (j in 0..2) {println("外层 $i,内层$j")}
}
2)循环结构——while
while (循环条件) 循环体

8、函数的定义及使用

1)用 fun 关键字声明
fun 函数名称([函数参数...]): 返回类型 {// 函数体
}
// 无返回值的两种写法
fun test(): Unit {  // 返回值类型为Unit类比于其他语言中的void}fun text() {}
2)函数的调用
fun main() {test()
}
3)有参数的函数
fun text(m: String) {  // m为参数名字,String为参数类型println(m)
}
4)有返回值的函数
fun text(a: Int, b: Int) : Int{  // a,b为参数,Int 为返回值类型return a + b
}// return 关键字在执行之后,后面的内容就不能继续执行了
fun text(a: Int, b: Int) : Int{  // a,b为参数,Int 为返回值类型if (a + b > 10) return 10println("后面的函数")return a + b
}fun main(args: Array<String>) {test()  // 参数有默认值之后可以不传入实参
}   
fun test(m: String = "HelloWorld") {println(m)
}fun main(args: Array<String>) {test("Hi")  // 传入值则形参为传入的值
}
fun test(m: String = "HelloWorld") {println(m)
}fun sum(a: Int, b: Int): Int = a + b
fun sum(a: Int, b: Int) = a + b
5)全局变量
var a: Int = 10fun main(args: Array<String>) {println(a)
}fun test() {a = 20println(a)
}
var a: Int = 5get() = field + 10  // field代表变量a本身fun main(args: Array<String>) {println(a)  // 此时打印出来的是15
}fun test() {a = 20println(a)
}
// 变脸中get和set属性
// get 和 set 函数操作的就是本身变量的值
var a: Int = 5get() = field + 10  // field代表变量a本身set(value) {  // value是赋值过来的参数println("我被赋值了")field = value}fun main(args: Array<String>) {a = 90println(a)  // 此时打印出来的是15
}
6)函数类型变量
1 变量可以接收函数
// 接收String作为参数返回值为Int的函数类型var func: (String) -> Int   // (String) -> Int:String作为参数,返回值为Int的函数给变量func存储
2 函数也可以接收函数
fun test(func: (String) -> Int) {  // 形参可以为函数类型的参数}fun test(other: (Int) -> String) {println(other(1))  // 
}
3 总结
  • 函数类型的变量可以当作函数使用
  • 函数类型的变量也可以作为函数参数进行传递

9、类与对象

  • 类是一个抽象的概念,对象指具体的
1) 类的定义与对象的创建
  • 类的声明使用关键字 class 声明
class Student {
}
  • kotlin 中的类可以添加一个主构造函数和一个或多个次要构造函数,主构造函数是类定义的一部分
class Student constructor(name: String, age: Int) {  // 主构造函数的形参}// 主构造函数中的constructor也可以省去
class Student (name: String, age: Int) {}// 将构造函数的 参数变成类的属性,在变量前面添加 var或者 val
class Student (var name: String, var age: Int) {}// 属性写在类里面的时候,必须要求有初始值
class Student () {var name: String = ""val age: Int = 8
}class Student (name: String, age: Int) {  // 将传进来的参数赋值给属性var name: String = nameval age: Int = age
}
2) 对象的创建
  • 对象的创建就是通过构造函数,调用构造函数
// 引用赋值
fun main(args: Array<String>) {var p1 = Student("小明", 18)var p2 = p1  // 引用赋值,指向的是同一个对象println(p2.name)  // p2也就可以操控对象
}fun main(args: Array<String>) {var p1 = Student("小明", 18)  // 通过构造函数创建对象var p2 = p1  // 引用赋值println(p2 == p1)  // 判断p1和p2是否指向的是同一个对象,输出结果为true
}fun main(args: Array<String>) {var p1 = Student("小明", 18)var p2 = Student("小红", 19)println(p2 == p1)  // p1和p2指向的是两个不同的对象,输出结果为false
}fun main(args: Array<String>) {var p1 = Student("小明", 18)var p2 = Student("小明", 18)println(p2 == p1)  // 输出为false,通过构造函数创建出来的就是一个独立的对象
}class Student (name: String, a	ge: Int) {  // 将传进来的参数赋值给属性var name: String = nameval age: Int = age
}           
3)对象的初始化
  • 在对象创建时,我们可能需要做一些初始化工作,可以使用初始化代码块来完成,初始化代码块使用init关键字来完成,Init 函数在创建对象的时候会自动执行;
  • 例如,我们希望对象在创建时,如果年龄不足18岁,那么就设定为18岁
  • 这样在创建对象的时候,就会在创建的时候自动执行初始化代码块里面的代码了
fun main(args: Array<String>) {var stu = Student("小明", 9)}class Student (var name: String, var age: Int) {// 可以定义多个init,执行顺序为从上往下依次执行init {println("我是初始化操作")if (age < 18) age = 18println(age)println("初始化操作结束")}init {}
}
4)类的成员函数
  • 如果函数中的变量存在歧义,那么优先使用作用于最近的一个,比如函数形参的 name 作用域更近,那么这里的 name 拿到的一个是形参 name,而不是类的成员属性 name
  • 如果我们要获取的是类中的成员属性,需要使用 this 关键字来表示当前类
  • 默认情况下,如果作用域不冲突,使用类中属性 this 可以省略
fun main(args: Array<String>) {var stu = Student("小明", 19)stu.hello()
}class Student (var name: String, var age: Int) {fun hello() {println("大家好啊")}
}// 默认变量指代的就是离它最近的
class Student (var name: String, var age: Int) {fun hello(name: String) {println("大家好啊,我叫$name")  // 指代的是hello中的参数name// 使用 this 关键字表示当前对象,这样就可以指定这里是类中this中的name 属性了println("大家好啊,我叫${this.name}") // 指代的是类中属性name}
}

在类中,同样可以定义多个同名但是不同参数的函数实现重载

class Student(var name: String, var age: Int) {fun hello() = println("大家好,我叫 ${this.name},今年${age}岁")fun hello(gender: String) = println("大家好,我叫 ${this.name},今年 ${age} 岁,性别 ${gender}")
}
5) 再谈基本类型
  • Kotlin 中万物皆对象,所有变量存储的都是对象的引用
fun main(args: Array<String>) {val a: Int = 10  // Int类型的对象,值为10,而a持有的是对这个Int对象的引用val b: Double = a.toDouble()
}
fun main(args: Array<String>) {val a: Int = 10  // Int类型的对象,值为10,而a持有的是对这个Int对象的引用val b: Int = 5val c: Double = b / a.toDouble()  // 结果为0.5
}fun main(args: Array<String>) {val str: String = "10"str.length()str.toInt()
}
a、空值和空类型
  • 所有的变量除了引用一个具体的值以外,还有一种特殊的值可以使用,就是 null,它代表空值,即不引用任何对象
  • 所有的类型默认都是非空类型,非空类型的变量是不允许被赋值为 null,这直接在编译阶段就避免了其他语言中经常存在的空指针问题
fun main(args: Array<String>) {val stu: Student = null //报错
}
  • 希望某个变量在初始化情况下使用 null,而不是去引用某个具体的对象,将变量的类型修改为可空类型,只需要再类型名的后面添加一个 ? 即可
val stu: Student? = null // 正确,加了?号之后就可以为空了,不代表任何对象
6)修饰符
  • private、internal、public
7)封装
class Student(private var name: String, private var age: Int) {fun getName(): String = namefun getAge(): Int = agefun setName(name: String) {if (name.contains("刚")) returnthis.name = name}
}	
8)继承
  • Kotlin 中类是 终态的(不能被任何类继承),要使类可继承,需要用关键字 open 标记需要被继承的类
open class Student { // 可以被继承,可作为父类}class ArtStudent: Student() {  // 以调用主构造函数的形式进行声明,这个类就是Student的子类}
  • 当一个类继承另一个类时,属性会被继承,可以直接访问父类中定义的属性,除非父类中将属性的访问权限修改为 private,那么子类将无法访问
open class Student { // 可以被继承,可作为父类var name: String = "小明"fun hello() = println("大家好,我叫 $name")
}class ArtStudent: Student() {  // 以调用主构造函数的形式进行声明,这个类就是Student的子类fun test() {name  // 可以直接访问父类中的属性hello()  // 可以直接访问父类中的方法}
}
9)属性的覆盖——多态
  • 子类重写父类定义的内容
  • 有些时候,我们可以子类继承父类的某些属性,,但是我们可能希望去修改这些属性的默认实现,可以使用 override 关键字来表示对一个属性的重写(覆盖)
fun main() {var student = ArtStudent()student.hello()}open class Student { // 可以被继承,可作为父类open fun hello() = println("我会打招呼")
}class ArtStudent: Student() {  // 以调用主构造函数的形式进行声明,这个类就是Student的子类fun draw() = println("我会画画")override fun hello() {// 在子类中编写一个同名函数,并添加override关键字,就可以在子类中进行覆盖了,然后编写自己的实现println("我会画画")super.hello()  // 可以执行父类的}
}class MusicStudent: Student() {override fun hello() = println("我会唱歌")
}
10)接口
  • 定义一些所具备的功能
interface A {val x: String // 接口中所有属性默认都是abstract的(所以可省略abstract关键字)fun sleep()  // 接口中所有函数默认都是abstract的(所以可省略abstract关键字)
}interface B {fun game()
}// 用类去实现接口中的功能
// Student 实现了A和B接口,证明同时具有了A和B中的功能
class Student: A, B {  // 接口的实现和类的继承一样,直接写到后面,多个接口用逗号隔开override val x: String = "测试"  // 跟抽象类一样,接口中的内容是必须要实现的override fun game() = println("玩游戏")override fun sleep()  = println("睡觉")
}

10、数组的创建与使用

  • 存放一组相同类型的数据
  • 在kotlin中,数组是Array类型的对象
  • 在 Kotlin 中创建数组有两种创建方式:1)官方预设工具函数:arrayOf()、arrayOfNulls() 以及 emptyArray()
  • 使用类 Array 构造函数创建
val array: Array<Int> = arrayOf(7, 3, 9, 1, 6)  // 直接在arrayOf函数中添加每个元素
  • 注意:数组在创建完成后,数组容量和元素类型是固定不变的,后续无法进行修改

  • 数组元素的访问和修改

val array: Array<Int> = arrayOf(7, 3, 9, 1, 6)  // 直接在arrayOf函数中添加每个元素
println(array[0])
array[0] = 2val array: Array<Int> = arrayOf(7, 3, 9, 1, 6)  // 直接在arrayOf函数中添加每个元素
for (i in 0 until array.size) {  // 方式1println(array[i])
}for (element in array) {  // 方式2println(element)
}
  • 数组中的操作
val array1: Array<Int> = arrayOf(1, 2, 3, 4, 5)
val array2: Array<Int> = arrayOf(1, 2, 3, 4, 5)
val array3 = array1println(array1 == array2)  // 结果为false,比较是否是两个同一个对象
println(array1 == array3)  // 结果为true,因为比较的是两个相同的对象// 比较两个数组中的内容是否相同
println(array1.contentEquals(array2))  // 结果为true,两者内容相同

11、集合类

1)数组局限性
  • 长度是固定的,无法扩展 ;
  • 无法做到在数组中像列表那样进行插入和删除元素;
2)集合的分类
  • List:有序的集合,通过索引访问元素,可以包含重复元素
  • Set:不包含重复元素的集合,一般情况下不维护元素顺序
  • Map:是一组键值对,其中每个键不可重复存在,每个键都映射到恰好一个值(值可以重复存在)
  • 所有集合类都是继承自 Collection 接口(Map 除外)
3)集合简介
  • List:可以自由地在某个位置插入或删除一个元素,列表的长度也会动态发生变化
// 创建一个 listval list: MutableList<Int> = mutableListOf(1, 2, 3, 4, 5)  // 创建可变集合// 支持所有数组的操作list[0] = 10println(list)  // 格式化地打印println(list.get(1))  // 取数据list.add(9)  // 在末尾添加一个新元素list.add(1, 10)  // 在下标为1处,添加元素10,可插入范围只能是[0, size]这个闭区间内
  • Set 集合
// 创建一个Set集合
val set: Set<String> = mutableSetOf("AA", "BB", "BB", "CC")
println(set)  // 因为set中不允许出现重复元素,结果为 [AA, BB, CC]
  • Map
// 创建一个 Map
val map: MutableMap<Int, Student> = mutableMapOf(10001 to Student("小明", 18),10002 to Student("小红", 17),10003 ti Student("小刚", 16)
)
val student: Student? = map[10001]  // 使用[]运算符通过Key查找value
val student1: Student? = map[10001]  // 得到小明这个对象
val student2: Student? = map[10005]  // Map 中根本没有键为10005的键值对,所以得到结果为null
map.contains(1)  // 判断是否包含指定Key
map.containKey(1)  // 同上
10001 in map  // 同上map.containsValue(Student("小明", 18))  // 判断是否包含Value
val keys: MutableSet<Int> = map.keys   //以Set形式存储的[10001, 10002, 10003]
val value: Collection<Student> = map.values 

相关文章:

kotlin 基础

文章目录 1、安装 Java 和 Kotlin 环境2、程序代码基本结构3、变量的声明与使用4、数据类型5、数字类型的运算1&#xff09;布尔类型2&#xff09;字符类型3&#xff09;字符串类型 6、 选择结构1)&#xff08;if - else&#xff09;2&#xff09; 选择结构&#xff08;when&am…...

Spring中的适配器模式和策略模式

1. 适配器模式的应用 1.1适配器模式&#xff08;Adapter Pattern&#xff09;的原始定义是&#xff1a;将一个类的接口转换为客户期望的另一个接口&#xff0c;适配器可以让不兼容的两个类一起协同工作。 1.2 AOP中的适配器模式 在Spring的AOP中&#xff0c;使用Advice&#…...

书生浦语大模型实战营---Python task

任务一 请实现一个wordcount函数&#xff0c;统计英文字符串中每个单词出现的次数&#xff0c;通过构建defaultdict字典&#xff0c;可以避免插入值时需要判断值是否存在 from collections import defaultdictdef word_count(text):#构建缓存reval defaultdict(int)words t…...

Chrome 127内置AI大模型攻略

Chrome 127 集成Gemini:本地AI功能 Google将Gemini大模型整合进Chrome浏览器,带来全新免费的本地AI体验: 完全免费、无限制使用支持离线运行,摆脱网络依赖功能涵盖图像识别、自然语言处理、智能推荐等中国大陆需要借助魔法,懂都懂。 安装部署步骤: 1. Chrome V127 dev …...

Yolo的离线运行

Yolo 的离线运行 运行环境准备 比较简单的办法是通过官方的github获取到对应的yolo运行需要的python环境-requirement.txt.通过如下地址可以获取到对应的文件和相应的说明以及实例。 Yolov5 git地址 为了让程序能本地话运行&#xff0c;我们还需要获取相应的模型权重文件&…...

【矿井知识】煤矿动火作业

简介 煤矿动火作业是指在煤矿环境下进行的任何形式的使用火源的工作。这些工作可能包括焊接、切割、加热、打磨等操作&#xff0c;这些操作都可能产生火花、火焰或高温&#xff0c;因此被称为动火作业。 动火作业的主要类型 焊接&#xff1a;包括电弧焊、气焊等&#xff0c;…...

设计模式使用场景实现示例及优缺点(结构型模式——享元模式)

结构型模式 享元模式&#xff08;Flyweight Pattern&#xff09; 享元模式&#xff0c;作为软件设计模式中的一员&#xff0c;其核心目标在于通过共享来有效地支持大量细粒度对象的使用。在内存使用优化方面&#xff0c;享元模式提供了一种极为高效的路径&#xff0c;尤其在处…...

开放式耳机哪款比较好?五款开放式耳机测评推荐

开放式耳机真的越来越火了&#xff0c;真的好多人问我&#xff0c;开放式耳机应该怎么选啊&#xff0c;所以这次我亲自测评了几款开放式耳机&#xff0c;作为数码博主这一篇文章就教大家如何挑选开放式耳机&#xff0c;当然最后还有五款开放式耳机的推荐给到大家&#xff0c;话…...

【网络安全】实验三(基于Windows部署CA)

一、配置环境 打开两台虚拟机&#xff0c;并参照下图&#xff0c;搭建网络拓扑环境&#xff0c;要求两台虚拟的IP地址要按照图中的标识进行设置&#xff0c;并根据搭建完成情况&#xff0c;勾选对应选项。注&#xff1a;此处的学号本人学号的最后两位数字&#xff0c;1学号100…...

hive中reverse函数

目录 前言基本函数介绍实战 前言 reverse函数&#xff0c;是一个常用的字符串处理函数&#xff0c;很多编程语言都有。最近开发中&#xff0c;遇到一个reverse解决的需求&#xff0c;发现自己尚未总结过&#xff0c;遂补上。 基本函数介绍 SELECT reverse(string_column) FR…...

SimpleTrack环境配置教程

SimpleTrack环境配置教程 conda create --name SimpleTrack python3.6 conda activate SimpleTrack git clone https://github.com/tusen-ai/SimpleTrack.git cd ./SimpleTrack/ # pip install opencv-python4.5.4.58 # 安装opencv-python报错&#xff0c;可尝试安此版本 pip …...

frameworks 之Zygote

frameworks 之Zygote Zygote.rc 解析Zygote 启动ZygoteInit.javaZygote.cppLiunx fork Zygote 中文意思为受精卵。 和其意思一样&#xff0c;该功能负责android系统孵化service 和 app 进程。 本文讲解Zygote的大概流程。涉及的相同的类&#xff0c;如下所示 system/core/rootd…...

基于考研题库小程序V2.0实现倒计时功能板块和超时判错功能

V2.0 需求沟通 需求分析 计时模块 3.1.1、功能描述←计时模块用于做题过程中对每一题的作答进行30秒倒计时&#xff0c;超时直接判错&#xff0c;同时将总用时显示在界面上;记录每次做题的总用时。 3.1.2、接口描述←与判定模块的接口为超时判定&#xff0c;若单题用时超过 …...

idm站点抓取可以用来做什么 idm站点抓取能抓取本地网页吗 idm站点抓取怎么用 网络下载加速器

在下载工具众多且竞争激烈的市场中&#xff0c;Internet Download Manager&#xff08;简称IDM&#xff09;作为一款专业的下载加速软件&#xff0c;仍然能够赢得众多用户的青睐&#xff0c;这都要得益于它的强大的下载功能。我们在开始使用IDM的时候总是有很多疑问&#xff0c…...

maven7——(重要,构建项目)maven项目构建(命令)

Maven的常用命令管理项目的生命周期 clean命令 清除编译产生的target文件夹内容&#xff0c;可以配合相应命令在cmd中使用&#xff0c;如mvn clean package&#xff0c; mvn clean test D:\工作\公司培训-4班\day20\day20\untitled1>mvn clean compile命令 该命令可以…...

容联云发布容犀大模型应用,重塑企业“营销服”|WAIC 2024

7月6日&#xff0c;在2024世界人工智能大会上&#xff0c;容联云成功举办主题为“数智聚合 产业向上”的生成式应用与大模型商业化实践论坛。 论坛上&#xff0c;容联云发布了容犀智能大模型应用升级&#xff0c;该系列应用包括容犀Agent Copilot、容犀Knowledge Copilot、容犀…...

Docker 安装字体文件

由于 Docker 容器的隔离性&#xff0c;与宿主机是独立的运行环境&#xff0c;如果需要用到宿主机的字体文件就需要进行安装。 例如在导出 PDF 文件时&#xff0c;如果缺少字体文件&#xff0c;就会产生乱码&#xff08;常表现为中文变成方框&#xff09;。 Docker 字体文件的安…...

C/C++ 移动追加内容到文件尾部。

1、通过C语言文件函数库 1.1、通过追加到尾部字符命令 FILE* f fopen(file_path.data(), "ab"); 1.2、不通过追加到尾部字符命令 FILE* f fopen(path, "rb"); if (NULL ! f) { fseek(f, 0, SEEK_END); } Unix 平台&#xff08;Linux/Android/MacOS…...

ISO/OIS的七层模型②

OSI模型是一个分层的模型&#xff0c;每一个部分称为一层&#xff0c;每一层扮演固定的角色&#xff0c;互不干扰。OSI有7层&#xff0c;从上到下分别是&#xff1a; 一&#xff0c;每层功能 7.应用层&#xff08;Application layer &#xff09;&#xff1a;应用层功能&#x…...

美团到家平台业务探索

背景 到家业务发展已经近10年&#xff0c;目前最为火热的应该有美团到家、抖音到家等&#xff0c;这种极具挑战性的业务&#xff0c;值得学习和思考。 既然是服务平台化&#xff0c;那一定是兼容了多种业务以及多种模式。 挑战 订单、骑手规模大&#xff0c;供需匹配过程的…...

React -- useState状态更新异步特性——导致获取值为旧值的问题

useState状态异步更新 问题导致的原因解决办法进一步分析后续遇到的新问题 问题 const [isSelecting, setIsSelecting] useState(false);useEffect(() > {const handleKeyDown (event) > {if (event.key Escape) {if(isSelectingRef){//.......setIsSelecting(!isSele…...

哪款开放式耳机是2024年最值得购买的?五大品质好物揭秘

相比于入耳式耳机压耳、堵耳&#xff0c;佩戴不稳固等缺陷&#xff0c;开放式耳机的佩戴舒适性和安全性都更胜一筹&#xff0c;这几年成为了越来越多年轻人的“音乐搭子”。面对市面上各式各样的开放式耳机&#xff0c;相信大家在挑选上就得下大把功夫&#xff0c;选择上也有困…...

深圳天童美语:小暑习俗知多少

小暑已至&#xff0c;炎炎夏日正当时。在这个充满生机的节气里&#xff0c;除了我们熟悉的吃冰、游泳等消暑方式&#xff0c;还有许多有趣且富含文化内涵的小暑习俗。今天&#xff0c;深圳天童美语就带你一起解锁这些习俗&#xff0c;感受那份独特的夏日风情&#xff01;    …...

递归参数中递增运算符的使用

backtrack(k,n,sum,i1); backtrack(k,n,sum,i); 在 C 中&#xff0c;递增运算符 i 和表达式 i1 之间有显著的区别&#xff1a; i 是后置递增运算符&#xff0c;表示先使用 i 的当前值&#xff0c;然后将 i 加 1。i1 是一个简单的算术运算&#xff0c;返回 i 的当前值加 1&…...

Python功能制作之获取CSDN所有发布文章的对应数据

大家好&#xff0c;今天我要分享的是一个实用的Python脚本&#xff0c;它可以帮助你批量获取CSDN博客上所有发布文章的相关数据&#xff0c;并将这些数据保存到Excel文件中。此外&#xff0c;脚本还会为每篇文章获取一个质量分&#xff0c;并将这个分数也记录在Excel中。让我们…...

Backend - C# 基础知识

目录 一、程序结构 &#xff08;一&#xff09;内容 1. 命名空间声明 Namespace 2. 一个 class 类 3. class 方法&#xff08;类方法&#xff09; 4. class 属性 5. 一个 main 方法&#xff08;程序入口&#xff09; 6. 语句&表达式 7. 注释 &#xff08;二&#xff09;举例…...

HTML5新增的input元素类型:number、range、email、color、date等

HTML5 大幅度地增加与改良了 input 元素的种类&#xff0c;可以简单地使用这些元素来实现 HTML5 之前需要使用 JavaScript 才能实现的许多功能。 到目前为止&#xff0c;大部分浏览器都支持 input 元素的种类。对于不支持新增 input 元素的浏览器&#xff0c;input 元素被统一…...

00 Debian字符界面如何支持中文

作者&#xff1a;网络傅老师 特别提示&#xff1a;未经作者允许&#xff0c;不得转载任何内容。违者必究&#xff01; Debian字符界面如何支持中文 《傅老师Debian知识库系列之00》——原创 前言 傅老师Debian知识库特点&#xff1a; 1、拆解Debian实用技能&#xff1b; 2、…...

以太网中的各种帧结构

帧结构&#xff08;Ethernet Frame Structure&#xff09;介绍 以太网信号帧结构&#xff08;Ethernet Signal Frame Structure&#xff09;&#xff0c;有被称为以太网帧结构&#xff0c;一般可以分为两类 —— 数据帧和管理帧。 按照 IEEE 802.3&#xff0c;ISO/IEC8803-3 …...

C++入门基础题:数组元素逆序(C++版互换方式)

1.题目&#xff1a; 数组元素逆置案例描述: 请声明一个5个元素的数组&#xff0c;并且将元素逆置. (如原数组元素为:1,3,2,5,4;逆置后输出结果为:4,5,2,3,1) 2.图解思路&#xff1a; 3.代码演示&#xff1a; #include<iostream>using namespace std;int main(){int a…...