kotlin部分常用特性總結

<h3>Kotlin中類和對象初始化</h3>

<ul>
<li>添加open關鍵字代表可以被繼承</li>
<li>Any 是所有類的父類,類似Object,包含 equals() hashCode() toString()方法</li>
<li>constructor 關鍵字代表構造函數, constructor關鍵字可以去掉</li>
</ul>

<pre><code class="java">class User(性格: String, 長相: String, 聲音: String) : Human(性格, 長相, 聲音)
class User2(name: String) : Human2(name)
open class Human constructor(var 性格: String, var 長相: String, var 聲音: String) : Any() {
//對象創建時調用,構造方法的方法體
init {
println("new 了一個${this.javaClass.simpleName}, ta性格:$性格, 長相:$長相, 聲音:$聲音")
}
override fun toString(): String {
return "${性格} 性格"
}
}
open class Human2 {
val name: String
val age: Int
constructor(name: String) : this(name, 0) {
// 調用主構造函數或另一個輔助構造函數
}

? ? constructor(name: String, age: Int = 18) { ?// 輔助構造函數
this.name = name
this.age = age
val user: User = User("溫柔", "甜美", "動人")

? ? ? ? val value: String? = getName()
println(value!!.length)
}
}
</code></pre>

<h3>空類型和智能類型轉換</h3>

<ul>
<li>?.在遇到null時會靜默跳過執行(返回null)</li>
<li>!!在遇到null時會立即拋出異常 (當對可空變量使用!!時,編譯器會假定該變量不為null)</li>
</ul>

<pre><code>fun getName(): String? {// ? 表示返回值可以為空
return "na"//null
}
fun main(args: Array&lt;String&gt;) {
val str: String? = null
// ?.在遇到null時會靜默跳過執行(返回null)
// !!在遇到null時會立即拋出異常 (當對可空變量使用!!時,編譯器會假定該變量不為null)
//val length = str!!.length
// 應盡量避免使用!!,推薦替代方案包括:
// 優先使用val聲明不可變變量
// 對延遲初始化變量使用 lateinit. var用lateinit 延遲初始化,val用lazy
lateinit var q: String
// 使用Elvis操作符?:提供默認值或者return
//Elvis操作符?: 結構:表達式A ?: 表達式B
//當表達式A非null時返回A的值,否則返回表達式B的結果
// 例如:
val length2 = str?.length ?: 0
val name: String = getName() ?: return
println(name.length)
main2(args)
}
</code></pre>

<h3>區間 Range,表示范圍</h3>

<pre><code>//val:用于運行時常量,相當于Java的final字段,支持任何類型且僅初始化一次
//const:用于編譯時常量,相當于Java的public static final字段,可通過類名直接訪問。
//編譯時確定值:const修飾的常量值必須在編譯時確定,不能通過運行時計算或動態賦值。
//類型限制:僅支持基本類型(如int、double、string)和字符串。
//存儲位置:必須聲明在頂層(如包級可見變量)或伴生對象(companion object)中
val range: IntRange = 0..1024 // [0, 1024]
val range_exclusive: IntRange = 0 until 1024 // [0, 1024) = [0, 1023]
val a = (50 in range) // (i in range)判斷i是否在區間中
</code></pre>

<h3>Unit</h3>

在 Kotlin 中,Unit 是一個特殊的類型,類似于 Java 中的 void,但有以下關鍵區別:

<ul>
<li>Unit 是一個實際存在的類型(單例對象),而 void 只是關鍵字</li>
<li>當函數不返回有意義的值時,Kotlin 會隱式返回 Unit</li>
<li>Unit 的實例可以用 Unit 或 () 表示</li>
</ul>

<pre><code>fun printMessage(msg: String): Unit { // 這里的 : Unit 可以省略
println(msg)
// 隱式返回 Unit
}
fun printUsage() {
println("請傳入兩個整型參數,例如 1 2") // (Any?) -&gt; Unit
} // ()-&gt;Unit

