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:==和===的区别

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容