Kotlin中數據類型(包括集合等)

  1. kotlin中的基本數據類型
    • kotlin不存在基本類型,都是對象類型。對象類型和java類似,包含byte,integer,short,long,float,double,string等。

      • 數字類型:byte,integer,short,long統稱為數字類型,其范圍和java的類型一致,即:


        數字類型取值范圍
      • kotlin可以不顯式指定變量的類型,針對數字類型kotlin會在第一次賦值的時候校驗其范圍確定變量的具體對應的類型,不超過int則用int,不超過long則用long,對此對比一些模棱兩可的變量建議直接聲明其類型比如時間戳。
      • long整形變量賦值可以直接加l后綴和java類似將其非long行轉變為long形。
      • 浮點類型:kotlin浮點型和java類似,也是Float和Double兩種。其特性如下:


        浮點型
      • kotlin的浮點型聲明沒有顯式指定則默認是Double型,即時其十進制位數符合Float其也是Double類型,若聲明為Float類型則必須在其后綴f或者F,比如i=3.14則1是Double類型,i=3.14f則其是Float類型,若Double類型的浮點型聲明數聲明為Float類型,則其自動截取并四舍五入到浮點型,即val e=2.7182818284f 則其實際值是2.7182817。
      • kotlin不存在數值類型的自動轉換,即int無法自動轉為long,float和double之間也不能自動轉換,此在參數使用過程中特別注意。


        數值類型參數
      • 數值類型的顯式轉換,和java也不同可以使用變量的直接api進行轉換,即a.toInt()將其轉為int類型,具體的轉換api如下(鑒于kotlin的類型反推很多情況不需要做顯式的數值轉換,其通過上下文進行推斷)


        kotin顯式轉換api集合
      • 數值類型的字面常量:


        字面常量
      • kotin和java類似支持數字運算的常規運算:加減乘除求與等運算,按位運算,浮點數的比較等運算。
    • kotlin中的Boolean類型:


      Boolean
    • kotlin中的char類型:


      Char類型
    • 和java類似,kotlin也存在變量和常量,和java不同的是kotlin針對變量和常量的聲明不一樣,kotlin聲明變量和常量的時候不需要直接聲明類型,使用val和var代替,前者是常量后者是變量即val=public final int i = 5,var= public int i=6。

    • kotlin針對變量進行類型校驗,在編譯階段變量第一次賦值的時候進行類型校驗,后續修改變量進行類型范圍校驗,即i=18,后續i賦值始終在int范圍內,一旦指定對應的類型后續不可用修改其類型。

    • kotlin也支持聲明常量和變量的時候直接聲明其類型即val i:Int = 6,前面需要關鍵字,變量名后面通過:+類型指定變量類型。

    • kotlin的常量和變量可以不聲明權限,對應的權限可以參考后續文章:kotlin中的類對權限進行詳細的描述。

    • kotlin中的關鍵字const 相當于java中的static,即:val const i = 6 相當于java中的 private final static i = 6。

    • kotlin作為java的變種語言,最終kotlin文件也會轉換編譯成為class文件在java虛擬機上運行,所以java的運算符kotlin都支持,包括基礎運算,&&/||/!,三目運算符等,且kotlin中引入java的類后,kotlin可以調用java類的屬性和方法且kotlin在java的基礎上封裝了更多的使用api供調用。

  2. kotlin中的字符串
    • kotlin中的字符串和java類似,也是使用''/""/'""'進行包裹標識為字符串。
    • kotlin中的字符串可以看做是一個字符數組,可以通過s[position]訪問字符串中的對應的字符,也可以通過for循環正向和反向遍歷訪問其對應的字符。
    • 字符串是不可變的,一旦字符串變量聲明并賦值則不可被改變,若修改或者重新賦值則是重新創建一個新的字符串對象。即a="xxx",若a="yyy",則a的值還是xxx。??? 數據model中的字符串是如何處理得 待研究
    • kotlin和java一致,兩個字符串或者字符串和其他類型可以通過+串聯,最終類型還是字符串。
    • kotlin和java的其他變種語言groovy,databindding中類似,字符串中提供${}占位符在{}里面可以直接引用屬性,或者某個類的屬性,或者運算符計算等。
    • kotlin中字符串和int等基本類型的轉換不同,java中需要Int.parse()函數進行字符串解析,kotlin則是在String類中直接提供了對應的轉換函數進行轉換。比如轉為int調用其toInt()函數即可
    • kotlin中的字符串==和eques函數等價,校驗結果是一樣的。
      • kotlin中的==和===的區別:
        • ==用于比較兩個對象的內容是否相等,若內容相等則返回true,kotlin中的==和java不一樣等價于java中的equals方法。
        • ===用于比較兩個對象的引用地址是否是同一個,若是同一個則返回true。
    • kotlin的eques函數提供了兩個參數,第二個參數為boolean值,設置為true標識校驗過程中忽略大小寫。
  3. 無符號數值類型后續學習在整理(常規使用中使用不是很多)
  4. kotlin中的集合(list和map)
    • 集合數據,kotlin和java一致,支持數組,集合set,列表list,key-valuemap等復合數據結構。
    • 區間:了解kotlin的復合集合數據結構的聲明需要先了解數學中的區間,數學中一串數字的集合被稱為區間,區間分為開區間,閉區間,開閉區間,閉區間表示包含一串數字的開始和結束數字,開區間表示不包含開始和結束數字,左開右閉表示包含起始數字不包含結束數字。
      • 區間的創建如下:
        1. 1..4:創建了1到4的閉合區間
        2. 1 until 10: 創建一個1到10的左開右閉區間,不包含10.
        2. kotlin提供了區間的對象封裝:IntRange/LongRange/CharRange 通過對象可以創建對應的閉合區間。
        3. 遍歷區間:通過for循環可以遍歷區間即for(i in 1..4){//i} 
        4. 遍歷區間其他特殊關鍵字整理:
            downTo :反向迭代區間即for(i in 4 downTo 1):從4開始逆向遍歷到1
            step: 步長,遍歷時候每次item的步長,步長必須為整數且正整數,逆向遍歷使用i in 最高值 downTo 最低值 step 正整數步長
        
    • 數列:以正整數集或者其子集為定義域的一列有序的數叫做數列,首先正整數+有序+一列,等差數列即相鄰的兩個數的差都相等的一組數叫做等差數列。數列的三要素是first,last和step,即第一個元素是first元素,則last元素并不一定是數列的結束元素,正向last元素=(last - first)% step ==0 的最大值且小于等于最終元素,逆向last元素算法相同的最小值且大于等于最終元素。即;


      last元素

      備注:數列的創建可以依賴于區間的創建和遍歷。

    • 序列:kotlin提供了集合外的一種容器類型。
      • 序列提供了和迭代器相同的函數,但是其處理機制和集合不同,不同點包含下面兩點:
        • 處理時機不同,集合的處理都是api調用立即進行處理,而序列不是序列在調用api后并不是立即處理而是等待序列的末端操作執行后才會處理,即多操作步驟機制中序列會等所有操作api調用后且最終操作調用后才會執行。
        • 處理的順序不同,集合的迭代等操作每一次操作都是針對集合所有item進行操作,當次操作完成后才會執行下一次操作,直到最后的操作完成。而序列是針對每個元素執行所有的操作后在執行下一個元素,即a元素執行所有操作在執行b元素的所有操作。
      • 序列的構造方式:
        •  由元素構造:val numbersSequence = sequenceOf("four", "three", "two", "one")
           由迭代器構造:
               val numbers = listOf("one", "two", "three", "four")
               val numbersSequence = numbers.asSequence()
           由函數構造:
               val oddNumbers = generateSequence(1) { it + 2 } // `it` 是上一個元素
               println(oddNumbers.take(5).toList()) //此時構造的序列是無限item的
               val oddNumbersLessThan10 = generateSequence(1) { if (it + 2 < 10) it + 2 else null }
               println(oddNumbersLessThan10.count()) //此時遇空值結束序列的構造
          
      • 序列的有時:
        • 延遲執行+單個元素的整體執行可以減少集合的最終執行的步驟(次數即數據結構的時間復雜度),比如同樣執行filter/map/take三個操作,序列由于take的操作(取前面給定元素的值)的限制只是處理得到符合條件的元素數即可,不需要所有的元素都進行處理。
    • 數組:和java一致,kotlin也提供了對于數組的支持
      • kotlin 指定數組數據的數組的聲明:語法上和java不太一樣,var nums = 1 .. 16:聲明一個1到16的int數組,1 util 16:聲明一個1到15的int數組,util是包含1不包含16的數組語法即上面說的左閉右開區間,也可以借助于kotlin內置函數創建對應的數組即var array=arrayof(1,2,3,4)創建一個指定數據的數組,填充內容也就決定了數組的數據類型。
      • 正常的項目中很少會直接用到指定數據的數組,多是創建指定大小的空數組后續賦值和遍歷,此數組的創建語法為:var array = arrayofNulls<Int>(8):泛型指定數組的數據類型,參數指定數組的個數。
      • kotlin和java不同封裝了類型數組類比如:IntArray/DoubleArray/ShortArray/LongArray/FloatArray/BooleanArray/CharArray,可以仿造kotlin系統的封裝自己封裝對應的常見的String數組。還需要注意的kotlin封裝數組可以提前指定數據也可以指定大小后續封裝數據。
    • java中的集合等復合結構是支持型變的,即聲明復合結構的時候泛型指向為父類,則其添加item對象可以為父類的任意子類對象,但是在日常使用過程中通常不這么干,填充不同的子類對象在使用過程中需要類型轉換,多類型可以嘗試泛型,具體類型通常使用具體的子類。kotlin中集合類型支持型變(數組不支持型變),map僅有value支持型變。
    • kotlin中的集合接口包括set,list,map,針對其特性整理如下:
      • list:item可重復可null且保持item存儲順序的集合,通常使用最多的集合數據結構。
        • list支持索引訪問元素,即0到list.size-1,且兩個list只要相同位置的item具有相同的結構和大小則兩個list相等。
        • kotlin中list的默認實現是arraylist,但是提供了LinkedList的封裝實現使用其構造方法將一個list包裝到LinkedList即可。
      • Set:item唯一且僅有一個為null的集合且item是無順序的。
        * 兩個set具有相同的item即為相等由于無序所以不需要考慮其順序
        * kotlin中的set的實現為HashSet和LinkedHashSet,區別是后面的保持item順序則提供了對應的first,last等順序api,然而hashset則使用的內存更少一些。
      • Map:key-valueitem屬性數據結構(具體的參考java中對于HashMap的實現即可):
        * 和Set類似,Map中kotlin的實現也是HashMap和LinkedHashMap的實現,其區別也是順序。
    • kotlin中集合的構建包含:元素,空集合,初始化函數,具體的構造函數,復制,映射/關聯等api。具體可以參考下面的文章(都是常規操作,不再詳細記錄)
    • kotlin的迭代器遍歷:和java迭代器相似將其不同點整理如下:
      • kotlin迭代器除了常規語法外還提供了for循環方式迭代,即for(item in 集合){ // item}方式迭代遍歷及其增強for循環api進行迭代即集合.forEach{// it}(kotlin 中的it常規是參數或者集合遍歷后的item)
      • kotlin針對list提供了ListIterator(list迭代器)和普通迭代器相比特點是可以雙向迭代遍歷,有next也有previous方法向前遍歷,還有就是提供了nextIndex()和previousIndex()api來操作list的索引。
      • MutableIterator(可變迭代器):對普通迭代器的擴展,普通迭代器僅能遍歷獲取item對象,可變迭代器在遍歷時候可以移除,添加和替換item對象。

參考文檔:集合的構建
kotlin:==和===的區別

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容