val sum = { arg1: Int, arg2: Int -&gt;
println("$arg1 + $arg2 = ${arg1 + arg2}")
arg1 + arg2
}
// (Int, Int) -&gt; Int
val printlnHello = {
println(::printUsage is ()-&gt; Unit)
println("Hello")
}
// ()-&gt; Unit
val int2Long = fun(x: Int): Long {
return x.toLong()
}
</code></pre>

<h3>繼承與實現</h3>

<ul>
<li>父類需要 open 才可以被繼承</li>
<li>父類方法、屬性需要 open 才可以被覆寫</li>
<li>接口、接口方法、抽象類默認為 open</li>
<li>覆寫父類(接口)成員需要 override 關鍵字</li>
<li>class D: A(),B,C</li>
<li>注意繼承類時實際上調用了父類構造方法</li>
<li>類只能單繼承,接口可以多實現</li>
</ul>

<h3>繼承之接口代理(基于 by 關鍵字)</h3>

通過 by 將接口實現委托給其他對象,無需手動編寫代理類

<pre><code>class SeniorManager(val driver: Driver, val writer: Writer): Driver by driver, Writer by writer

class CarDriver: Driver {
override fun drive() {
println("開車呢")
}
}

class PPTWriter: Writer {
override fun write() {
println("做PPT呢")
}
}

interface Driver{
fun drive()
}
interface Writer{
fun write()
}

fun main3(args: Array&lt;String&gt;) {
val driver = CarDriver()
val writer = PPTWriter()
val seniorManager = SeniorManager(driver, writer)
seniorManager.drive()
seniorManager.write()
}
</code></pre>

<h3>接口方法沖突</h3>

<ul>
<li>接口方法可以有默認實現</li>
<li>簽名一致且返回值相同的沖突</li>
<li>子類(實現類)必須覆寫沖突方法</li>
<li>super&lt;[父類(接口)名]>.<a href="[參數列表]">方法名</a></li>
</ul>

<pre><code>abstract class A{
open fun x(): Int = 5
}
interface B{
fun x(): Int = 1
}
interface C{
fun x(): Int = 0
}
class D(var y: Int = 0): A(), B, C{
override fun x(): Int {
println("call x(): Int in D")
if(y &gt; 0){
return y
}else if(y &lt; -200){
return super&lt;C&gt;.x()
}else if(y &lt; -100){
return super&lt;B&gt;.x()
}else{
return super&lt;A&gt;.x()
}
}
}
//3 5 1 0?
fun main(args: Array&lt;String&gt;) {
println(D(3).x())
println(D(-10).x())
println(D(-110).x())
println(D(-10000).x())
}
</code></pre>

<h3>可見性對比</h3>

模塊通常指一組共同編譯的 Kotlin 文件(如 Gradle 模塊或 IntelliJ 模塊)

<table>
<thead>
<tr>
<th align="center">kotlin</th>
<th align="center">java</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">private</td>
<td align="center">private</td>
</tr>
<tr>
<td align="center">protected</td>
<td align="center">protected</td>
</tr>
<tr>
<td align="center">-</td>
<td align="center">default(包內可見)</td>
</tr>
<tr>
<td align="center">internal(模塊內可見,模塊化開發的核心修飾符)</td>
<td align="center">-</td>
</tr>
<tr>
<td align="center">public</td>
<td align="center">public</td>
</tr>
</tbody>
</table>

<h3>Object 關鍵字</h3>

object 關鍵字用于實現?單例模式?、?伴生對象?和?對象表達式?(匿名對象),是 Kotlin 特有的簡化設計模式的語法糖。以下是其三大核心用途及示例:
1. 單例模式(對象聲明)?
直接通過 object 聲明線程安全的單例:

<pre><code>object DatabaseManager {
private val connection = "DB_Connection"
fun query(sql: String) = println("Executing: $sql via $connection")
}
// 使用(全局唯一實例)
fun main() {
DatabaseManager.query("SELECT * FROM users") ?// 輸出: Executing: SELECT * FROM users via DB_Connection
}
</code></pre>

