kotlin入门第三课:数据类型

路上的脚印 路上的脚印     2022-09-02     595

关键词:

 

前文链接:

Kotlin入门第一课:从对比Java开始

Kotlin入门第二课:集合操作

初次尝试用Kotlin实现Android项目

 

Kotlin的数据类型与Java类似,因此这篇文章主要看Kotlin的几点改变(改进)。

 

1. 内置数据类型

Double--64位    Float--32位

Long--64位        Int--32位

Short--16位       Byte--8位

Kotlin中字符型不再是基础类型,下面会进行介绍。

1.1 类型名称

类型只有首字母大写1种名称,如32位整型为Int,Java是int和Integer并存。

Kotlin只有一种形式:

1 var vInt: Int = 5

这样的改变会让开发者更加高效,不用多花精力在不同场景下切换使用的类型。

Java支持封箱和拆箱:

1 int vint = 5;
2 Integer vInt = vint;
3 vint = vInt;

Java中具体化泛型等情况下是必须要用Integer类型的,一般的整型变量用int即可,Kotlin现在统一使用Int。

1.2 类型转换

类型之间不能进行隐式转换,Java是允许的。

Kotlin代码第2-5行是编译不过的:

1 var vInt: Int = 5
2 var vLong: Long = vInt
3 var vLong: Long = (Long) vInt
4 vInt = vLong
5 vInt = (Int) vLong

错误信息:The integer literal does not conform to the expected type Int

对Kotlin了解地越多,越会发现它的安全性,尽量用显示的代码来实现明确的需求,不明确或隐式的部分越少越好。

Java代码只有第4行不能编译通过:

1 int vint = 5;
2 long vlong = vint;
3 vlong = (long) vint;
4 vint = vlong;
5 vint = (int) vlong;

Java中将类型从小到大进行隐式(或显示)转换属于正常赋值操作,从大到小只允许显示转换,但也可能会出现数据范围溢出问题。

对于类型之间的显示转换,Kotlin提供了以下方法:

toDouble(): Double    toFloat(): Float

toLong(): Long           toInt(): Int

toShort(): Short          toByte(): Byte

toChar(): Char             toString(): String

后面2个方法涉及到字符和字串,也就是说这8种数据类型可以相互转换。

Kotlin中的变量都是作为对象处理,所以连内置数据类型都有方法和属性。

以Int和Long为例,相互转换的代码:

1 var vInt: Int = 97
2 var vLong: Long = 98
3 vInt = vLong.toInt()
4 vLong = vInt.toLong()

注意不同类型各自的数值范围不同,特别是Byte、Char及Short这种小范围的数据类型。因为如果将数值从大类型转换为小类型时,可能会出现范围溢出问题,但是并不会提示什么错误信息,而是以"循环"的方式计算结果值,这当然是不正确的结果。

1 var vLong: Long = 128
2 var vByte: Byte = vLong.toByte()

Byte的长度和范围分别是8位和-128~127,当类型Long的128转为Byte时,超过最大值127的部分为1,所以继续向后移一个值作为结果,即-128。

还有就是String类型,当内容不是纯数值时,转换为数值会报错。

1 var vStr: String = "123asd"
2 var vInt: Int = vStr.toInt()

错误信息:Exception in thread "main" java.lang.NumberFormatException: For input string: "123asd"

 

2. 字符类型Char

Kotlin中Char类型(16位)不是基础类型,主要体现在和整型的关系上,Java中字符型和整型是可以隐式赋值和比较的,但Kotlin不行。

Java代码,vBool得到的值是true:

1 boolean vBool = 'a' == 97;

Kotlin代码,不能编译通过:

1 var vBool: Boolean = 'c' == 97

错误信息:Operator '==' cannot be applied to 'Char' and 'Int'

 

3. 布尔类型Boolean

可取值true或false,内置有&&、||及!三种逻辑操作,还有一个toString()方法。

 

4. 数组类型Arrays

Kotlin数组的定义方式更加简洁,下面代码定义了Int和String两个类型的数组。

1 val intArray: IntArray = intArrayOf(1, 2, 3)
2 val strArray = Array(5, { i -> (i * i).toString() })

通过索引方式([index])访问数组元素,如intArray[0]的值为1。

 

5. 字串类型String

Kotlin字串类型的定义和用法和Java类似,赋值的内容也是不能改变的。

1 var vStr: String = "123asd"

但是字符的获取除了get()方法,还可以直接用索引方式([index]),如vStr[3]的值为字符'a'。

另外,还可以通过foreach的形式来遍历字串,而Java是不能通过foereah遍历String类型变量的。

1 val vStr: String = "123asd"
2 for (c in vStr) {
3     println(c)
4 }

代码将字串中的字符挨个输出,结果为:

1
2
3
a
s
d

 

抽象工厂模式(java与kotlin版)

 前文推送设计模式简单工厂模式(Java与Kotlin版)工厂方法模式(Java与Kotlin版) Kotlin基础知识Kotlin入门第一课:从对比Java开始Kotlin入门第二课:集合操作Kotlin入门第三课:数据类型初次尝试用Kotlin实现Android项目 1.定... 查看详情

建造者模式(java与kotlin版)

 前文推送设计模式简单工厂模式(Java与Kotlin版)工厂方法模式(Java与Kotlin版)抽象工厂模式(Java与Kotlin版) Kotlin基础知识Kotlin入门第一课:从对比Java开始Kotlin入门第二课:集合操作Kotlin入门第三课:数据类型初次尝... 查看详情

