Kotlin 基础语法

1. 🌟 Kotlin:Java 的“超级进化体”?
Kotlin 是一门由 JetBrains 开发的 现代静态类型编程语言,支持 JVM、Android、JavaScript、Native 等多平台:

Kotlin 与 Java 深度兼容,Kotlin 会编译为 JVM 字节码,与 Java 共享运行环境(JVM);并且 Kotlin 与 Java 之间拥有 100% 互操作性,这意味着 Kotlin 可以和所有现有的 Java 源代码和库配合使用,即在同一项目中可混合调用 Java 和 Kotlin 代码。这样的特性允许公司逐步从 Java 迁移到 Kotlin,而无需重写整个项目。
2. 安装 Java 和 Kotlin 开发环境
你可以通过以下几种方式来开始 Kotlin 开发:
- 使用 IntelliJ IDEA 或 Android Studio: 这两款工具都原生支持 Kotlin,可以直接创建 Kotlin 项目。
- 使用在线 Kotlin 编译器: 如果你不想安装任何东西,可以访问 Kotlin 官方在线编译器,直接在浏览器中编写、运行 Kotlin 代码。
3. Kotlin 基础语法
输出 Hello World 示例:
fun main() {println("Hello, World!")
}
fun
是定义函数的关键字,main
是程序的入口函数。println
用来输出信息到控制台。
4. 变量和常量
在开始使用变量之前,我们必须先声明它。为了声明变量,Kotlin 提供了两个关键字 声明变量:
var
(for variable)val
(for value)
4.1. 变量
变量是程序中最常用的元素之一。变量是值的存储,可以是字符串、数字或其他内容。每个变量都有一个名称(或标识符)以区别于其他变量。可以通过变量的名称访问值。
Kotlin 中使用 var
关键字声明一个变量:
fun main() {var age: Int = 25println("初始年龄:$age")age = 26 // 修改变量值println("修改后的年龄:$age")
}
控制台输出结果:
4.2. 常量
变量是程序中最常用的元素之一。常量是不可变的变量,一旦初始化后不能再改变它的值。Kotlin 提供了 val
和 const
两种方式来声明常量。
4.2.1. 使用 val
声明常量
val
声明只读变量,即在运行时一旦赋值后不能再改变它的值。虽然 val
声明的变量不能重新赋值,但它在运行时是可以参与计算的。
fun main() {val pi: Double = 3.14159 // 声明一个常量 piprintln("圆周率的值是:$pi")
}
运行结果:
圆周率的值是:3.14159
如果我们试图修改只读变量的值时,IDEA 会提示 Val cannot be reassigned
错误:
🐖
val
只保证了变量引用的不可变性(对于引用类型),虽然禁止重新分配变量,但对引用类型的对象内部状态是允许修改的。
4.2.2. 使用 const
声明编译时常量
const
关键字声明编译时常量(带有 val),必须是在编译时就确定变量的值。通常用于声明那些在程序运行期间不会改变的值,并且在整个程序中是常量。它只能用于 Top-level
(顶层)变量或 object
中的属性,且必须是基本数据类型(例如 Int
, Double
, String
等)。
const val PI : Double = 3.14159 // 声明一个常量 pifun main() {println("圆周率的值是:$PI")
}
运行结果:
圆周率的值是:3.14159
当我们在局部函数或类的成员变量中使用 const
声明常量时,IDEA 会提示 Modifier 'const' is not applicable to 'local variable'
错误:
4.3. 命名规则
在声明变量时,我们需要遵循一些基本的命名规则和惯例:
4.3.1 基本命名规则
- 变量名必须由字母、数字和下划线组成,但必须以字母或下划线开头。
- Kotlin 是区分大小写的语言,变量
name
和Name
是不同的。 - 避免使用 Kotlin 关键字(例如
if
,while
,return
,val
,var
等),它们不能作为变量名。如果确实需要使用关键字,可以通过反引号(`
)包裹来实现。
4.3.2 命名惯例
- 变量:使用 小写字母 和 驼峰命名法(camelCase) 来命名变量
- 常量:使用 全大写字母 和 下划线 分隔单词(
UPPER_SNAKE_CASE
) - 类名和接口:使用 大驼峰命名法(PascalCase),即每个单词的首字母大写
- 函数:使用 小写字母 和 驼峰命名法(camelCase)
- 属性:使用 小写字母 和 驼峰命名法(camelCase)
5. 数据类型
5.1. 基本数据类型
Kotlin 是强类型语言,提供了多种基本数据类型,涵盖了数值、布尔、字符以及字符串:
- 数值类型:
Int
,Long
,Short
,Byte
,Double
,Float
- 布尔类型:
Boolean
- 字符类型:
Char
- 字符串类型:
String
5.1.1. 数值类型
-
Int: 整型,表示 32 位带符号整数,范围从
-2,147,483,648
到2,147,483,647
。val age: Int = 25
-
Long: 长整型,表示 64 位带符号整数,范围从
-9,223,372,036,854,775,808
到9,223,372,036,854,775,807
。val distance: Long = 1000000000L
-
Short: 短整型,表示 16 位带符号整数,范围从
-32,768
到32,767
。val height: Short = 180
-
Byte: 字节型,表示 8 位带符号整数,范围从
-128
到127
。val byteValue: Byte = 100
-
Float: 单精度浮点数,表示 32 位浮点数,适合存储小范围的小数。
val temperature: Float = 36.6f
-
Double: 双精度浮点数,表示 64 位浮点数,适合进行高精度计算。
val pi: Double = 3.14159
🐖 对于大数字数值,Kotlin 支持使用下划线(
_
)来提高可读性:fun main() {val oneMillion = 1_000_000 // 表示 1000000val largeNumber = 1_234_567_890 // 表示 1234567890val binaryNumber = 0b1010_1011_1100_1111 // 二进制表示val hexNumber = 0xAB_CD_EF // 十六进制表示 }
- 下划线 只能用作分隔符,不能出现在数字的开始或结束。
- 可以根据需要添加任意数量的下划线。
- 下划线不影响数字的实际值,它仅用于视觉上的分隔。
5.1.2. 布尔类型
-
Boolean: 布尔类型,表示
true
或false
,通常用于条件判断。val isAdult: Boolean = true
5.1.3. 字符类型
-
Char: 字符类型,表示一个 Unicode 字符。用单引号
'
包围。val grade: Char = 'A'
5.1.4 字符串类型
-
String: 字符串类型,表示一系列字符。可以用双引号
"
包围字符串。val name: String = "Kotlin"
5.2. 类型推断
类型推断(Type Inference)是 Kotlin 编译器的一个强大特性,允许编译器在没有显式指定类型的情况下推断出变量或表达式的类型。
这使得我们在声明时不需要显式声明类型 ,Kotlin 编译器会根据变量的初始值自动推断出变量的类型。
fun main() {val x:Int = 42val name:String = "Alice"val pi:Double = 3.14
}
在这个例子中,Kotlin 编译器会自动推断出 x
是 Int
类型;变量 name
类型被推断为 String
。
在 IDEA 中变量名后的类型显示为暗灰色,提示我们存在冗余:
5.3. 类型检测
类型检测(Type Checks)用于判断对象是否属于某个特定类型。
Kotlin 主要通过 is
操作符检查对象是否是指定类型的实例。它相当于 Java 中的 instanceof
。
基本语法:
if (obj is Type) {// obj 是 Type 类型的实例,可以安全使用
} else {// obj 不是 Type 类型的实例
}
5.4. 类型转换
5.4.1. 强制类型转换 (as
)
as
用于进行强制类型转换。如果对象不能转换为指定类型,Kotlin 会抛出 ClassCastException
转换异常。因此,使用 as
时需要确保对象的实际类型与目标类型一致。
fun forceConvert(obj: Any) {val str = obj as String // 如果 obj 不是 String 类型,这里会抛出 ClassCastExceptionprintln(str.length)
}
5.4.2. 安全类型转换 (as?
)
as?
是一个安全的转换操作符。如果转换成功,它会返回转换后的类型;如果转换失败,它会返回 null
,而不会抛出异常。
fun safeConvert(obj: Any) {val str = obj as? String // 如果 obj 不是 String 类型,str 会是 nullprintln(str?.length ?: "不是字符串") // 如果 str 为 null 输出 "不是字符串"
}
5.4.3. 智能类型转换
当使用 is
操作符进行类型检测时,Kotlin 会自动将该对象转换为检测的类型,我们可以直接访问该类型的属性和方法。
例如,当 obj is String
时,我们可以直接使用 obj
的 String
类型方法(如 .length
),而不需要显式地进行转换。
fun printStringLength(obj: Any) {if (obj is String) {// 在这里 obj 被智能转换为 String 类型,可以直接使用 String 类型的方法println("字符串的长度是: ${obj.length}")} else {println("不是一个字符串")}
}
6. 控制流程
Kotlin 的控制流程包括条件判断、循环控制、跳出和返回等基本结构。
6.1. 条件判断
6.1.1. if 表达式
if
表达式是一种控制流语句,用于根据条件执行不同的代码块,与 Java 类似,但 Kotlin 的 if
可以作为表达式使用,这意味着它能像函数调用或赋值操作那样返回一个值。
-
基本语法
if (condition) {// 如果条件为真,执行这里的代码 } else {// 如果条件为假,执行这里的代码 }
-
多个条件的
if-else
链val x = 10 if (x < 5) {// x < 5 } else if (x == 5) {// x == 5 } else {// x > 5 }
-
作为表达式使用,将
if
的结果赋值给变量val max = if (x > y) x else y println(max) // 输出最大值
6.1.2. when 表达式
when
语法类似于 Java 中的 switch
语句,但更为灵活。它可以用来匹配各种条件,如常量、范围、类型等。
-
基本语法
when (variable) {value1 -> {// 执行代码块}value2 -> {// 执行代码块}else -> {// 默认代码块} }
-
表达式作为条件
when
不仅仅能匹配常量,还能匹配表达式:val x = 10 when {x % 2 == 0 -> println("x is even")else -> println("x is odd") }
-
范围匹配
when
可以检查一个值是否在某个范围内:val x = 5 when (x) {in 1..10 -> println("x is between 1 and 10")!in 11..20 -> println("x is not between 11 and 20")else -> println("x is out of range") }
-
类型匹配
when
也可以根据对象的类型来进行判断:fun printType(obj: Any) {when (obj) {is String -> println("It's a String")is Int -> println("It's an Integer")else -> println("Unknown type")} }
-
多个条件匹配
可以在
when
中使用逗号分隔多个条件:val x = 3 when (x) {1, 3, 5 -> println("x is odd")2, 4, 6 -> println("x is even")else -> println("Unknown") }
6.2. 循环控制
6.2.1. for
循环
for
用于循环遍历任何提供了迭代器的对象(如 List
、Set
等) 。基本语法如下:
for (item: Int in ints) {// ......
}
遍历数组或集合
Kotlin 的 for
循环也可以用于遍历数组或集合。
val arr = arrayOf(1, 2, 3, 4, 5)
for (i in arr) {println(i)
}
数字区间遍历
-
遍历范围(闭区间)
在数字区间上范围遍历可以通过
..
运算符来创建一个闭区间(包含开始值和结束值):// 1 <= i <= 5 for (i in 1..5) {print(i) // 12345 }
-
遍历范围(半开区间)
使用
until
关键字可以创建一个半开区间,遍历时不包括结束值:// 1 <= i < 5 for (i in 1 until 5) {print(i) // 1234 }
-
步长遍历
通过
step
关键字指定步长来控制每次遍历的增量,实现跳步:// 10<= i <=1 for (i in 1..10 step 2) {print(i) // 13579 }
-
倒序遍历
使用
downTo
可以创建一个递减的范围:// 1 <= i <= 5 for (i in 5 downTo 1) {println(i) // 54321 }
6.2.2. while
循环
Kotlin 中的 while
、do-while
循环与 Java 类似,用于在条件为 true
时重复执行某个代码块:
while
循环在每次执行之前检查条件,如果条件为false
,则不会执行循环体。do-while
循环先执行一次循环体,然后再检查条件,因此保证至少执行一次。
while (condition) {// 循环体
}do {// 循环体
} while (condition)
6.3. 跳出和返回
与 Java 一样,Kotlin 中也使用 return
、break
和 continue
作为控制流程的关键字,它们用于在循环和函数中实现不同的跳转行为。
6.3.1. return
return
关键字用于从函数中返回,并可以指定返回值。如果在函数中调用 return
,函数会立即结束,控制流会返回到调用该函数的地方。如果是 Unit
类型(即没有返回值的函数),则 return
后不需要指定值。
fun add(a: Int, b: Int): Int {return a + b
}
return
不仅用于函数中,也可以用于跳出嵌套的循环(通常与标签一起使用)。
6.3.2. break
break
关键字用于立即跳出循环,不再执行后续的循环体代码。在嵌套循环中,break
会终止最内层的循环,程序将继续执行 break
后的代码。
fun main() {for (i in 1..5) {if (i == 3) {break // 当 i 等于 3 时,跳出循环}println(i)}println("循环结束")
}
在这个例子中,循环在 i == 3
时通过 break
跳出,因此数字 3 和 4 都不会被打印出来。控制台输出如下:
6.3.3. continue
continue
关键字用于跳过当前循环的剩余部分,直接进行下一次循环的条件判断。它不会终止循环,只会跳过当前迭代的剩余部分。
fun main() {for (i in 1..5) {if (i == 3) {continue // 跳过 i 为 3 的这次循环}println(i)}
}
在这个例子中,continue
跳过了 i == 3
时的打印操作,导致 3 没有被打印出来,其他数字依然按顺序输出:
6.3.4. 标签(label)
标签(label)是一种用于标识代码块(如循环或函数)的方式,允许指定跳出特定的代码块或循环。标签通常与 break
或 return
关键字一起使用,避免了在嵌套的循环或代码块中只依赖于内层结构的 break
或 return
,可以显式地指定跳出某个特定的循环或函数。
标签语法
标签的定义通常是通过在代码块前加上一个名称并使用 @
符号:
labelName@ 代码块
使用标签与 break
跳出嵌套循环
fun main() {outerLoop@ for (i in 1..5) {for (j in 1..5) {if (i == 3 && j == 3) {println("Found at i=$i, j=$j, jumping out of both loops")break@outerLoop // 跳出外层循环}println("i=$i, j=$j")}}println("Loop exited.")
}
在这个例子中,我们给外层循环加了一个标签 outerLoop@
。当我们在内层循环中遇到 i == 3
和 j == 3
的时候,通过 break@outerLoop
跳出的是外层循环,而不是内层循环。通常,break
只会跳出当前循环,但是通过使用标签,我们能控制跳出嵌套结构中的特定循环:
标签与 return
的结合使用
Kotlin 中函数可以使用函数字面量、局部函数与对象表达式实现嵌套。
return
默认的行为是从外层函数返回。标签限定之后的 return@标签
可以实现从 lambda
表达式中返回,不影响外层函数的返回。
fun foo() {listOf(1, 2, 3, 4, 5).forEach {if (it == 3) return // 非局部直接返回到 foo() 的调用者println(it)}println("this point is unreachable")
}
上述代码执行时,由于 return
的默认行为,在 (it == 3)
时会跳出循环直接从外层函数 foo()
返回,输出结果:
如果我们只想跳出循环,不想直接从外层函数 foo()
返回,就需要配合标签使用:
fun foo() {val list = listOf(1, 2, 3)list.forEach forEach@{if (it == 2) return@forEachprintln(it)}println("This will be printed")
}
使用标签的 return@forEach
会指定跳出循环,不会影响 foo()
函数的执行。"This will be printed"
会被打印出来。
🐖
return@标签
在非内联函数中使用是不允许的
相关文章:
Kotlin 基础语法
1. 🌟 Kotlin:Java 的“超级进化体”? Kotlin 是一门由 JetBrains 开发的 现代静态类型编程语言,支持 JVM、Android、JavaScript、Native 等多平台: Kotlin 与 Java 深度兼容,Kotlin 会编译为 JVM 字节码,…...
设计模式使用Java案例
代码设计要有可维护性,可复用性,可扩展性,灵活性,所有要使用设计模式进行灵活设计代码 创建型 简单工厂模式(Simple Factory) 简单工厂模式(Simple Factory Pattern)是一种创建型…...
LORA的AB矩阵是针对Transformer的多头还是MLP
LORA的AB矩阵是针对Transformer的多头还是MLP Transformer中的矩阵是一个整体还是分开的每个小矩阵 在LORA(Low-Rank Adaptation)中,AB矩阵的应用位置和Transformer中的矩阵拆分方式如下: 1. LORA的AB矩阵作用对象 LORA的AB矩阵主要作用于Transformer的多头注意力模块和…...
【Gitee】删除仓库的详细步骤
文章目录 1、点击个人主页2、点击仓库3、点击想要删除的仓库4、点击管理5、点击侧边栏的删除仓库 1、点击个人主页 进入gitee官网,登录后点击个人主页 2、点击仓库 点击仓库跳转,如下图所示: 3、点击想要删除的仓库 这个页面会展示你所…...
DNS缓存使用中有什么问题?DNS缓存有哪些作用?
此前已经给大家介绍过刷新dns缓存的方法和流程以及dns缓存中毒和清楚dns缓存的知识介绍。那么你知道dns缓存使用中有什么问题吗?dns缓存有哪些作用? 以下是有关dns缓存的一些知识介绍。 一、DNS缓存使用中有什么问题? 1、缓存刷新不受控 当企业的域名发生变更时…...
Ollama + Open WebUI 本地部署DeepSeek
文章目录 前言一、环境准备最低系统要求必要软件 二、安装 Ollama通过 Docker 部署验证安装 三、部署 Open WebUI快速启动配置说明 四、加载 DeepSeek 模型通过 Ollama 拉取模型支持模型列表 五、使用 Web 界面交互首次使用功能特性 六、高级配置GPU 加速(NVIDIA&am…...
STM32-汇编
学习arm汇编的主要目的是为了编写arm启动代码,启动代码启动以后,引导程序到c语言环境下运行。换句话说启动代码的目的是为了在处理器复位以后搭建c语言最基本的需求。因此启动代码的主要任务有: 初始化异常向量表; 初始化各工作模…...
word中老是有一个空白页删不掉
1、首先第一种:最后一页空白页删除方法 如果空白页是出现在最后一页的话,一般的删除方法是可行的,我们可以直接按Backspace或者Delete直接删除 2、缩小行距 如果空白页只有一行,而且还删不掉,我们可以在这一行点击鼠…...
docker需要sudo才能使用
一种方法是添加当前用户到docker组里去,当时添加的时候貌似是没问题的,但是现在又不可以了 产生的报错 ❯ docker images Cannot connect to the Docker daemon at unix:///home/ying/.docker/desktop/docker.sock. Is the docker daemon running?解决…...
Unity导出WebGL,无法显示中文
问题:中文无法显示 默认字体无法显示中文 在编辑器中设置了中文和英文的按钮,中文按钮无法显示 导出后无法显示中文 解决办法: 自己添加字体,导入项目,并引用 示例 下载一个字体文件,这里使用的阿里…...
理解大模型的function call ,思维链COT和MCP 协议
在大模型中,function call 是指模型调用外部功能或工具以完成特定任务的过程。这种机制使得模型不仅能生成文本,还能执行特定的操作,如生成图像、获取数据或进行计算。 关键特点 功能扩展:通过调用外部函数,模型可以实…...
K8S学习之基础三十三:K8S之监控Prometheus部署程序版
部署 Prometheus 通常包括以下步骤: 1. 下载 Prometheus 首先,从 Prometheus 官方网站 下载适用于你操作系统的最新版本。 bash 复制 wget https://github.com/prometheus/prometheus/releases/download/v2.30.0/prometheus-2.30.0.linux-amd64.tar…...
c语言笔记 结构体指针运用
目录 1.结构体指针与结构体变量 2.结构体指针与结构体数组 c语言其实有时候基本知识还是一样只是说换了一个名称但是所表示的含义是一样的。 结构体指针是指针的一种类型,可以指向结构体变量或者结构体数组,下面我们来探究一下结构体指针跟结构体变量的…...
科普类——双目立体视觉与 RGBD 相机的简单对比
双目立体视觉与 RGBD 相机生成的深度图在原理、性能和应用场景上有显著差异。以下是两者的详细对比和分析: 1. 原理差异 (1) 双目立体视觉 (Stereo Vision) 原理: 通过两个摄像头模拟人眼视差,计算匹配像素点的水平位移(视差&…...
为什么要用linux?
使用 Linux 有许多独特的优势,尤其适合技术爱好者、开发者和企业用户。以下是 选择 Linux 的主要理由,涵盖不同场景的需求: --- 1. 开源与自由 🆓 - 完全免费:无需支付系统或软件授权费用,节省成本。 - 开放…...
Linux系统管理与编程05:网络管理番外篇
兰生幽谷,不为莫服而不芳; 君子行义,不为莫知而止休。 0.安装VMware workstation(以下简称VW)、MobaXterm和CentOS7.x minimal版 CentOS7.x minimal安装时选择网卡连接为nat,过程参照我的博客(略)。 1.…...
(2025|ICLR|华南理工,任务对齐,缓解灾难性遗忘,底层模型冻结和训练早停)语言模型持续学习中的虚假遗忘
Spurious Forgetting in Continual Learning of Language Models 目录 1. 引言 2. 动机:关于虚假遗忘的初步实验 3. 深入探讨虚假遗忘 3.1 受控实验设置 3.2 从性能角度分析 3.3 从损失景观角度分析 3.4 从模型权重角度分析 3.5 从特征角度分析 3.6 结论 …...
RabbitMQ 集群降配
这里写自定义目录标题 摘要检查状态1. 检查 RabbitMQ 服务状态2. 检查 RabbitMQ 端口监听3. 检查 RabbitMQ 管理插件是否启用4. 检查开机自启状态5. 确认集群高可用性6. 检查使用该集群的服务是否做了断开重连 实操1. 负载均衡配置2. 逐个节点降配(滚动操作…...
Git——分布式版本控制工具使用教程
本文主要介绍两种版本控制工具——SVN和Git的概念,接着会讲到Git的安装,Git常用的命令,以及怎么在Vscode中使用Git。帮助新手小白快速上手Git。如果想直接上手用Vscode操作远程仓库则直接看7和9即可! 目录 1. SVN和Git介绍 1.1 …...
在 Offset Explorer 中配置多节点 Kafka 集群的详细指南
一、是否需要配置 Zookeeper? Kafka 集群的 Zookeeper 依赖性与版本及运行模式相关: Kafka 版本是否需要 Zookeeper说明0.11.x 及更早版本✅ 必须配置Kafka 完全依赖 Zookeeper 管理元数据2.8 及以下版本✅ 必须配置Kafka 依赖外置或内置的 Zookeeper …...
nvm 安装某个node.js版本后不能使用或者报错,或不能使用npm的问题
安装了nvm之后发现不能使用某个版本的node.js,报错之后,不能使用npm这个命令。可以这样解决: 1、再node.js官网直接下载node.js 的压缩包。 找到nvm的安装目录 2、直接将文件夹解压到这个安装目录中修改一下名字即可。...
C++20 中的同步输出流:`std::basic_osyncstream` 深入解析与应用实践
文章目录 一、std::basic_osyncstream 的背景与动机二、std::basic_osyncstream 的基本原理三、std::basic_osyncstream 的使用方法(一)基本用法(二)多线程环境下的使用(三)与文件流的结合 四、std::basic_…...
美摄接入DeepSeek等大模型,用多模态融合重构视频创作新边界!
今年以来,DeepSeek凭借其强大的深度推理分析能力,在AI领域掀起新的热潮。美摄科技快速响应市场需求,迅速接入以DeepSeek、通义千问、商汤、文心一言为代表的大模型,为企业视频创作生产带来全新体验。 传统视频创作面临着同质化、…...
Git 使用笔记
参考链接: 创建版本库 - Git教程 - 廖雪峰的官方网站 Git使用教程,最详细,最傻瓜,最浅显,真正手把手教 - 知乎 命令使用 cd f: 切换目录到 F 盘 cd gitCxl 切换目录到 gitCxl 文件夹 mkdir gitCxl 创建新文件…...
C#:深入理解Thread.Sleep与Task.Delay
1.核心区别概述 特性Thread.SleepTask.Delay阻塞类型同步阻塞当前线程异步非阻塞,释放线程适用场景同步代码中的简单延时异步编程中的非阻塞等待资源消耗占用线程资源(线程挂起)不占用线程(通过计时器回调)精度依赖操…...
基于Redis实现共享token登录
文章目录 1.集群下session共享存在的问题2.基于Redis实现共享session存储业务流程图3.具体登录的代码实现3.1 引入redis数据库3.2 发送验证码到前端3.2 登录注册功能实现3.2刷新token有效期(LoginIntereceptor)3.3 MvcConfig配置4.拦截器优化4.1增加RefreshTokenInterceptor 4.…...
【Linux我做主】浅谈Shell及其原理
浅谈Linux中的Shell及其原理 Linux中Shell的运行原理github地址前言一、Linux内核与Shell的关系1.1 操作系统核心1.2 用户与内核的隔离 二、Shell的演进与核心机制2.1 发展历程2.2 核心功能解析2.3 shell的工作流程1. 用户输入命令2. 解析器拆分指令3. 扩展器处理动态内容变量替…...
vulhub/Billu_b0x靶机----练习攻略
1.Billu_b0x靶场下载链接: https://download.vulnhub.com/billu/Billu_b0x.zip 2.下载后,解压出ova文件,直接拖至VMware中,重命名和选择存储位置,点击导入,报错点击重试即可。修改网卡为NAT模式。 打开靶…...
【华为OD-E卷 -121 消消乐游戏 100分(python、java、c++、js、c)】
【华为OD-E卷 - 消消乐游戏 100分(python、java、c++、js、c)】 题目 游戏规则:输入一个只包含英文字母的字符串,字符串中的两个字母如果相邻且相同,就可以消除。 在字符串上反复执行消除的动作,直到无法继续消除为止,此时游戏结束。 输出最终得到的字符串长度 输入描…...
Qt之自定义界面组件 一
通过qt中的painter绘图事件绘制一个电池电量图的变化。效果如下图 创建一个基于界面widget工程,在wdiget界面添加一个widget界面,将添加的widget界面的类提升为Tbattery.在Tbattery类中重写painEvent电池电量代码 文件目录结构 主要部分代码 //Tbattery.cpp #inc…...
破解验证码新利器:基于百度OCR与captcha-killer-modified插件的免费调用教程
破解验证码新利器:基于百度OCR与captcha-killer-modified插件的免费调用教程 引言 免责声明: 本文提供的信息仅供参考,不承担因操作产生的任何损失。读者需自行判断内容适用性,并遵守法律法规。作者不鼓励非法行为,保…...
1-1 MATLAB深度极限学习机
本博客来源于CSDN机器鱼,未同意任何人转载。 更多内容,欢迎点击本专栏目录,查看更多内容。 参考[1]魏洁.深度极限学习机的研究与应用[D].太原理工大学[2023-10-14].DOI:CNKI:CDMD:2.1016.714596. 目录 0.引言 1.ELM-AE实现 2.DE…...
函数的介绍
1.函数的概念 在C语言中也有函数的概念,有些翻译为:子程序,这种翻译更为准确。C语言的函数就是一个完成某项特定的任务的一小段代码。这段代码是有特殊的写法和调用方法的。 C语言的程序其实是有无数个小的函数组合而成的,也可以…...
4.3--入门知识扫盲,IPv4的头部报文解析,数据报分片,地址分类(包你看一遍全部记住)
IPv4协议:网络世界的快递包裹指南(附拆箱说明书) “IPv4就像一张明信片,既要写清楚地址,又要控制大小别超重” —— 某网络工程师的桌面铭牌 一、IPv4报头:快递面单的终极艺术 1.1 报头结构图(…...
Linux生成自签名证书
一、安装OpenSSL 首先确保机器已安装OpenSSL工具OpenSSL的安装可参考:源码编译OpenSSL 二、生成私钥 openssl genpkey -algorithm RSA -out server.key 三、创建证书签署请求(CSR) openssl req -new -key server.key -out server.csr 四、生成自签…...
烽火HG680-KA_海思HI3798MV310_安卓9.0_U盘强刷固件包及注意点说明
之前发布过这个固件包,关于烽火HG680-KA/HG680-KB_海思HI3798MV310_安卓9.0_U盘强刷固件包详细说明一下,汇总总结一些常遇到的情况,这次固件会分开发布,以免混淆。 上一个帖子地址:https://blog.csdn.net/…...
Vue3 核心特性解析:Suspense 与 Teleport 原理深度剖析
Vue3 核心特性解析:Suspense 与 Teleport 原理深度剖析 一、Teleport:突破组件层级的时空传送 1.1 实现原理图解 #mermaid-svg-75dTmiektg1XNS13 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-s…...
Linux Vim 寄存器 | 从基础分类到高级应用
注:本文为 “vim 寄存器” 相关文章合辑。 英文引文,机翻未校。 中文引文,略作重排。 未整理去重,如有内容异常,请看原文。 Registers 寄存器 Learning Vim registers is like learning algebra for the first ti…...
为什么TCP需要三次握手?一次不行吗?
文章目录 1. 三次握手的过程2. 为什么需要三次握手?3. 握手过程中每一步的具体作用4. 简单比喻5. 为什么是三次握手,而不是两次或四次?6. 三次握手中的序列号有什么作用?7. 总结 1. 三次握手的过程 三次握手是建立 TCP 连接的过程…...
OpenGL ES 入门指南:从基础到实战
引言:为什么需要 OpenGL ES? 在当今的嵌入式设备(如智能手机、汽车仪表盘、智能家居中控屏)中,流畅的图形渲染能力是用户体验的核心。OpenGL ES(OpenGL for Embedded Systems) 作为行业标准&am…...
台达PLC转太网转换的教程案例(台达DVP系列)
产品介绍 台达DVP-PLC自投身工业自动化市场以来,始终致力于创新发展,不断推陈出新。其产品紧密贴合市场需求与行业工艺,凭借卓越性能与丰富功能,深受用户青睐。不仅推出了高效的程序与编辑工具,显著提升了主机执行速度…...
Ubuntu24.10编译Android12源码并运行于模拟器中
效果如下: 初始化环境: 运行lunch弹出对应目标 生成模拟器版本镜像 镜像生成成功 生成模拟器启动镜像 编译注意事项: 24.10版本: sudo apt install curl curl -sSL https://gerrit-googlesource.proxy.ustclug.org/git-repo//master/r…...
Java面试易忽略知识点
1. CompletableFuture中thenApply()与thenCompose()的区别 考察点:组合式异步编程 解析: **thenApply()**:接收前序任务结果,返回普通对象(同步转换),适用简单数据处理。**thenCompose()*…...
C#通过SignalR直接返回流式响应内容
1、背景 实现流式响应基本上分为两大技术方案:(1)基于HTTP的Stream处理;(2)基于socket的连接。前者的实现方式有:《C#通过API接口返回流式响应内容—SSE方式》和《C#通过API接口返回流式响应内…...
【排序算法对比】快速排序、归并排序、堆排序
排序算法对比:快速排序、归并排序、堆排序 1. 快速排序(Quick Sort) 原理 快速排序采用 分治法(Divide and Conquer),通过选取基准值(pivot),将数组划分为 小于基准值…...
YOLO11改进-模块-引入空间带状注意力机制(Spatial Strip Attention,SSA)增强模型对空间信息处理能力的重要模块
在图像相关任务中,传统卷积神经网络(CNN)在处理空间信息时,卷积核的感受野有限,难以有效捕捉长距离的空间依赖关系。而自注意力机制虽然能建模长距离依赖,但计算复杂度较高。为了在高效计算的同时更好地捕捉…...
C++内存分配方式
文章目录 1、静态内存分配2、栈内存分配3、堆内存分配4、内存池分配5、placement new语法工作原理示例 placement new应用场景 在C 中,内存分配主要有以下几种方式: 1、静态内存分配 特点:在编译时就确定了内存的分配和释放,内存…...
【经验】Orin系列Ubuntu远程桌面:VNC、NoMachine、URDC
1、VNC 1.1 Ubuntu端 1)安装VNC服务器 sudo apt install tigervnc-standalone-server2)安装xfce4 桌面 xfce4 用资源较GNOME ,KDE较少。适合老机器,轻量级桌面。与windows界面环境类似。 sudo apt install xfce4 xfce4-goodies也可以使用其它的桌面系统,可以使用如下命…...
【RabbitMQ】RabbitMQ消息的重复消费问题如何解决?
可以从消息队列和消费者两方面入手,确保消息处理的幂等性和可靠性。 1.消息重复消费的原因 1.1消息队列的机制 消息确认失败: 消费者处理完消息后,未正确发送确认(ACK)给RabbitMQ,导致消息被重新投递。消息重试机制:…...
Python、MATLAB和PPT完成数学建模竞赛中的地图绘制
参加数学建模比赛时,很多题目——诸如统计类、数据挖掘类、环保类、建议类的题目总会涉及到地理相关的情景,往往要求我们制作与地图相关的可视化内容。如下图,这是21年亚太赛的那道塞罕坝的题目,期间涉及到温度、降水和森林覆盖率…...