特點:
* 只有一個實例的類
* 首次訪問時延遲初始化(線程安全)
* 不能自定義構造函數, 可繼承父類 可實現接口

<ol>
<li>伴生對象

<ul>
<li>每個類可以對應一個伴生對象</li>
<li>伴生對象的成員全局獨一份 , 相當于靜態方法 靜態屬性</li>
</ul></li>
</ol>

<pre><code>class Latitude private constructor(val value: Double){
companion object{
@JvmStatic
fun ofDouble(double: Double): Latitude{
return Latitude(double)
}

? ? ? ? fun ofLatitude(latitude: Latitude): Latitude{
return Latitude(latitude.value)
}

? ? ? ? @JvmField
val TAG: String = "Latitude"
}
}
</code></pre>

<ol>
<li>匿名對象

<ul>
<li>每次調用都會創建新對象</li>
<li>可同時繼承類和實現接口(如 object : ClassA(), InterfaceB</li>
<li>注意:object 與 class 不同,不能實例化(本身就是實例)</li>
</ul></li>
</ol>

<pre><code> ? ?interface ClickListener {
fun onClick()
}

? ? fun setClickListener(listener: ClickListener) {
listener.onClick()
}

? ? fun main() {
var counter = 0
setClickListener(object : ClickListener {
override fun onClick() {
println("Clicked ${++counter} times") ?// 捕獲并修改外部變量
}
})
}
</code></pre>

<h3>擴展成員</h3>

<ul>
<li>為現有類添加方法、屬性</li>
<li>fun X.y(): Z {... }</li>
<li>val x.m 注意擴展屬性不能初始化,類似接口屬性</li>
<li>Java 調用擴展成員類似調用靜態方法</li>
</ul>

<pre><code> ? ?operator fun String.times(int: Int): String{
val stringBuilder = StringBuilder()
for(i in 0 until int){
stringBuilder.append(this)
}
return stringBuilder.toString()
}

? ? val String.a: String
get() = "abc"

? ? var String.b: Int
set(value) {
}
get() = 5
//abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabc
//5
fun main(args: Array&lt;String&gt;) {
println("abc" * 16)
"abc".b = 5
println("abc".b)
}
</code></pre>

<h3>operator關鍵字</h3>

operator 關鍵字用于?重載運算符?或?約定特定函數?,讓類實例支持類似基礎類型的操作(如 +、[]、in 等)

<h4>運算符重載?</h4>

通過重載預定義的運算符函數,使對象支持算術、比較等操作

<pre><code>data class Point(val x: Int, val y: Int) {
// 重載 "+" 運算符
operator fun plus(other: Point): Point {
return Point(x + other.x, y + other.y)
}
}
fun main() {
val p1 = Point(1, 2)
val p2 = Point(3, 4)
println(p1 + p2) ?// 輸出: Point(x=4, y=6)
}
</code></pre>

<table>
<thead>
<tr>
<th>運算符</th>
<th>對應函數名</th>
<th>示例表達式</th>
</tr>
</thead>
<tbody>
<tr>
<td>+</td>
<td>plus</td>
<td>a + b</td>
</tr>
<tr>
<td>-</td>
<td>minus</td>
<td>a - b</td>
</tr>
<tr>
<td>[]</td>
<td>get</td>
<td>a[i]</td>
</tr>
<tr>
<td>in</td>
<td>contains</td>
<td>a in b</td>
</tr>
<tr>
<td>==</td>
<td>equals</td>
<td>a==b</td>
</tr>
</tbody>
</table>

<h4>約定函數</h4>

operator 還可用于標記?特定名稱的函數?,實現與語言特性的交互:

<ul>
<li>解構聲明(Destructuring)</li>
</ul>

<pre><code>class User(val name: String, val age: Int) {
operator fun component1() = name ?// 解構為 (name, age)
operator fun component2() = age
}
fun main() {
val user = User("Alice", 25)
val (name, age) = user ?// 解構賦值
println("$name, $age") ?// 輸出: Alice, 25
}

</code></pre>

<ul>
<li>迭代器支持</li>
</ul>

<pre><code>class Counter(val range: IntRange) {
operator fun iterator(): Iterator&lt;Int&gt; = range.iterator()
}

fun main() {
for (i in Counter(1..5)) { ?// 支持 for-in 循環
print("$i ") ?// 輸出: 1 2 3 4 5
}
}

</code></pre>

<h4>注意事項?</h4>

<ul>
<li>不可隨意創造運算符?:只能重載 Kotlin 預定義的運算符47。</li>
<li>一致性要求?:如 plus 不應修改原對象,應返回新實例35。</li>
<li>與擴展函數結合?:可為現有類添加運算符支持</li>
</ul>

<pre><code>operator fun Int.times(str: String) = str.repeat(this)
fun main() {
println(3 * "Hi ") ?// 輸出: Hi Hi Hi?
}
</code></pre>

<h3>屬性代理</h3>

<h4>懶加載 lazy</h4>

<ul>
<li>延遲到首次訪問時執行</li>
<li>線程安全模式?:默認 LazyThreadSafetyMode.SYNCHRONIZED,可選 PUBLICATION(允許多線程初始化)或 NONE(單線程)</li>
</ul>

<pre><code>class Delegates{
val hello by lazy {
"HelloWorld"
}
val hello0 by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
"HelloWorld"
}

? ? val hello2 by X()

? ? var hello3 by X()
}
</code></pre>

<h4>基本用法</h4>

<pre><code>// val 屬性?:只需實現 getValue?
?// var 屬性?:需同時實現 getValue 和 setValue
class X{
private var value: String? = null

? ? operator fun getValue(thisRef: Any?, property: KProperty&lt;*&gt;): String {
println("getValue: $thisRef -&gt; ${property.name}")
return value?: ""
}

? ? operator fun setValue(thisRef: Any?, property: KProperty&lt;*&gt;, value: String){
println("setValue, $thisRef -&gt; ${property.name} = $value")
this.value = value
}
}

fun main6(args: Array&lt;String&gt;) {
val delegates = Delegates()
println(delegates.hello)
println(delegates.hello2)
println(delegates.hello3)
delegates.hello3 = "value of hello3"
println(delegates.hello3)
println(delegates.hello)
}
//HelloWorld
//getValue: com.spro.globalsearch.Delegates@1593948d -&gt; hello2
//
//getValue: com.spro.globalsearch.Delegates@1593948d -&gt; hello3
//
//setValue, com.spro.globalsearch.Delegates@1593948d -&gt; hello3 = value of hello3
//getValue: com.spro.globalsearch.Delegates@1593948d -&gt; hello3
//value of hello3
//HelloWorld
</code></pre>

<h3>數據類DataClass</h3>

<ul>
<li>自動生成標準方法:
數據類會自動生成 equals()、hashCode()、toString()、copy() 等方法,普通類需手動實現</li>
<li>主構造函數要求:
必須至少有一個參數,且參數需標記為 val 或 va, 普通類無此限制</li>
<li>解構聲明支持
數據類自動支持解構,可直接將屬性拆分為變,普通類則需手動實現 componentN()</li>
<li>不可變性推薦?:
屬性通常聲明為 val(不可變),但支持 var(可變)?</li>
<li>繼承限制?
數據類不能是 abstract、open、sealed 或 inner 類?</li>
<li>無無參構造函數
需顯式定義默認值或輔助構造函數?</li>
</ul>

<h4>應用</h4>

<ul>
<li>數據傳輸對象
如 JSON 解析后的數據實體?</li>
<li>簡化數據操作
利用 copy() 實現不可變對象的修改?
val user2 = user1.copy(age = 26)</li>
</ul>

