kotlin相关知识

kotlin相关知识

1.基本数据类型

Double 64 小数点后15到16位
Float 32 小数点后6位
Long 64 -1<<63-1<<63-1
Int 32 -2147483648-2147483647
Short 16 -32768-32767
Byte 8 -128-127
String 双引号

Int.MAX_VALUE Int.MIN_VALUE表示Int的最大最小范围值

十进制:123 长整型:123L 16进制:0x0F 二进制:0b00001011 不支持8进制

double写法:123.4 123.5e10 float:123.5f

1.比较数字

kotlin没有基础数据类型,只有封装的数字类型防止空指针

===表示表示比较对象地址 ==表示比较值大小

fun main(args: Array<String>) {
    val a: Int = 10000
    println(a === a) // true,值相等,对象地址相等

    //经过了装箱,创建了两个不同的对象
    val boxedA: Int? = a
    val anotherBoxedA: Int? = a

    //虽然经过了装箱,但是值是相等的,都是10000
    println(boxedA === anotherBoxedA) //  false,值相等,对象地址不一样
    println(boxedA == anotherBoxedA) // true,值相等
}

2.类型转换

val b: Byte = 1 // OK, 字面值是静态检测的
val i: Int = b.toInt() // OK
toByte(): Byte
toShort(): Short
toInt(): Int
toLong(): Long
toFloat(): Float
toDouble(): Double
toChar(): Char

3.位操作符 ,仅Int和Long

shl(bits) – 左移位 (Java’s <<)
shr(bits) – 右移位 (Java’s >>)
ushr(bits) – 无符号右移位 (Java’s >>>)
and(bits) – 与
or(bits) – 或
xor(bits) – 异或
inv() – 反向
	var a=1
    a=a.shl(1)
    print(a)//2

4.字符

用单引号包裹起来的

fun decimalDigitValue(c: Char): Int {
    if (c !in '0'..'9')
        throw IllegalArgumentException("Out of range")
    return c.toInt() - '0'.toInt() // 显式转换为数字
}

5.布尔

布尔用 Boolean 类型表示,它有两个值:true 和 false。

|| – 短路逻辑或
&& – 短路逻辑与
! - 逻辑非

6.数组

数组用类 Array 实现,并且还有一个 size 属性及 get 和 set 方法,由于使用 [] 重载了 get 和 set 方法,所以我们可以通过下标很方便的获取或者设置数组对应位置的值。

数组的创建两种方式:一种是使用函数arrayOf();另外一种是使用工厂函数。

/**整型Int的数组*/
val arrayOfInt: IntArray = intArrayOf(1,3,5,7,9)//Int数组
/**字符Char类型的数组*/
val arrayOfChar: CharArray = charArrayOf('H','e','l','l','o','W','o','r','l','d')//字符数组
/**字符串String数组*/
val arrayOfString: Array<String> = arrayOf("Hello","World")//字符串数组
/**类的数组*/
val arrayOfUniversity: Array<University> = arrayOf(University("北京大学"),University("东京大学"))//对象数组
//查看有多少个元素
    println(arrayOfInt.size)
	println(arrayOfInt[0])//获取第1个元素
	println(arrayOfInt.get(0))//获取第一个元素
	arrayOfInt[0]=2//更改第一个元素的值为2
	arrayOfInt.set(0,3)//更改第1个元素的值为3
    //遍历数组
    for (char in arrayOfChar){
        print(char)//HelloWorld
    }
	//将char连接成一个字符串,默认是自动由逗号","分割的,输出H, e, l, l, o, W, o, r, l, d
    println(arrayOfChar.joinToString())//H,e,l,l,o,W,o,r,l,d
    //如果想要连成HelloWorld
    println(arrayOfChar.joinToString (""))//HelloWorld
	 //数组的切片,输出3,5,结尾需要arrayOfInt-1,不然会报索引越界异常
    println(arrayOfInt.slice(1..2))//[3,5]
    for (i in arrayOfInt.slice(1..2))print(i)//35

	var lists= listOf<String>("a","b","c")
    for (list in lists)print(list)//abc

	var map=TreeMap<String,Int>()
    map["x"]=1
    map["y"]=2
    map["z"]=3
    for ((index,value) in map)println("$index,$value")

7.字符串

和 Java 一样,String 是不可变的。

 var s="hello"
 for (i in s)print(i)//遍历字符串,hello

支持多行字符串

val text = """
    |多行字符串
    |菜鸟教程
    |多行字符串
    |Runoob
    """.trimMargin()
    println(text)

默认 | 用作边界前缀,但你可以选择其他字符并作为参数传入,比如 trimMargin(">")。

8.字符串模板

	val s = "runoob"
    val str = "${s} .length is ${s.length}" // 求值结果为 "runoob.length is 6"
    println(str)
	val price="${'$'}9.99"
    print(price)//$9.99

2.条件控制

1.if表达式

