一、基本数据类型
Kotlin的基本数据类型和其他高级语言得分类一样,包括整型、长整型、浮点型、双精度、布尔类型、字符型、字符串这几种常见类型,这样说可能过于抽象,那就和java中的基础数据类型来对比一下吧
这样就很立体了吧,请注意小写和大写的区别,Java中严格区分大小写的。
1.1变量声明
接下来声明一个变量了,
Java的写法如下:
int i = 0;
Kotlin的写法如下:
var i:Int = 0
解释:上面的 var 表示后面是一个变量声明语句,后面是“变量名:变量类型”的格式声明,不同于Java中常见的“变量类型:变量名”这种格式,(PS:这个在刚开始接触Kotlin的时候很容易搞混,用久了就可以了),后面是没有分号的,Java则有,在Kotlin中如果你后面还有其他语句的话则要加上分号,如果无其他语句则回车换行就行,不需要加分号,如下图所示:
1.2变量转换
Kotlin中进行数据转换和Java中不同,就不一一对比了,直接说Kotlin中如何进行数据类型转换,Kotlin中都是使用类型转换函数来进行数据类型转换的,让我们来认识一下,如下表
Kotlin的数据类型转换函数 | 转换函数说明 |
toInt | 转换为整型 |
toLong | 转换为长整型 |
toFloat | 转换为浮点数 |
toDouble | 转换为双精度数 |
toChar | 转换为字符 |
toString | 转换为字符串 |
接下来我们用代码来演示一下:
修改一下布局文件如下
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:gravity="center_horizontal" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:layout_marginTop="20dp" android:id="@+id/tv_data" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:layout_marginTop="20dp" android:id="@+id/btn_toInt" android:text="转换为整型" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <Button android:layout_marginTop="20dp" android:id="@+id/btn_toLong" android:text="转换为长整型" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <Button android:layout_marginTop="20dp" android:id="@+id/btn_toDouble" android:text="转换为双精度数" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <Button android:layout_marginTop="20dp" android:id="@+id/btn_toChar" android:text="转换为字符" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout>
然后是MainActivity.kt代码
package com.llw.kotlinstart import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val data:Float = 65.0f tv_data.text = data.toString() //转整数型 btn_toInt.setOnClickListener { var dataInt:Int = data.toInt() tv_data.text = dataInt.toString() } //转长整数型 btn_toLong.setOnClickListener { var dataLong:Long = data.toLong() tv_data.text = dataLong.toString() } //转双精度数 btn_toDouble.setOnClickListener { var dataDouble:Double = data.toDouble() tv_data.text = dataDouble.toString() } //转字符 btn_toChar.setOnClickListener { var dataChar:Char = data.toChar() tv_data.text = dataChar.toString() } } }
上面的代码是比较好理解的,一开始我们定义了一个val data:Float
这里的val相当于Java的final,然后赋值给TextView显示出来,接下来点击Button按钮来转换data的值,不同的按钮对应不同的值。
二、数组
说到数组,我们首先看一下Java中的声明数组并初始化
int[] int_array = new int[] {1,2,3};
然后是Kotlin中声明数组并初始化
var int_array:IntArray = intArrayOf(1,2,3)
者对比,对于同一整型数组的声明,Kotlin 与 Java之间有以下区别:
(1) Kotlin另外提供了新的整型数组类型,即IntArray。
(2) 分配一个常量数组,Kotlin调用的是 intArrayOf 方法,并不使用new关键字
下面用一个表格来详细说明Kotlin的数组类型及初始化方法
下面是这些基本类型数组的初始化例子:
var int_array:IntArray = intArrayOf(1,2,3) var long_array:LongArray = longArrayOf(1,2,3) var float_array:FloatArray = floatArrayOf(1.0f,2.0f,3.0f) var double_array:DoubleArray = doubleArrayOf(1.0,2.0,3.0) var boolean_array:BooleanArray = booleanArrayOf(false,true,false) var char_array:CharArray = charArrayOf('A','B','C')
我们是不是少了一个数据类型呢,对了就是字符串数组,这个和在Java中是不一样的,Kotlin中不存在名为StringArray的数组类型,因为String是一种特殊的基本数据类型,要想在Kotlin中声明字符串数组,得使用Array<String>类型,同时,分配字符串数组的方法也变成了arrayOf,下面是Kotlin中声明字符串数组的代码示例
var string_array:Array<String> = arrayOf("One","Two","Three")
这个方式就和Java的代码比较相像了,既然字符串数组可以这样写,那个其他的数据类型同样可以这么写,如下所示:
var int_array:Array<Int> = arrayOf(1,2,3) var long_array:Array<Long> = arrayOf(1,2,3) var float_array:Array<Float> = arrayOf(1.0f,2.0f,3.0f) var double_array:Array<Double> = arrayOf(1.0,2.0,3.0) var boolean_array:Array<Boolean> = arrayOf(false,true,false) var char_array:Array<Char> = arrayOf('A','B','C')
了解了数组的声明与初始化,接下来就是操作这个数组了,
2.1数组元素的操作
对于数组的操作,常见的处理包括获取数组的长度、获取指定位置的数组元素,这些操作在Kotlin与Java中是有区别的,如下:
(1)获取数组长度,Java使用**.length**,Kotlin使用**.size**(PS:前面有一个点)
(2)获取指定位置的数组元素,Java通过方括号加下标来获取,比如“
string_array[2]”(PS:获取该数组的第三个元素,下标是从0开始的),Kotlin也能通过方括号加下标来获取指定元素,不过Kotlin还有get和set两个方法,通过get方法获取元素值,通过set方法修改元素值,我们演示一下,代码如下:
布局文件
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:gravity="center_horizontal" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:layout_marginTop="20dp" android:id="@+id/tv_item" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:layout_marginTop="20dp" android:id="@+id/btn_string" android:text="测试" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout>
MainActivity.kt
package com.llw.kotlinstart import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) //声明字符串数组 var string_array:Array<String> = arrayOf("Day","Day","Up") btn_string.setOnClickListener { var str:String = "" var i:Int = 0 while (i<string_array.size){ //数组元素通过下标访问 // str = str + string_array[i] + "," //数组元素通过get方法访问 str = str + string_array.get(i) + "," i++ } tv_item.text = str } } }
运行效果图如下
代码也比较简单,说明一下,先声明一个字符串数组,在点击按钮的代码中,声明一个String变量,一个Int变量,并初始化,然后使用while循环,判断String数组的长度大于变量 i,当条件不满足时跳出循环,并显示最终结果在TextView上,循环中的逻辑也比较简单,取出i对应的数组元素,赋值给str,并用逗号隔开,取出的方式可以自选其一,这里就不过多的赘述了,赋值完成之后,i++,这是i就变成1,然后取数组中第二个值,再加一,变成2,取第三个值,再加一,变成3,3>3?,条件不满足,跳出循环,此时就将数组中的值都取出来了,(PS:我相信有基础的人会觉得我很啰嗦,但是这是必要的,后面会精简的),数组的操作就是这样了。
三、字符串
3.1字符串与基本类型的转换
这里我们对比一下Java的转换方式,如下表:
可以看到Kotlin相对于Java的转换要简单一些,通过方法即可实现。
3.2字符串的常用方法
常用方法:查找子串、替换子串、截取指定位置的子串、按特定字符分隔子串等,在这方面Kotlin基本兼容Java的相关方法,
1.查找子串,都调用indexOf方法。
2.截取指定位置子串,都调用substring方法。
3.替换子串,都调用replace方法。
4.按特定字符分隔子串,都调用split方法
下面是查找和截取的使用示例:
布局文件代码
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:gravity="center_horizontal" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <LinearLayout android:layout_marginTop="20dp" android:gravity="center" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:textColor="#000" android:text="初始值:" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:textColor="#000" android:text="200.56" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tv_data"/> </LinearLayout> <LinearLayout android:visibility="gone" android:id="@+id/result_lay" android:layout_marginTop="20dp" android:gravity="center" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:textColor="#000" android:text="结果值:" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:textColor="#000" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tv_result"/> </LinearLayout> <Button android:layout_marginTop="20dp" android:id="@+id/btn_substring" android:text="截取字符串" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout>
MainActivity.kt
package com.llw.kotlinstart import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.view.View import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) //截取小数点之前的字符串 //1.获取要截取的字符串 var data:String = tv_data.text.toString() //2.声明一个结果值 var result:String = data btn_substring.setOnClickListener { //查找目标字符, if(result.indexOf('.') > 0){ //如果有,则截取,substring有两个参数, // 分别是startIndex开始位置和endIndex结束位置,从第一个字节开始,到小数点停止,之间的内容 result = result.substring(0,result.indexOf('.')) //结果赋值 tv_result.text = result //控件显示 一开始我隐藏了,所以这个时候显示 result_lay.visibility = View.VISIBLE } } } }
运行效果图如下:
代码的解释我都已经写好了,一目了然。
接下来是替换字符串,使用replace方法,如下所示:
我们在布局文件activity_main.xml文件中添加如下代码
<LinearLayout android:layout_marginTop="20dp" android:gravity="center" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:textColor="#000" android:text="初始值:" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:textColor="#000" android:text="abcabcabcabcabcabc" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tv_replace_data"/> </LinearLayout> <LinearLayout android:visibility="gone" android:id="@+id/replace_result_lay" android:layout_marginTop="20dp" android:gravity="center" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:textColor="#000" android:text="结果值:" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:textColor="#000" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tv_replace_result"/> </LinearLayout> <Button android:layout_marginTop="20dp" android:id="@+id/btn_replace" android:text="替换字符串" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
在MainActivity.kt中新增如下代码:
//替换字符串 var replaceData:String = tv_replace_data.text.toString() btn_replace.setOnClickListener { if(replaceData.indexOf('c') > 0){ //replace方法也有两个参数,oldChar 要替换的目标字符,newChar替换后的字符,我们把c替换成a tv_replace_result.text = replaceData.replace('c','a') replace_result_lay.visibility = View.VISIBLE } }
运行效果如下图所示:
最后我们再写上截取字符串的示例代码
再activity_main.xml文件中再加上如下代码
<LinearLayout android:layout_marginTop="20dp" android:gravity="center" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:textColor="#000" android:text="初始值:" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:textColor="#000" android:text="abc_def_ghi_jkl_mno_pqr" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tv_split_data"/> </LinearLayout> <LinearLayout android:visibility="gone" android:id="@+id/split_result_lay" android:layout_marginTop="20dp" android:gravity="center" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:textColor="#000" android:text="结果值:" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:textColor="#000" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tv_split_result"/> </LinearLayout> <Button android:layout_marginTop="20dp" android:id="@+id/btn_split" android:text="替换字符串" android:layout_width="wrap_content" android:layout_height="wrap_content"/>