当前位置: 首页>后端>正文

kotlin基础一:数据类型

前言

Google对Android技术不断更新,Android开发Kotlin已经成为主流语言。我们从Kotlin基础学起。这篇是Kotlin的基础知识基本数据类型

整型

整型Kotlin提供了四种不同的类型:

类型 大小(比特数) 最小值 最大值
Byte 8 -128 127
Short 16 -32768 32768
Int 32 -2,147,483,648 2,147,483,648
Long 64 -9,223,372,036,854,775,808 9,223,372,036,854,775,808

bit(比特数)计算机内部最小数据存储单元。表示二进制位。 Byte(字节数)Byte计算机处理数据的基本单位。

1Byte = 8bit
1Short = 2Byte
1Int = 4Byte
1Long = 8Byte

浮点数

Float与Double类型。根据IEEE 754 标准,两种浮点类型的十进制位数不同(存储多少位十进制数)不同。Float单精度,Double是双精度。

类型 大小(比特数) 有效数字比特数 指数比特数 十进制数
Float 32 24 8 6~7
Double 64 53 11 15~16

小数初始化的变量,编译器会推断为Double类型。如果需要显式指定Float类型,添加f或者F后缀。如果值包含多于6~7位十进制,则舍入。

val a = 3.14 //Double
val b = 2.7182818283 //Double
val c = 2.7182818283f //Float 实际值为 2.7182817

字符

Char类型表示。声明字符字面值需要用英文单引号括起来。

val char='c'

特殊字符用反斜杠转义。\t \b \n \r ' " \ 与$。编码其他字符要用Unicode转义序列语法:'\uFF00'

val a = '\t' //水平制表(HT) 跳到下个TAB位置
val b = '\b' //退格(BS),将当前位置移到前一列
val n = '\n' //换行(LF),将当前位置移到下一行开头
val r = '\r' //回车(CR),将当前位置移到本行开头
val c = '\'' //代表一个单引号(撇号)字符
val c1 = '\"'//双引号字符
val c2 = '\'//反斜线字符
val c3 = '$'//美元符号。${}一般表示变量或者表达式

字符可以转换为整型或浮点型

val a = '0'.toInt()
val numFloat = '0'.toFloat()

布尔

用Boolean类型表示ture/false若需要可空引用布尔会被装箱。

val a:Boolean = false

内置布尔运算:

  • || 短路逻辑或
  • && 短路逻辑与
  • !逻辑非

字面常量

  • 二进制:0b00001011。以0B开头
  • 八进制:kotlin目前不支持
  • 十进制:通常以数字0,1,2,3,4,5,6,7,8,9表示,若声明Long类型用大写L标记 246L。
  • 十六进制:0x0f 以数字0,1,2,3,4,5,6,7,8,9和字母A,B,C,D,E,F(a,b,c,d,e,f)表示。A-F表示10~15。

kotlin1.1起可以在数字前面添加下划线,使数字常量更易读。

val a = 123_123_123
val b = 0xFF_12_AB_5E
val c = 0b11010011_10010101

位运算

用中缀方式调用函数

val a = (1 shl 2) and 0x000FF001

位运算列表:

位运算符 kotlin java
有符号左移 shl(bits) >>
有符号右移 shr(bits) <<
无符号右移 ushr(bits) >>>
位与 and(bits) &
位或 or(bits)
位异或 xor(bits)
位非(取反运算符) inv() ~

装箱和拆箱

Java中的定义:装箱和拆箱是指发生在基本类型与包装类型之间的转换。

  • 装箱:基础类型(int double等)转换成包装类型(Integer Double等)的过程。
  • 拆箱:从包装类型转换到基础类型的过程。
int a = 1;
Integer b = a;// 拆箱
int c = b;// 装箱

Kotlin中只存在基本类型的装箱过程,并不存在拆箱。Kotlin中没有基本数据类型的包装类,Kotlin中都是对象。 声明某个类型是可空对象:

Int?
String?
ClassName?
val a:Int = 12
val b:Int= a //装箱的过程,装箱后值没有发生变化

显示转换

Kotlin中基本数据类型较小的类型并不是较大类型的子类,较小的类型并不能隐式的转换为较大的类型。

val a:Byte = 0
val b:Int = b.toInt()// 需要这样处理

在Kotlin中每个数字类型支持如下转换:

  • toByte(): Byte
  • toShort(): Short
  • toInt(): Int
  • toLong(): Long
  • toFloat(): Float
  • toDouble(): Double
  • toChar(): Char

运算

Kotlin支持数字运算的标准集(+ - * / %),运算被定义为相应的类成员(编译器会将函数调用优化为相应的指令) 运算符重载。

整数除法

整数除法返回整数,丢弃任何小数部分。

val a = 5/2
// println(a == 2.4) // ERROR:Operator '==' cannot be applied to 'Int' and 'Double'
println(a == 2) // true
val b = 5L/2
println(b == 2L) // true
val c = 5/2.toDouble()
println(c == 2.5)// true

数组

Array类来表示,定义了get和set函数(按照运算符重载约定会转变为[])以及size属性。

public class Array<T> {
    public inline constructor(size: Int, init: (Int) -> T)

    public operator fun get(index: Int): T

    public operator fun set(index: Int, value: T): Unit

    public val size: Int

    public operator fun iterator(): Iterator<T>
}

可以使用Array类自带的次构造函数,创建一个指定大小,每个元素都相同的数组。

// init是函数类型的参数
public inline constructor(size:Int,init:(Int)->T)

也可以使用Library.kt文件中的顶层函数,arrayOf(vararg:element T)来创建一个数组并传递元素值给它,这样arrayOf(1,2,3)创建了array[1,2,3].或者,库函数arrayOfNulls(size:Int)可以用于创建一个指定大小的,所有元素为空的数组。

val arr = Array(3){"a"} 
arr.onEach { println(it) }//a a a
val array = arrayOf(1,2,3)
array.onEach { println(it) }//1 2 3
val nullArray = arrayOfNulls<Int>(2)
nullArray.onEach { println(it) }//null null
println(nullArray[0])// null

[]运算符代表调用成员函数get()

原生类型的数组

Kotlin有无装箱开销的专门的类来表示原生类型数组:ByteArray ShortArray IntArray 等。这些类与Array没有继承关系,它们有相同的方法属性集。它们都有相应的工厂方法:

val x:IntArray = intArrayOf(1,2,3)
x[0] = x[1]+x[2]
// 大小为5 值为[0,0,0,0,0]的整型数组
val arr = IntArray(5)
arr.onEach { println(it) }
// 大小为5,值为[2,2,2,2,2]的整型数组
val arr2 = IntArray(5){2}
// 大小为5,值为[0,1,2,3,4]
var arr3 = IntArray(5){it}(值初始化为其索引值)
arr3.onEach { println(it) }

字符串

Kotlin用String来表示字符串。字符串是不可变的。字符串中的元素 字符串可以使用索引运算符访问a[i]。可以用for循环迭代字符串:

val str = "kotlin"
for (a in str){
    println(a)// kotlin
}

字符串字面值可以包含模板表达式,一小段代码,把结果合并到字符串中。模板表达式以美元符($)开头:

val str = "kotlin"
println("str = ${str.length}")// 6

总结

kotlin的基础知识与java可能有点差别,感觉更像js上面的语法,更加人性化。有了基础知识的支撑才能为以后Android开发或者从事kotlin相关语言开发做铺垫。


https://www.xamrdz.com/backend/3ck1941469.html

相关文章: