Kotlin 基本數(shù)據(jù)類型

Kotlin基本數(shù)值類型

Kotlin 的基本數(shù)值類型有六種,即Byte,Short,Int,Long,Float,Double.我們發(fā)現(xiàn)與Java不同,它沒(méi)有char類型(kotlin中字符不是數(shù)值類型)。

????類型???? ??????位寬度(Bit)???
Byte 8
Short 16
Int 32
Long 64
Float 32
Double 64

字面常量

  • 十進(jìn)制,與普通寫(xiě)法一般,如 1234
  • Long型,在數(shù)字后面加L.==L必須大寫(xiě)==。如 1234L
  • 十六進(jìn)制,以0x開(kāi)頭。 如0xffffff
  • 二進(jìn)制表示則以0b打頭,如 0b00001011
  • 浮點(diǎn)數(shù)值若以f或F結(jié)束,則為Float類型,否則為Double
  • 不支持八進(jìn)制的字面常量。
  • 定義數(shù)字常量時(shí),可以使用 ==_==(下劃線)分隔數(shù)字,讓其更易讀

定義常量變量

  • Kotlin中定義常量與不可變變量(類似于Java final關(guān)鍵字修飾的變量)使用val關(guān)鍵字

      val <標(biāo)識(shí)符> : <類型> = <初始化值>
    
  • 變量定義則使用關(guān)鍵字 var

      var <標(biāo)識(shí)符> : <類型> = <初始化值>
    

編繹器支持自動(dòng)類型判斷,即聲明時(shí)可以不指定類型,由編繹器去判定。

非抽象類中,全局常量或變量在聲明變量時(shí)必須初始化。否則會(huì)有如下提示

image

或者改成這樣就不會(huì)有問(wèn)題

abstract class Test {

    abstract val q :Int;
}

而方法內(nèi)的局部變量或常量,在聲明時(shí)則可以不初始化,但是在引用前必須初始化,如下:

fun testMethod():Int{
        var a :Int;
        a = 2;
        a++;
        return a+2;
    }

下面有一些聲明常量或變量的例子

    abstract val q :Int;

    val a :Int = 1;

    val b = 1;

    val  temp = 4L;

    var bu = 2.55;

    val PRICE = 1234_5214_1522;

    var t = 0xffffff;

    var f = 4.5f;

    var c:String = "my name is oeager"

布爾類型

布爾用Boolean類型表示,它有兩個(gè)值:true 和 false。
Boolean內(nèi)置的函數(shù)邏輯運(yùn)算有:

 fun booleanTypeTest(flag:Boolean,a:Boolean){

        val and = flag.and(a);//&&

        val or = flag.or(a);// ||

        var not = flag.not();// !

        var xor = flag.or(a)// ^
    }

字符類型

和 Java 不一樣,Kotlin 中的 Char 不能直接和數(shù)字操作,Char 必需是單引號(hào)''包含起來(lái)的。比如普通字符 '0','a'。

如下的錯(cuò)誤示例

var Char ch = 1;//error
  • 字符字面值需用單引號(hào)括起來(lái),如 ‘1’。

  • 特殊字符需用反斜杠轉(zhuǎn)義。支持這幾個(gè)轉(zhuǎn)義序列:\t、 \b、\n、\r、'、"、\ 和 $。 編碼其他字符要用 Unicode 轉(zhuǎn)義序列語(yǔ)法:'\uFF00'。

  • 可以使用toInt()將數(shù)字字符轉(zhuǎn)化為數(shù)字

    fun testMethod3(){
          val ch :Char = '8';
          val a :Int = ch.toInt()
          print(a)
      }
    

數(shù)組

數(shù)組用類 Array 實(shí)現(xiàn),并且還有一個(gè) size 屬性及 getset 方法,由于使用 [] 重載了 getset 方法,所以我們可以通過(guò)下標(biāo)很方便的獲取或者設(shè)置數(shù)組對(duì)應(yīng)位置的值。
數(shù)組的創(chuàng)建兩種方式:

  • 使用函數(shù)arrayOf();
  • 使用工廠函數(shù)。

如下所示

  fun arrayTest(args:Array<String>){

        val array1 = arrayOf("str","str2")

        val array2 = Array(5,{index->(index+1)});
        
        print(array1[0])//輸出 str
        
        print(array2[1])//輸出2
    }

