2024年Android最新Kotlin学习日志(三)控制语句,小米面试题java

总结

作为一名从事Android的开发者,很多人最近都在和我吐槽Android是不是快要凉了?而在我看来这正是市场成熟的表现,所有的市场都是温水煮青蛙,永远会淘汰掉不愿意学习改变,安于现状的那批人,希望所有的人能在大浪淘沙中留下来,因为对于市场的逐渐成熟,平凡并不是我们唯一的答案!

资料.png
资料图.jpg

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

android:layout_height=“match_parent”

tools:context=“.MainActivity”>

<TextView

android:layout_marginTop=“20dp”

android:textColor=“#000”

android:padding=“20dp”

android:id=“@+id/tv_result”

android:layout_width=“match_parent”

android:layout_height=“wrap_content”/>

<Button

android:layout_marginTop=“20dp”

android:id=“@+id/btn_when_instance”

android:text=“WHEN INSTANCE”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”/>

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 count:Int = 1

var countType:Number

btn_when_instance.setOnClickListener {

count = (count + 1) % 3

countType = when(count){

0 -> count.toLong()

1 -> count.toDouble()

else -> count.toFloat()

}

tv_result.text = when(countType){

is Long -> “天若有情天亦老”

is Double -> “人间正道是沧桑”

else -> “无问西东”

}

}

}

}

判断类型为Long 时,运行效果图 如下

在这里插入图片描述

判断类型为Double 时,运行效果图 如下

在这里插入图片描述

为其他类型 时,运行效果图 如下

在这里插入图片描述

二、循环处理

===================================================================

2.1 遍历循环


Java遍历某个队列,可以通过“for(item:list)”形式的语句进行循环操作。同样,Kotlin也能使用类似形式的循环,区别在于吧冒号“:”换成了关键字“in”,示例代码如下:

布局文件的代码我就不贴了,都差不多

直接看代码吧

val txArray:Array = arrayOf(“十年生死两茫茫”,“不思量”,“自难忘”,“千里孤坟”,

“无处话凄凉”,“纵使相逢应不识”,“尘满面”,“鬓如霜”,“夜来幽梦忽还乡”,“小轩窗”,“正梳妆”,

“相顾无言”,“惟有泪千行”,“料得年年肠断处”,“明月夜”,“短松冈”)

btn_test.setOnClickListener {

var desc:String = “”

for (item in txArray){

desc = “ d e s c desc descitem, \n”

}

tv_result.text = desc

}

运行效果图如下:

在这里插入图片描述

但是一首词不可能结尾都是逗号,所以要改一下判断的代码,同时也改一下文章的格式,改为七言绝句,奇数为逗号,偶数为句号,在Kotlin中使用“for(i in 数组变量.indices)”语句,其中indices表示该数组变量的下标数组,每次循环从下表数组依次取出当前元素的下标,代码如下:

val txArray:Array = arrayOf(“日照香炉生紫烟”,“遥看瀑布挂前川”,“飞流直下三千尺”,“疑是银河落九天”)

btn_test.setOnClickListener {

var desc:String = “”

//indices表示该数组变量的下标数组

for (i in txArray.indices){

if (i % 2 == 0){

desc = “ d e s c desc desc{txArray[i]},\n”

}else{

desc = “ d e s c desc desc{txArray[i]}。\n”

}

}

tv_result.text = desc

}

运行效果图:

在这里插入图片描述

2.2 条件循环


使用while进行循环判断,示例代码如下:

val txArray:Array = arrayOf(“日照香炉生紫烟”,“遥看瀑布挂前川”,“飞流直下三千尺”,“疑是银河落九天”)

btn_test.setOnClickListener {

var poem:String = “”

var i:Int = 0

while (i < txArray.size){

if(i % 2 == 0){

poem = “ p o e m poem poem{txArray[i]}, \n”

}else{

poem = “ p o e m poem poem{txArray[i]}。 \n”

}

i++

}

poem = “ p o e m 该诗歌一共有 {poem}该诗歌一共有 poem该诗歌一共有{i}句。”

tv_result.text = poem

}

再来看看do/while

val txArray:Array = arrayOf(“日照香炉生紫烟”,“遥看瀑布挂前川”,“飞流直下三千尺”,“疑是银河落九天”)

