Kotlin学习(5):基本类型
来源:互联网 发布:validateform js 编辑:程序博客网 时间:2024/06/05 21:52
- 开发环境:IntelliJ IEDA
- 个人博客:http://blog.csdn.net/IInmy
- 项目源码:https://github.com/Rushro2m/LearnKotlin-master
1、数字
Kotlin处理数字在某种程度上接近Java,但是并不完全相同。例如,对于数字没有隐式拓宽转换(如Java中int可以隐式转换为long),另外有些情况字面值略有不同。
Kotlin提供了一些内置类型来表示数字:
(1)字面常量
数字常量字面值有以下几种:
- 十进制:123
- 十六进制:0x0F
- 二进制:0b00001011
- 不支持八进制
//十进制val a = 123val b = 123L//十六进制val c = 0x0f//二进制val d = 0b00001011
Kotlin同样支持浮点数的常规表示方法
- 默认类型为Double:123.5、123.5e10
- Float用f或者F标记:123.5f
//默认doubleval e = 123.5val f = 123.5e10//Float用f或者Fval g = 123.5Fval i = 123.5f
(2)下划线的使用
可以使用下划线使数字常量更易读
val oneMillion = 1_000_000val creditCardNumber = 1234_5678_9012_3456Lval socialSecurityNumber = 999_99_9999Lval hexBytes = 0xFF_EC_DE_5Eval bytes = 0b11010010_01101001_10010100_10010010
(3)表示方式
在Java平台数字是物理存储为JVM的原生类型,除非我们需要一个可空的引用(如Int?)或泛型。后者情况下会把数字装箱。
数字装箱不必保留一致性, 但它保留了相等性:
val a: Int = 10000print(a === a) // 输出“true”val boxedA: Int? = aval anotherBoxedA: Int? = aprint(boxedA == anotherBoxedA) // 输出“true”print(boxedA === anotherBoxedA) // !!!输出“false”!!!
注:在Kotlin中,“==”表示比较值是否相等,而“===”比较两个对象的地址是否相同
(4)显隐转换
Kotlin中较小的类型不能隐式转换为较大的类型,通过显式转换拓宽数字
- toByte():Byte
- toShort():Short
- toInt():Int
- toLong():Long
- toFloat():Float
- toDouble():Double
- toChar():Char
//错误的写法,编译不通过val b: Byte = 1val i: Int = b//正确写法, 必须显式转换val b: Byte = 1val i: Int = b.toInt()
缺乏隐式类型转换并不显著,因为类型会从上下文推断出来,而算术运算会有重载做适当转换。
val l = 1L + 3//Long + Int => Long
(5)运算
Kotlin支持数字运算的标准集,运算被定义为相应的类成员(但编译器会将函数调用优化为相应的指令)
对于位运算,没有特殊字符来表示,而只可用中缀方式调用命名函数,例如:
val x = (1 shl 2) and 0x000FF000
完整的位运算列表(只用于Int和Long)
- shl(bits) - 有符号左移(Java 的<<)
- shr(bits) - 有符号右移(Java的>>)
- ushr(bits) - 无符号右移(Java的>>>)
- and(bits) - 位与
- or(bits) - 位或
- xor(bits) - 位异或
- inv(bits) -位非
注:>>、<<、>>>是将二进制数进行位移。
//两种调用方式,结果都为0println(1 shr 2)println(1.shr(2))//结果为1println(2 shl 1 shr 2)println(2.shl(1).shr(2))
2、字符
字符用Char类型表示。一对单引号包括的值,为字符字面值。它们不能直接当作数字,比如这样:
fun check(c: Char) { if (c == 1) {//错误:类型不兼容 //... }}
字符字面值用单引号括起来:‘1’。特殊字符可以用反斜杠转义。支持这几个转义序列:\t、\b、\n、\r、\’、\”、\和$。编码其它字符要用Unicode转义序列语法:’\uFF00’。
我们可以显式把字符转换为 Int 数字:
fun decimalDigitValue(c: Char): Int { if (c !in '0'..'9') { println("不在范围内") } return c.toInt() - '0'.toInt()//显式转换为数字}
常用的方法
- isDigit()–>判断是否为数字
- isLetter()–>判断是否为字母
val aNum = '3'val aLetter = 'a'if (aNum.isDigit()) { println("aNum是一个数字")}if (aLetter.isLetter()) { println("aLetter是一个字母")}
3、布尔
布尔用Boolean类型表示,它有两个值:true和false。若需要可空引用布尔会被装箱。
var isVip = trueif (isVip) { println("欢迎Vip会员")} else { println("还不赶紧充值")}
内置的布尔运算有:
- || 短路逻辑或
- && 短路逻辑与
- ! 逻辑非
fun main(args: Array<String>) { val x = true val y = false println(x || y) println(x && y) println(!x)}
4、数组
数组在Kotlin中使用Array类来表示,它定义了get和set函数(按照运算符重载约定这会转变为[])和size属性,以及一些其它有用的成员函数:
(1)Array类中的一些属性和方法:
class Array<T> private constructor() { val size: Int operator fun get(index: Int): T operator fun set(index: Int, value: T): Unit operator fun iterator(): Iterator<T> // …… }
(2)创建数组
- arrayOf()
可以使用库函数arrayOf()来创建一个数组并传递元素之给它.
val ao = arrayOf(1, 2, 3, 4)
- arrayOfNulls()
可以用于创建一个指定大小,所有元素为空的数组。
val aon = arrayOfNulls<String>(3)
- Array
接受数组大小和一个函数参数的Array构造函数,用作参数的函数能够返回给定索引的每个元素的初始值:
val a = Array(5, { i -> (i * i).toString() })
注:Kotlin中数组是不型变的(invariant)。这意味着Kotlin不让我们把Array赋值给Array,以防止可能的运行是失败。
5、字符串
字符串用String类型表示,是有序字符(Char)集合。字符串是不可变的,字符串的元素–字符可以使用索引运算符访问s[i]。可以用for循环迭代字符串:
for(c in str){ println(c)}
(1)字面值
Kotlin中有两种类型的字符串字面值:转义字符串可以有转义字符,以及原生字符串,可以包含换行和任意文本。
- 转义字符串
转义采用传统的反斜杠方式。
val s = "Hello world!\n"
- 原生字符串
原生字符串 使用三个引号分界符括起来,内部没有转义并且可以包含换行和任何其它字符:
val text = """ for(c in "foo") println(c)"""
可以通过trimMargin()函数取出前导空格
val text2 = """ |Tell me and I forget. |Teach me and I remember. |Involve me and I Learn. |(Benjamin Franklin) """.trimMargin()
默认 | 用作边界前缀,但你可以选择其它字符并作为参数传入,比如 trimMargin(“>”)
val text2 = """ >Tell me and I forget >Teach me and I remember >Involve me and I Learn >(Benjamin Franklin) """.trimMargin(">") print(text2)
(2)字符串模版
字符串可以包含模版表达式,即一些小代码块,会求值并把结果合并到字符串中。模版表达式以美元符($)开头,由一个简单的名字构成:
val i = 10val s = "i = $i"
或者用花括号括起来的任意表达式:
val s = "abc"//输出内容为:"abc.length is 3"val str = "$s.length is ${s.length}"
原生字符串和转义字符串内部都支持模版。如果需要在原生字符串中表示字面值$字符(它不支持反斜杠转义),你可以用下列语法:
val price = """ ${'$'}9.99 """//输出结果为:$9.99 println(price)
(3)常用方法
- 判断字符串是否为空:isEmpty()
- 是否不为空:isNotEmpty()
- 计数:count()或者size
- 转换为字符数组:toCharArray()
//判断字符串是否为空course.isEmpty()//判断字符串是否不为空course.isNotEmpty()//计数course.count()//将字符串转换为字符数组for (letter in course.toCharArray()) { println(letter)}
- Kotlin学习(5):基本类型
- Kotlin学习-基本类型(三)
- Kotlin学习(四): 基本类型(Basic Types)
- Kotlin学习笔记——基本类型
- kotlin 官方学习教程之基本类型
- 学习kotlin第五天_kotlin基本类型
- Kotlin学习笔记一基本类型
- Kotlin编码规范和基本类型--kotlin官方文档学习
- Kotlin学习(5)空类型安全
- Kotlin 学习笔记(一) 基本类型和基本语法
- Kotlin语法(三)基本类型
- [kotlin系列] (s1_2)基本类型
- Kotlin基础(一)--- 基本类型
- Kotlin的基本类型
- Kotlin基本类型
- Kotlin 基本类型
- Kotlin 基本类型
- kotlin---基本类型
- 282. Expression Add Operators
- Java Redis发布订阅
- ios Error returned in reply:Connection invalid Software caused connection abort
- 牛客网-剑指offer-06-旋转数组的最小数字
- 150. Evaluate Reverse Polish Notation 逆波兰表达式
- Kotlin学习(5):基本类型
- java8 stream 常用的方法
- nginx安装与配置
- JS动态获取当前时间戳
- Java笔记--08
- 二. re模块函数详解
- 推荐系统老司机的十条经验
- 如何杀死含有redis的所有进程
- 牛客网js学习总结