<pre><code>data class Country(val id: Int, val name: String)
data class Country2(var id: Int, var name: String)
//component 組件
class ComponentX{
operator fun component1(): String{
return "您好,我是"
}

? ? operator fun component2(): Int{
return 1
}

? ? operator fun component3(): Int{
return 1
}

? ? operator fun component4(): Int{
return 0
}
}

fun main7(args: Array&lt;String&gt;) {
//componentN解構聲明
val china = Country(0, "中國")
println(china)// Country(id=0, name=中國)
println("${china.component1()} ?------ ${china.component2()} ")//0 ------ 中國
val (idx, name) = china //解構賦值
println("$idx ------ ?$name")//0 ----- 中國

? ? val componentX = ComponentX()//解構賦值
val (a, b, c, d) = componentX
println("$a $b$c$d")//您好,我是 110
}
</code></pre>

<h3>內部類</h3>

靜態內部類與非靜態內部類的區別:到底是否持有外部類的狀態 (非靜態內部類持有外部類的狀態,可以訪問外部類的屬性)

<pre><code>open class Outter{
val a: Int = 0
class InnerDefaultStatic{
}
//非靜態內部類
inner class Inner{
val a: Int = 5
fun hello(){
println(this@Outter.a)
}
}
}
interface OnClickListener{
fun onClick()
}
class View{
var onClickListener: OnClickListener? = null
}
fun main(args: Array&lt;String&gt;) {
val innerDefaultStatic = Outter.InnerDefaultStatic()
val inner = Outter().Inner()
val view = View()
//匿名內部類看上去沒有名字,但是編譯生成字節碼文件有自己的ID,類似Outter$1.class
view.onClickListener = object : Outter(), OnClickListener{
override fun onClick() {

? ? ? ? }
}
}
</code></pre>

<h3>枚舉類</h3>

<ul>
<li>實例可數的類,注意枚舉也是類</li>
<li>可以修改構造,添加成員</li>
<li>可以提升代碼的表現力,也有一定的性能開銷</li>
<li>實例可數?指枚舉(enum)類型的成員數量固定且不可擴展。</li>
<li>枚舉通過enum class聲明,其所有成員(如VERBOSE、DEBUG等)均為該類的實例對象,且默認構造函數為私有(private constructor()),因此無法被繼承或擴展</li>
</ul>

<pre><code>enum class LogLevel(val id: Int){
VERBOSE(0), DEBUG(1), INFO(2), WARN(3), ERROR(4), ASSERT(5);

? ? fun getTag(): String{
return "$id, $name"
}

? ? override fun toString(): String {
return "$name, $ordinal"
}
}
println(LogLevel.DEBUG.ordinal)
LogLevel.values().map(::println)
println(LogLevel.valueOf("ERROR"))
//VERBOSE, 0
//DEBUG, 1
//INFO, 2
//WARN, 3
//ERROR, 4
//ASSERT, 5
//ERROR, 4
</code></pre>

<h3>密封類</h3>

子類可數

<pre><code>sealed class PlayerCmd{
}
class Play(val url:String,val position:Long =0):PlayerCmd()
class Seek(val position: Long): PlayerCmd()
object Pause:PlayerCmd()
object Resume:PlayerCmd()
object Stop:PlayerCmd()

enum class PlayerState{
IDLE, PAUSE, PLAYING
}

</code></pre>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/89668.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/89668.shtml
英文地址,請注明出處:http://en.pswp.cn/web/89668.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PHP 就業核心技能速查手冊

# PHP 就業核心技能速查手冊 > 高效聚焦市場所需&#xff0c;快速提升競爭力 --- ## 一、語法基礎&#xff08;必會&#xff01;&#xff09; php // 1. 變量與數據類型 $price 19.99; // 浮點型 $isStock true; // 布爾型 // 2. 流程控制 foreach ($…