// 传统用法
var max = a 
if (a < b) max = b
// 使用 else 
var max: Int
if (a > b) {
    max = a
} else {
    max = b
}
// 作为表达式
val max = if (a > b) a else b
//我们也可以把 IF 表达式的结果赋值给一个变量
val max = if (a > b) {
    print("Choose a")
    a
} else {
    print("Choose b")
    b
}
fun main(args: Array<String>) {
    var x = 0
    if(x>0){
        println("x 大于 0")
    }else if(x==0){
        println("x 等于 0")
    }else{
        println("x 小于 0")
    }

    var a = 1
    var b = 2
    val c = if (a>=b) a else b
    println("c 的值为 $c")
}
//x 等于 0
//c 的值为 2
	val x = 5
    if (x in 1..8) println("x 在区间内")//使用区间

2.when表达式

when (x) {
    1 -> print("x == 1")
    2 -> print("x == 2")
    else -> { // 注意这个块,default,上面都不满足时
        print("x 不是 1 ,也不是 2")
    }
}
when (x) {
    0, 1 -> print("x == 0 or x == 1")
    else -> print("otherwise")
}
when (x) {
    in 1..10 -> print("x is in the range")
    in validNumbers -> print("x is valid")
    !in 10..20 -> print("x is outside the range")
    else -> print("none of the above")
}
fun hasPrefix(x: Any) = when(x) {
    is String -> x.startsWith("prefix")//检测字符串是否以prefix开头
    else -> false
}
val str="hello ${when(a){
        is Int -> 3
        else -> 4
    }    }world"
    print(str)//hello 3world,由于x是Int类型的值

val items = setOf("apple", "banana", "kiwi")
    when {
        "orange" in items -> println("juicy")//不成立
        "apple" in items -> println("apple is fine too")//成立
    }

3.循环控制

1.for循环

for 循环可以对任何提供迭代器(iterator)的对象进行遍历,语法如下:

for (item in collection) print(item)

for (i in array.indices) {//遍历一个数组或者list
    print(array[i])
}

for ((index, value) in array.withIndex()) {
    println("the element at $index is $value")
}
for (i in 1..4) print(i) // 打印结果为: "1234"
for (i in 4 downTo 1) print(i) // 打印结果为: "4321"
for (i in 1..4 step 2) print(i) // 打印结果为: "13"
for (i in 4 downTo 1 step 2) print(i) // 打印结果为: "42"
for (i in 1 until 10) { // i in [1, 10), 不包含 10
     println(i)
}

2.while与do…while循环

while( 布尔表达式 ) {
  //循环内容
}
do {
       //代码语句
}while(布尔表达式);
  • return。默认从最直接包围它的函数或者匿名函数返回。
  • break。终止最直接包围它的循环。
  • continue。继续下一次最直接包围它的循环。
loop@ for (i in 1..100) {
    for (j in 1..100) {
        if (……) break@loop//标签
    }
}

4.函数

fun sum(a: Int, b: Int): Int {   // Int 参数,返回值 Int
    return a + b
}
fun sum(a: Int, b: Int) = a + b
public fun sum(a: Int, b: Int): Int = a + b   // public 方法则必须明确写出返回类型
fun printSum(a: Int, b: Int): Unit {//无返回值,可以省略:Unit
    print(a + b)
}
//不定长参数
fun vars(vararg v:Int){//函数的变长参数可以用 vararg 关键字进行标识
    for(vt in v){
        print(vt)
    }
}
//lambda(匿名函数)
fun main(args: Array<String>) {
    val sumLambda: (Int, Int) -> Int = {x,y -> x+y}
    println(sumLambda(1,2))  // 输出 3
}
var i={x:Int,y:Int -> x+y}
print(i(1,2))
var j:(Int,Int) -> Int= {x,y -> x+y}
print(j(1,2))

val pi=3.1415926
fun getarea(p:Double=pi,r:Int):Double=p*r*r//参数默认值
println(getarea(r=2))//12.5663704
println(getarea(3.0,2))//12.0
//尾递归函数
tailrec fun fibolaAlgorithm(num: Int, result: Int): Int {
    println("剩余递归次数 : $num \t 计算结果: $result")
    return if (num == 0) {
        1
    } else {
        fibolaAlgorithm(num - 1, result + num)
    }
}
//高阶函数
// 函数作为参数
fun paramFun() {
    val list = listOf(1, 2)
    list.forEach(::println)
}
// 函数作为返回值
fun returnFun(): (Int, Int) -> Int {
    return { j, i -> j + i }
}
println(returnFun().invoke(1,2))
//闭包函数
fun closureMethod(i: Int): () -> Int {
    var memoryValue = 1
    return fun(): Int {
        return i + memoryValue++
    }
}
val closure = closureMethod(0)
println(closure()) ------> 1
println(closure()) ------> 2

5. 类与对象

class Person{
    var name
    var age=0
    fun eat(){
        println(name+"is eating. He is "+age+"years old")
    }
}
val p=Person()//实例化
p.name="xjb"
p.age=20
p.eat()
posted @   俊波  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示