spring入门第三课

属性注入属性注入就是通过setter方法注入Bean的属性值或依赖的对象。属性植入使用<property>元素,使用name属性指定Bean的属性名称,value属性或者<value>子节点指定属性值属性注入是实际应用中最常用的注入方式。构造方... 查看详情

stonedbclass入门第三课:stonedb的编译安装

本课程主要介绍StoneDB-5.6在Ubuntu20.04LTS下的手动编译,在CentOS和RedHat的编译详见官方文档。如果想快速部署,详见官方文档https://stonedb.io/zh/docs/getting-started/quick-deployment 查看详情

stonedbclass入门第三课:stonedb的编译安装

本课程主要介绍StoneDB-5.6在Ubuntu20.04LTS下的手动编译,在CentOS和RedHat的编译详见官方文档。如果想快速部署,详见官方文档​​https://stonedb.io/zh/docs/getting-started/quick-deployment​​编译工具以及第三方库的版本要求如下。编译工具及... 查看详情

elasticsearch入门第六篇:复合数据类型——数组,对象和嵌套

这是ElasticSearch2.4版本系列的第六篇:ElasticSearch入门第一篇:Windows下安装ElasticSearchElasticSearch入门第二篇:集群配置ElasticSearch入门第三篇:索引ElasticSearch入门第四篇:使用C#添加和更新文档ElasticSearch入门第五篇:使用C#查询文档... 查看详情

javascript入门第六章(数据类型比较)(代码片段)

1.null与undefined比较undefined与null的区别,两个都表示什么都没有null==undefined:成立,他们的值都是空null===undefined:不成立,他们的值相等但是数据类型不同<script>/*JS总共有六种数据类型,... 查看详情

elasticsearch入门第八篇:存储

这是ElasticSearch2.4版本系列的第八篇:ElasticSearch入门第一篇:Windows下安装ElasticSearchElasticSearch入门第二篇:集群配置ElasticSearch入门第三篇:索引ElasticSearch入门第四篇:使用C#添加和更新文档ElasticSearch入门第五篇:使用C#查询文档... 查看详情

javamail入门第五篇解析邮件

上一篇JavaMail入门第四篇接收邮件中,控制台打印出的内容,我们无法阅读,其实,让我们自己来解析一封复杂的邮件是很不容易的,邮件里面格式、规范复杂得很。不过,我们所用的浏览器内置了解析各种数据类型的数据处理... 查看详情

elasticsearch入门第一篇:windows下安装elasticsearch

这是ElasticSearch2.4版本系列的第一篇:ElasticSearch入门第一篇:Windows下安装ElasticSearchElasticSearch入门第二篇:集群配置ElasticSearch入门第三篇:索引ElasticSearch入门第四篇:使用C#添加和更新文档ElasticSearch入门第五篇:使用C#查询文档... 查看详情

spring入门第二十九课

事务的隔离级别,回滚,只读,过期当同一个应用程序或者不同应用程序中的多个事务在同一个数据集上并发执行时,可能会出现许多意外的问题。并发事务所导致的问题可以分为下面三种类型:-脏读-不可重复读-幻读看代码:db... 查看详情

spring入门第六课

XML配置里的Bean自动装配SpringIOC容器可以自动装配Bean。需要做的仅仅是在<bean>的autowire属性里指定自动装配的模式ByType(根据类型自动装配):若IOC容器中有多个与目标Bean类型一致的的Bean,在这种情况下,Spring将无法判定哪... 查看详情

大数据入门第八天——mapreduce详解

1/mr的combiner2/mr的排序3/mr的shuffle4/mr与yarn5/mr运行模式6/mr实现join7/mr全局图8/mr的压缩今日提纲一、 查看详情

大数据入门第七天——mapreduce详解(下)

一、mapTask并行度的决定机制   1.概述  一个job的map阶段并行度由客户端在提交job时决定  而客户端对map阶段并行度的规划的基本逻辑为:    将待处理数据执行逻辑切片(即按照一个特定切片大小,将待处理数据划... 查看详情

springmvc入门第二部分(代码片段)

SpringMVC入门第二部分数据带给页面方法1:在方法上传入原生的request和session方法2:在方法里面传入map,model或者modelMap---给request域中带数据map,modelmap,model继承关系图给这些参数里面保存的所有数据最终都会放在请求域中,可... 查看详情

大数据入门第十六天——流式计算之storm详解常用命令

一、常用命令  1.提交命令提交任务命令格式:stormjar【jar路径】【拓扑包名.拓扑类名】【拓扑名称】tormjarexamples/storm-starter/storm-starter-topologies-0.9.6.jarstorm.starter.WordCountTopologywordcount  查看详情

android入门第53天-在android手机里使用sqlite内嵌式数据库(代码片段)

介绍Android内带SQLite内嵌式数据库了。这对于我们存储一些更复杂的结构化数据带来了极大的便利。比如说我们要存储应用内的常用联系人,购物车暂存信息,常量。必竟从xml或者是json里取数据都没有一条Select语句来得简... 查看详情

springboot~入门第一篇~

 首先新建个maven项目菜单->File->New->Other->Maven->Maven->MavenProject->NewMavenProject勾上这个Createasimpleproject(skiparchetypeselection),Springboot就是个简单的maven项目设置下面参数(自己写)用下面的pom.xml数据 查看详情