從混沌到秩序:數據科學的熱力學第二定律破局——線性回歸的熵減模型 × 最小二乘的能量最小化 × 梯度下降的負反饋控制系統,用物理定律重構智能算法的統一場論

目錄 一、機器學習是什么&#xff1f; 1.1 什么是機器學習&#xff1f; 1.2 機器學習的三大類型 二、線性回歸是什么&#xff1f; 2.1 通俗理解 2.2 數學表達 三、最小二乘法&#xff08;Least Squares Method&#xff09; 3.1 什么是損失函數&#xff1f; 3.2 什么是最小…

BI 數據可視化平臺建設(3)—首頁性能提升實踐

作者&#xff1a; vivo 互聯網大數據團隊- Wang Lei 本文是vivo互聯網大數據團隊《BI 數據可視化平臺建設》系列文章第3篇。 隨著越來越多代碼的堆積&#xff0c;平臺的運行加載性能也在逐步下降&#xff0c;在不同程度上極大地影響了用戶體驗&#xff0c;從而導致用戶流失。本…

基于Python的畢業設計選題管理系統設計與實現

基于Python的畢業設計選題管理系統設計與實現摘要本論文詳細闡述了一個基于Python的畢業設計選題管理系統的設計與實現過程。該系統采用了Python的Tkinter庫構建圖形用戶界面&#xff0c;使用SQLite數據庫存儲數據&#xff0c;實現了高校畢業設計選題過程中的教師出題、學生選題…

如何在HTML5頁面中嵌入視頻

在HTML5中嵌入視頻主要使用<video>標簽&#xff0c;這是一種簡單且標準的方式。以下是詳細步驟和示例&#xff1a; 基礎實現 <!DOCTYPE html> <html> <head><title>視頻嵌入示例</title> </head> <body><!-- 基礎視頻播放器…

java操作Excel兩種方式EasyExcel 和POI

一、POI1.引入依賴<!-- 03 xls--> <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.9</version> </dependency><!-- 07 xlsx --> <dependency><groupId>org.a…

Openlayers 面試題及答案180道(141-160)

《前后端面試題》專欄集合了前后端各個知識模塊的面試題,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,MySQL,Linux… 。 前后端面試題-專欄總目錄 文章目錄 一、本文面試題目錄 141. 如何在生產環境中優…

LangChain面試內容整理-知識點24:實戰案例:智能助手 Agent 構建

本案例講述如何用LangChain構建一個結合多個工具的智能助手 Agent。智能助手需要理解用戶復雜請求,通過調用不同工具(如搜索、計算、查數據庫等)執行多步推理,再給出答案。LangChain的Agent框架非常適合這種場景。 構建步驟: 確定需求和選擇Agent類型:假設我們要一個能上…

【MATLAB例程】Taylor算法用于TOA(到達時間)的三維標簽位置解算,可自適應基站數量。附下載鏈接

本文給出自適應錨點&#xff08;基站&#xff09;的Taylor算法解算TOA&#xff08;到達時間&#xff09;的MATLAB代碼。參考論文&#xff1a;《基于Taylor-Chan算法的改進UWB室內三維定位方法》中的Taylor算法來解算TOA的復現程序&#xff08;MATLAB&#xff09;。 文章目錄運行…

Eclipse代碼折疊增強插件的安裝與使用

本文還有配套的精品資源&#xff0c;點擊獲取 簡介&#xff1a;Eclipse作為Java開發者的IDE&#xff0c;提供包括代碼折疊在內的多種功能&#xff0c;便于管理與閱讀代碼。本文介紹的“com.cb.eclipse.folding_1.0.6.jar”插件能夠進一步增強Eclipse的代碼折疊能力。安裝后&…

Python day18

浙大疏錦行 python day 18. 內容&#xff1a; 昨天學習了聚類算法的一些基本內容&#xff0c;今天繼續學習相關知識分析簇的特征和相關含義&#xff08;使用可視化來進行分析&#xff0c;也可以使用ai&#xff09; 代碼&#xff1a; shap.initjs() # 初始化 SHAP 解釋器 ex…