工廠方法源碼如下

  /**
     * Creates a new array with the specified [size], where each element is calculated by calling the specified
     * [init] function. The [init] function returns an array element given its index.
     */
    public inline constructor(size: Int, init: (Int) -> T)

第一個(gè)參數(shù),表示數(shù)組長(zhǎng)度,后面的花括號(hào)中是一個(gè)初始化值的執(zhí)行代碼塊,給出數(shù)組下標(biāo),初始化該下標(biāo)的值。

除了類Array,還有ByteArray, ShortArray, IntArray,用來(lái)表示各個(gè)類型的數(shù)組,省去了裝箱操作,因此效率更高,其用法同Array一樣:

val x: IntArray = intArrayOf(1, 2, 3)

: 與 Java 不同的是,Kotlin 中數(shù)組是不型變的(invariant)。這意味著 Kotlin 不讓我們把 Array 賦值給 Array,以防止可能的運(yùn)行時(shí)失敗

字符串類型

字符串也可以理解成字符的數(shù)組,可以用[]通過(guò)下標(biāo)來(lái)獲取對(duì)應(yīng)的字符

Kotlin 支持三個(gè)引號(hào) """ 擴(kuò)起來(lái)的字符串,支持多行字符串,比如:

fun strSample() {
    val text = """
    str1
    str2
    """
    println(text)   // 輸出有一些前置空格
}

String 可以通過(guò) trimMargin() 方法來(lái)刪除多余的空白。

fun strSample() {
    val text = """
    | str1
    |str2
    |多行字符串
    |bbbbbb
    """.trimMargin()
    println(text)    // 前置空格刪除了
}

字符串模板

  • $ 表示一個(gè)變量名或者變量值

  • $varName 表示變量值

  • ${varName.fun()} 表示變量的方法返回值:

      fun transform(text:String):String ="${text.replace("is","not is")},but origin is $text"
    

原生字符串和轉(zhuǎn)義字符串內(nèi)部都支持模板。 如果你需要在原生字符串中表示字面值 $ 字符(它不支持反斜杠轉(zhuǎn)義),你可以用下列語(yǔ)法:

fun strMouduar() {
    val price = """
    ${'$'}9.99
    """
    println(price)  // 求值結(jié)果為 $9.99
}

類型對(duì)象比較

Java中比較兩個(gè)對(duì)象地址是否相同時(shí),用==符號(hào),若要比較值相等,則調(diào)用Object的equals方法,但是在Kotlin中,==即表示比較值(equals),===則相當(dāng)于比較對(duì)象地址

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

    //經(jīng)過(guò)了裝箱,創(chuàng)建了兩個(gè)不同的對(duì)象
    val b: Int? = a
    val c: Int? = a

    //雖然經(jīng)過(guò)了裝箱,但是值是相等的,都是10000
    println(b === c) //  false,值相等,對(duì)象地址不一樣
    println(b == c) // true,值相等
}

數(shù)據(jù)類型轉(zhuǎn)換

由于不同的表示方式,較小類型并不是較大類型的子類型,較小的類型不能隱式轉(zhuǎn)換為較大的類型。 這意味著在不進(jìn)行顯式轉(zhuǎn)換的情況下我們不能把 Byte 型值賦給一個(gè) Int 變量。

val b: Byte = 1 // OK, 字面值是靜態(tài)檢測(cè)的
val i: Int = b // 錯(cuò)誤

可以像下面這樣

val b: Byte = 1 // OK, 字面值是靜態(tài)檢測(cè)的
val i: Int = b.toInt() // OK

每種數(shù)據(jù)類型都有下面的這些方法,可以轉(zhuǎn)化為其它的類型:

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

根據(jù)上下文環(huán)境能推斷出正確的數(shù)據(jù)類型,這種情況下類型能自動(dòng)轉(zhuǎn)化。

val l = 1L + 3 // Long + Int => Long

位操作符

對(duì)于Int和Long類型,還有一系列的位操作符可以使用,分別是:

shl(bits) – 左移位 (Java’s <<)
shr(bits) – 右移位 (Java’s >>)
ushr(bits) – 無(wú)符號(hào)右移位 (Java’s >>>)
and(bits) – 與
or(bits) – 或
xor(bits) – 異或
inv() – 反向
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容