btn_test.setOnClickListener {

var poem:String = “”

var i:Int = 0

do {

if(i % 2 == 0){

poem = “ p o e m poem poem{txArray[i]}, \n”

}else{

poem = “ p o e m poem poem{txArray[i]}。 \n”

}

i++

}while (i < txArray.size)

poem = “ p o e m 该诗歌一共有 {poem}该诗歌一共有 poem该诗歌一共有{i}句。”

tv_result.text = poem

}

2.3 跳出多重循环


之前的诗句都是中规中矩的,没有什么问题,但是实际开发中则不然,所以合理性判断时很重要的,Kotlin中的判断代码如下

val txArray:Array<String?> = arrayOf(“日照香炉生紫烟”,null,“遥看瀑布挂前川”,“”,“飞流直下三千尺”," ",“疑是银河落九天”,“望庐山瀑布”)

btn_test.setOnClickListener {

var poem:String =“”

var pos:Int = -1

var count:Int = 0

while (pos <= txArray.size){

pos++

//若发现该行时空串或者空格串,则忽略该行

if(txArray[pos].isNullOrBlank())

continue

if(count % 2 == 0){

poem = “ p o e m poem poem{txArray[pos]},\n”

}else{

poem = “ p o e m poem poem{txArray[pos]}。\n”

}

count++

//若合法行数达到4行,则结束循环

if(count == 4)

break

}

tv_result.text = poem

}

从上面的代码来看,合法性的判断用到的是continue和break,和Java一样,那么Kotlin真的就没有做什么改变吗?其实不然,Kotlin中,只要遇到有异常情况即可跳出循环,不管你是单层循序还是多层循环,说的跟真的一样,我们来实现一下吧

val txArray:Array<String?> = arrayOf(“日照香炉生紫烟”,null,“遥看瀑布挂前川”,“”,“飞流直下三千尺”," ",“疑是银河落九天”,“望庐山瀑布”)

btn_test.setOnClickListener {

var i:Int = 0

var is_found = false

//给外层循环加一个名为outside的标记

outside@ while (i < txArray.size){

var j:Int = 0

var item = txArray[i]

if (item != null) {

while ( j < item.length){

if(item[j] == ‘飞’){

is_found = true

//发现 这个飞 字直接跳出outside循环

break@outside

}

j++

}

}

i++

}

tv_result.text = if (is_found) “有” else “无”

}

上面的代码运行效果如下

在这里插入图片描述

上面的循环与判断时多层的,直接跳出显示结果,这就是 用了 @ 的好处,这也是Kotlin中的新的改变。

三、空安全

==================================================================

3.1 字符串的有效判断


开发中有很多的异常要进行判断处理,常见的异常种类包括空指针异常NullPointerException、数组越界异常IndexOutOfBoundsException、类型转换异常ClassCastException的等。其中,最讨嫌的就是空指针异常,这个异常会潜伏,藏的很深,运行过程中容易出错,但是编码编译的时候又可以“萌混过关”,有时候的APP突然闪退,就有空指针的缘故,这个判断在Java中是比较烦的,涉及到值的地方都得加一层判断"if(*** != null)“,烦不胜烦。而Android的SDK中提供了"TextUtils.isEmpty(” ** ")"这个方法,专门用于校验某个字符串是否为空值,Kotlin的研发人员当然也想到这个了,下面列举Kotlin校验空字符串的方法。

(1)isNullOrEmpty:为空指针或者字串长度为0时返回true,非空串与可空串均可调用。

(2)isNullOrBlank:为空指针、字串长度为0或者全为空格时返回true,非空串与可空串均可调用。

(3)isEmpty:字串长度为0时返回true,只有非空串可调用。

(4)isBlank:字串长度为0或者全为空格时返回true,只有非空串可调用。

(4)isNotEmpty:字串长度大于0时返回true,只有非空串可调用。

(5)isNotBlank:字串长度大于0且不是全空格串时返回true,只有非空串可调用。

对于上面的非空串可空串,在Kotlin中每个类型的变量都分作不可为空和可以为空两种,就是非空串和可空串,正常的声明变量默认都是非空串(不可为null),比如下面的这个代码:

3.2 声明可空变量


var strNotNull:String = “”

可以为空的变量,代码如下:

var strCanNull:String?

有兴趣的可以自己自己用上面6个方法测试一下,不为空的6个方法都可以用,可为空只能用前两个,这是对字符串判断是否为空串,如果要获取字符串的长度,或者调用其他的字符串方法,这时仍然要判断空指针,举个例子,下面有三个字符串:

var strA:String = “非空” //非空串

var strB:String? = null //可空串实际为空

var strC:String? = “可空串”//可空串实际不为空

对于strA来说,它是非空串,可以直接获取length长度属性,对于strB和strC必须进行非空判断,否则编译器可提示改行代码存在错误,这三个字符串的长度获取代码如下:

布局文件代码

<?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:textColor=“#000”

android:id=“@+id/tv_result”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”/>

<Button

android:layout_marginTop=“20dp”

android:id=“@+id/btn_a”

android:text=“A”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”/>

<Button

android:layout_marginTop=“20dp”

android:id=“@+id/btn_b”

android:text=“B”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”/>

<Button

android:layout_marginTop=“20dp”

android:id=“@+id/btn_c”

android:text=“C”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”/>

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 strA:String = “非空” //非空串

var strB:String? = null //可空串实际为空

var strC:String? = “可空串”//可空串实际不为空

var length:Int = 0

btn_a.setOnClickListener {

length = strA.length

tv_result.text = “字符串A的长度为$length”

}

btn_b.setOnClickListener {

//length = strB.length //这样写是会报错的

length = if(strB!=null) strB.length else -1

tv_result.text = “字符串B的长度为$length”

}

btn_c.setOnClickListener {

//因为字符串为可空,所以要先判断才可以获取长度这样写是会报错的

length = if(strC!=null) strC.length else -1

tv_result.text = “字符串C的长度为$length”

}

}

}

