- 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供調用。
-
- 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中的==和===的區別:
- kotlin的eques函數提供了兩個參數,第二個參數為boolean值,設置為true標識校驗過程中忽略大小寫。
- 無符號數值類型后續學習在整理(常規使用中使用不是很多)
- 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的實現,其區別也是順序。
- list:item可重復可null且保持item存儲順序的集合,通常使用最多的集合數據結構。
- 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中數據類型(包括集合等)
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
推薦閱讀更多精彩內容
- 原文鏈接:https://github.com/EasyKotlin 到目前為止,我們已經了解了Kotlin的基本...
- 第4章 基本數據類型與類型系統 《Kotlin極簡教程》正式上架: 點擊這里 > 去京東商城購買閱讀 點擊這里 >...
- 正式上架:《Kotlin極簡教程》Official on shelves: Kotlin Programming...
- 歡迎關注 二師兄Kotlin轉載請注明出處 二師兄kotlin 基本數據類型 在kotlin中,一切皆對象,對于一...