WPS文檔中心及文檔中臺遠程命令執行漏洞

【嚴重】WPS文檔中心及文檔中臺遠程命令執行漏洞 漏洞描述 WPS文檔中心是面向個人和企業的云端文檔存儲與管理平臺&#xff0c;WPS文檔中臺是為企業提供的集成化文檔協同與流程管理解決方案&#xff0c;強調API對接與業務系統整合。 在2024年5月之前通過docker私有化部署的版…

WPF 加載和顯示 GIF 圖片的完整指南

WPF 加載和顯示 GIF 圖片的完整指南 在 WPF 中加載和顯示 GIF 圖片需要一些特殊處理&#xff0c;因為 WPF 的 Image 控件默認不支持動畫 GIF。 解決方案一&#xff1a;使用 WpfAnimatedGif 庫&#xff08;推薦&#xff09; 這是最簡單且功能最完整的方法。 實現步驟&#xff1a…

Node.js GET/POST請求詳解

Node.js GET/POST請求詳解 引言 Node.js作為一種基于Chrome V8引擎的JavaScript運行環境&#xff0c;以其高性能、非阻塞I/O模型和輕量級等特點&#xff0c;在服務器端開發中得到了廣泛應用。本文將詳細介紹Node.js中GET和POST請求的處理方法&#xff0c;幫助開發者更好地理解和…

C++string類(2)

3.string類對象的訪問及遍歷操作函數名稱功能說明operator[] &#xff08;重 點&#xff09;返回pos位置的字符&#xff0c;const string類對象調用beginendbegin獲取第一個字符的迭代器 end獲取最后一個字符下一個位置的迭代器rbeginrendrbegin獲取最后一個字符的迭代器 ren…

SQLShift:一款異構數據庫存儲過程遷移工具

SQLShift 是一款專注于解決企業級數據庫遷移難題的智能 SQL 方言轉換平臺&#xff0c;尤其擅長異構數據庫存儲過程的自動化遷移。 SQLShift 工具深度融合了 AI 與 SQL 語法專家模型&#xff0c;可以大幅提升遷移效率并降低人工適配風險。 功能特性 多源多目標&#xff1a;目前…

學習設計模式《十八》——備忘錄模式

一、基礎概念 備忘錄模式的本質是【保存和恢復內部狀態】。 備忘錄模式的思考序號備忘錄模式的思考說明1保存是手段&#xff0c;恢復才是目的標準的備忘錄模式保存數據的手段是通過內存緩存&#xff1b;廣義的備忘錄模式實現的時候&#xff0c;可以采用離線存儲的方式&#xff…

HOT100——排序篇Leetcode215. 數組中的第K個最大元素

文章目錄題目&#xff1a;Leetcode215. 數組中的第K個最大元素原題鏈接思路1代碼1思路2代碼2題目&#xff1a;Leetcode215. 數組中的第K個最大元素 原題鏈接 數組中的第K個最大元素 思路1 排序 排序后返回倒數第k個數 代碼1 思路2 使用priority_queue&#xff0c;大根堆&#x…

三維重建一: 相機幾何

參考這位大佬&#xff1a;https://zhuanlan.zhihu.com/p/458000359 一. 基本的投影模型 正如上面所說&#xff0c;相機是一個將三維物體投影為二維圖像的設備。 對于小孔相機&#xff0c;或者薄透鏡相機來說&#xff0c;基礎投影的數學模型可以表達為 我們把這個過程表達在笛…

mysql 字符集不一致導致索引失效問題

mysql 字符集不一致導致索引失效問題 問題&#xff1a; 兩張表&#xff0c;同一個字段&#xff0c;由于字符集不一致&#xff0c;導致雖然都有索引&#xff0c;在關聯查詢時&#xff0c;索引失效身份表 identity_info &#xff0c;查詢索引信息 show index from identity_info …