运行效果图如下:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.3 校验空值的运算符


Kotlin在访问空串的length属性会抛出空指针异常,可以加个标记,告诉编译器遇到空指针别抛异常,直接返回空指针就可以了,对应的代码如下:

var strB:String? = null //可空串实际为空

var length_null:Int?

btn_test.setOnClickListener {

//?表示变量为空时直接返回null,所以返回值的变量必须被声明为可空类型

length_null = strB?.length

tv_result.text = “使用?,得到字符串B的长度为$length_null”

}

运行效果如下:

在这里插入图片描述

从上面代码来看只是多了一个问号,语句strB?.length其实等于"length_null = if(strB!=null) strB.length else null" ,所以我们看的是null,如果不想在界面上显示null,还得另外判断length_null是否为空,也就是说还有操作空间,当然这不是Kotlin想看到的,所以它又引入了一个新的运算符"?:",学名叫作:“Elvis操作符”,可以当做Java的三元运算符,接下来看看怎么是使用这个“?:”代码如下:

var strB:String? = null //可空串实际为空

var length:Int?

btn_test.setOnClickListener {

//?:表示为空时就返回右边的值

length = strB?.length ?: -1

tv_result.text = “使用?:,得到字符串B的长度为$length”

}

运行效果图如下:

在这里插入图片描述

刚才是判断,接下来是强制转换,把双感叹号加在变量名称后面表示将可空类型转为非空类型,从而避免变量是否非空的校验,代码如下:

var strB:String? = null //可空串实际为空

var length:Int?

btn_test.setOnClickListener {

strB = “Kotlin”

length = strB!!.length

tv_result.text = “使用!!得到字符串B的长度$length”

}

运行效果图如下:

在这里插入图片描述

刚才用运算符“!!”强行放弃了非空判断,那么是否就万无一失了呢,是否还会抛出异常呢,看如下代码:

var strB:String? = null //可空串实际为空

var length:Int?

btn_test.setOnClickListener {

//!!表示不做非空判断,强制执行后面的表达式,如果变量为空,就会抛出异常

//所以只有在确保为非空时,才能使用!!

try {

//即使返回给可空变量length_null,也会抛出异常

length = strB!!.length

tv_result.text = “使用!!得到字符串B的长度$length”

}catch (e:Exception){

tv_result.text = “空指针异常”

}

}

运行效果如下:

在这里插入图片描述

最后来总结一下吧:

(1)声明变量示例时,在类型名称后面加问号,表示该变量可以为空。

(2)调用变量方法时,在变量名称后面加问号,表示一旦变量为空就返回null。

(3)新引入运算符“?:”,表示一旦变量为空,就返回该运算符右边的表达式。

(4)新引入运算符“!!”,通知编译器不做非空校验,如果运行时发现变量为空,就抛出异常。

四、等式判断

===================================================================

4.1 结构相等


基本数据类型如整型、长整型、浮点型、双精度、布尔类型,无论是在C/C++还是在Java抑或是在Kotlin,都使用双等号 “==”进行两个变量的相等性判断,而Kotlin中把字符串当作整型一样的判断 ,不等则用“!=”,用一个表来说明

