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()
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库