Kotlin学习笔记-数据类型

1、 数字类型字面常量的下划线

作用:分割数字进行分组,使数字常量更易读

val oneMillion = 1_000_000
val creditCardNumber = 1234_5678_9012_3456L
val socialSecurityNumber = 999_99_9999L
val hexBytes = 0xFF_EC_DE_5E
val bytes = 0b11010010_01101001_10010100_10010010

println("oneMillion => $oneMillion")
println("creditCardNumber => $creditCardNumber")
println("socialSecurityNumber => $socialSecurityNumber")
println("hexBytes => $hexBytes")
println("bytes => $bytes")

输出结果

oneMillion => 1000000
creditCardNumber => 1234567890123456
socialSecurityNumber => 999999999
hexBytes => 4293713502
bytes => 3530134674

2、装箱与拆箱

* 2.1、 装箱与拆箱

在Kotlin中,存在数字的装箱,但是不存在拆箱。因为Kotlin是没有基本数据类型的,Kotlin是万般皆对象的原则。故不存在和Java中的类似int是数据类型,Integer是整型的引用类型。

在Kotlin中要实现装箱操作。首先要了解可空引用。即类似Int?(只限数值类型)这样的。

val numValue: Int = 123
//装箱的过程,其实装箱之后其值是没有变化的
val numValueBox: Int? = numValue
println("装箱后: numValueBox => $numValueBox")

输出结果为:

装箱后: numValueBox => 123

2.2、 两个数值的比较

判断两个数值是否相等(==),判断两个数值在内存中的地址是否相等(===),其实上面的装箱操作之后其内存中的地址根据其数据类型的数值范围而定。

val numValue: Int = 128    
val numValueBox: Int? = numValue

/*
    比较两个数字
 */
var result: Boolean
result = numValue == numValueBox
println("numValue == numValueBox => $result")  // => true,其值是相等的

result = numValue === numValueBox
/*
  上面定义的变量是Int类型,大于127其内存地址不同,反之则相同。
  这是`kotlin`的缓存策略导致的,而缓存的范围是` -128 ~ 127 `。
  故,下面的打印为false
*/
println("numValue === numValueBox => $result")  

输出结果:

numValue == numValueBox => true
numValue === numValueBox => false

3、位运算符(还没看懂记录一下)

Kotlin中对于按位操作,和Java是有很大的差别的。Kotlin中没有特殊的字符,但是只能命名为可以以中缀形式调用的函数,下列是按位操作的完整列表(仅适用于整形(Int)和长整形(Long)):
shl(bits) => 有符号向左移 (类似Java的<<)

shr(bits) => 有符号向右移 (类似Java的>>)
ushr(bits) => 无符号向右移 (类似Java的>>>)
and(bits) => 位运算符 and (同Java中的按位与)
or(bits) => 位运算符 or (同Java中的按位或)
xor(bits) => 位运算符 xor (同Java中的按位异或)
inv() => 位运算符 按位取反 (同Java中的按位取反)

下面附上Kotlin中关于位操作符的源码:

/** Shifts this value left by [bits]. */
public infix fun shl(bitCount: Int): Int
/** Shifts this value right by [bits], filling the leftmost bits with copies of the sign bit. */
public infix fun shr(bitCount: Int): Int
/** Shifts this value right by [bits], filling the leftmost bits with zeros. */
public infix fun ushr(bitCount: Int): Int
/** Performs a bitwise AND operation between the two values. */
public infix fun and(other: Int): Int
/** Performs a bitwise OR operation between the two values. */
public infix fun or(other: Int): Int
/** Performs a bitwise XOR operation between the two values. */
public infix fun xor(other: Int): Int
/** Inverts the bits in this value. */
public fun inv(): Int

例:

/*
    位运算符
    支持序列如下:shl、shr、ushr、and、or、xor
 */
var operaNum: Int = 4

var shlOperaNum = operaNum shl(2)
var shrOperaNum = operaNum shr(2)
var ushrOperaNum = operaNum ushr(2)
var andOperaNum = operaNum and(2)
var orOperaNum = operaNum or(2)
var xorOperaNum = operaNum xor(2)
var invOperaNum = operaNum.inv()

println("shlOperaNum => $shlOperaNum \n " +
        "shrOperaNum => $shrOperaNum \n " +
        "ushrOperaNum => $ushrOperaNum \n " +
        "andOperaNum => $andOperaNum \n " +
        "orOperaNum => $orOperaNum \n " +
        "xorOperaNum => $xorOperaNum \n " +
        "invOperaNum => $invOperaNum")

输出结果为:

shlOperaNum => 16
shrOperaNum => 1
ushrOperaNum => 1
andOperaNum => 0
orOperaNum => 6
xorOperaNum => 6
invOperaNum => -5

4、数组型(Array)

创建数组的3个函数
arrayOf()
arrayOfNulls()
工厂函数(Array())

4.1、 arrayOf()

4.2、 arrayOfNulls()

用于创建一个指定数据类型且可以为空元素的给定元素个数的数组

var arr3 = arrayOfNulls(3)

//如若不予数组赋值则arr3[0]、arr3[1]、arr3[2]皆为null
for(v in arr3){
    print(v)
    print("\t")
}

println()

//为数组arr3赋值
arr3[0] = 10
arr3[1] = 20
arr3[2] = 30

for(v in arr3){
    print(v)
    print("\t")
}
//输出结果
null    null    null    
10  20  30

4.3、工厂函数

使用一个工厂函数Array(),它使用数组大小和返回给定其索引的每个数组元素的初始值的函数。
Array() => 第一个参数表示数组元素的个数,第二个参数则为使用其元素下标组成的表达式

var arr4 = Array(5,{index -> (index * 2).toString() })
for (v in arr4){
    print(v)
    print("\t")
}
//输出结果
0   2   4   6   8

你可能感兴趣的:(Kotlin学习笔记-数据类型)