| 字符串的等值性判断要求 | Java的判断方式 | Kotlin的判断方式 |

| — | — | — |

| 判断两个字符串是否相等 | strA.equals(strB) | strA == strB |

| 判断两个字符串是否相等 | !strA.equals(strB) | strA != strB |

下面通过代码来实践一下

布局文件:

<?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:textColor=“#000”

android:id=“@+id/tv_title”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”/>

<TextView

android:textColor=“#000”

android:id=“@+id/tv_result”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”/>

<Button

android:layout_marginTop=“20dp”

android:id=“@+id/btn_test”

android:text=“test”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”/>

MainActivity.kt代码

package com.llw.kotlinstart

import androidx.appcompat.app.AppCompatActivity

import android.os.Bundle

import kotlinx.android.synthetic.main.activity_main.*

import java.lang.Exception

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_main)

val he:String = “他”

val she:String = “她”

var isEqual:Boolean = true

btn_test.setOnClickListener {

if(isEqual){

tv_title.text = “比较 $he 和 $she 是否相等”

val result = he == she

tv_result.text = “== 的比较结果是$result”

}else{

tv_title.text = “比较 $he 和 $she 是否不等”

val result = he != she

tv_result.text = “!= 的比较结果是$result”

}

isEqual = !isEqual

}

}

}

运行效果:

在这里插入图片描述

再点一次

在这里插入图片描述

不单单是字符串String类型,凡是Java中实现了equals函数的类,其变量均可在Kotlin中通过运算符"==“和”!="进行等式判断,这种不比较存储地址,而是比较变量结构内部值的行为,Kotlin称之为结构相等。

4.2 引用相等


在Kotlin中,结构相等的运算符是双等号,那么引用相等的运算符便是三个等号 " === “,多出来的一个等号表示连地址都要相等,结构不等是“!=”,那么引用不等就是”!=="。不过大多数场合,结构相等和引用相等的判断结果是一致的,如以下场合:

(1)对于基本数据类型,包括整数、浮点型、布尔型、字符串、结构相等和引用相等没有区别

(2)同一个类声明的不同变量,只要有一个属性不相等,则其他既是结构不等,也是引用不等。

(3)同一个类声明的不同变量,若equals方法校验的每个属性都相等(譬如通过clone方法克隆而来的变量复制品),则其结构相等,但引用不等。

下面用代码来演示一下:

尾声

一转眼时间真的过的飞快。我们各奔东西,也各自踏上了自己的旅途,但是即使多年不见,也因为这份情谊我们依旧如从前那般“亲密”。不忘初心方得始终。加油吧,程序员们,在我看来35岁,40岁从来不是危机,只要永远不要忘记自己为何踏上征程!

为了让更多在学习中或者最近要准备面试的朋友们看到这篇文章,希望你们能多多评论,点赞+转发!

再次感谢所有给我提供过题目的朋友们,感谢一路有你!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

blog.csdnimg.cn/20200227162755604.png#pic_center)

再点一次

在这里插入图片描述

不单单是字符串String类型,凡是Java中实现了equals函数的类,其变量均可在Kotlin中通过运算符"==“和”!="进行等式判断,这种不比较存储地址,而是比较变量结构内部值的行为,Kotlin称之为结构相等。

4.2 引用相等


在Kotlin中,结构相等的运算符是双等号,那么引用相等的运算符便是三个等号 " === “,多出来的一个等号表示连地址都要相等,结构不等是“!=”,那么引用不等就是”!=="。不过大多数场合,结构相等和引用相等的判断结果是一致的,如以下场合:

(1)对于基本数据类型,包括整数、浮点型、布尔型、字符串、结构相等和引用相等没有区别

(2)同一个类声明的不同变量,只要有一个属性不相等,则其他既是结构不等,也是引用不等。

(3)同一个类声明的不同变量,若equals方法校验的每个属性都相等(譬如通过clone方法克隆而来的变量复制品),则其结构相等,但引用不等。

下面用代码来演示一下:

尾声

一转眼时间真的过的飞快。我们各奔东西,也各自踏上了自己的旅途,但是即使多年不见,也因为这份情谊我们依旧如从前那般“亲密”。不忘初心方得始终。加油吧,程序员们,在我看来35岁,40岁从来不是危机,只要永远不要忘记自己为何踏上征程!

为了让更多在学习中或者最近要准备面试的朋友们看到这篇文章,希望你们能多多评论,点赞+转发!

再次感谢所有给我提供过题目的朋友们,感谢一路有你!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 30
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值