《Kotlin进化之路》之【第二章:揭开Kotlin的基础面纱】(五)

2.4 StringBuffer和StringBuilder

对于有Java基础的同学来说,对这两个类再熟悉不过了,不熟悉的同学也没有关系,接下来我也会一点一点的去剖析。

为什么有了String,还要有StringBuffer和StringBuilder呢?最大的原因在于StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象;StringBuilder它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。

由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。

代码演示:

fun main(args: Array<String>) {
  var mStringBuffer=StringBuffer("我是李晓明")
  var mStringBuilder=StringBuilder("我是AbnerMing")
  println(mStringBuffer)
  println(mStringBuilder)
}

打印结果:

我是李晓明
我是AbnerMing

两个类的基本方法类似,下面我们就一一来列举一下:

2.4.1:添加元素

无论是StringBuilder还是StringBuffer,都是使用append()来进行追加元素,append()可以追加的类型有很多,且看源码:

append(Object obj)

append(String str)

append(StringBuffer sb)

append(AbstractStringBuilder asb)

append(CharSequence s)

append(CharSequence s, int start, int end)

append(char[] str)

append(char[] str, int offset, int len)

append(boolean b)

append(int i)

append(long lng)

append(float f)

append(double d)

代码演示:

fun main(args: Array<String>) {
  var mStringBuffer=StringBuffer("我是李晓明")

  mStringBuffer.append(1)
  mStringBuffer.append(88.88)
  mStringBuffer.append(true)
  mStringBuffer.append(",好啊")
  println(mStringBuffer)

}

打印结果:

我是李晓明188.88true,好啊

2.4.2:删除元素

使用delete(int start, int end)或者deleteCharAt(int index)方法来删除元素,具体使用看代码演示:

代码演示:

fun main(args: Array<String>) {
  var mStringBuffer=StringBuffer("我是李晓明")

  mStringBuffer.delete(0,2) //删除索引0至2的字符
  println(mStringBuffer)
  mStringBuffer.deleteCharAt(0) //删除索引为0的字符
  println(mStringBuffer)
  mStringBuffer.delete(0,mStringBuffer.length) //删除所有字符
  println(mStringBuffer.toString()+"==")
}

打印结果:

李晓明
晓明
==

2.4.3:插入元素

使用insert()来插入元素,具体参数看以下代码:

insert(int index, char[] str, int offset,
                                        int len)

insert(int offset, Object obj)

insert(int offset, String str)

insert(int offset, char[] str)

insert(int dstOffset, CharSequence s)

insert(int dstOffset, CharSequence s,
        int start, int end)

insert(int offset, boolean b)

insert(int offset, char c)

insert(int offset, int i)

insert(int offset, long l)

insert(int offset, float f)

insert(int offset, double d)

代码演示:

fun main(args: Array<String>) {
  var mStringBuffer=StringBuffer("我是李晓明")

  mStringBuffer.insert(2,"==")

  println(mStringBuffer)
}

打印结果:

我是==李晓明

2.4.4:替换元素

替换元素和字符串使用的是一致的,都是使用replace(int start, int end, String str),唯一不同的是这里需要三个参数,第一个是替换元素的起始位置,第二个是替换元素的结束位置,最后一个是要替换的元素。

代码演示:

fun main(args: Array<String>) {
  var mStringBuffer=StringBuffer("我是李晓明")

  mStringBuffer.replace(0,2,"AbnerMing")

  println(mStringBuffer)
}

打印结果:

AbnerMing李晓明

2.4.5:获取指定的元素

使用substring(int start, int end)来获取指定索引之间的元素。

代码演示:

fun main(args: Array<String>) {
  var mStringBuffer=StringBuffer("我是李晓明")

  var mSub=mStringBuffer.substring(0,2)

  println(mSub)
}

打印结果:

我是

关于StringBuffer和StringBuilder的方法还有一些,像获取长度用length,转换成字符串用toString()等,这里就不详细的列举出了,毕竟常用的以上都概括了,用到其它方法的时候,大家可以看下源码,便了解了。

2.5 条件流程控制

正因为有了条件流程控制,才让编程语言富有趣味,富有逻辑,在杂而乱的代码世界里,仿佛有了人的气息,在这小节里,我们会主要认识if,else,else if,还有switch,when表达式,如果您有其它高级语言的基础,这节可以跳过去,毕竟和其它语言都有着类似,如果您是刚入门编程语言的小白,建议您仔细的去观看。

2.5.1:一个 if 语句包含一个布尔表达式和一条或多条语句

代码演示,定义一个变量a,a假设就是你的考试成绩,a大于90,代表着您的考试成绩为优秀:

fun main(args: Array<String>) {
    var a:Int = 98

    if (a > 90){
        println("优秀")
    }
}

打印结果:

优秀

2.5.2:if语句加上else一起使用,如果条件成立,就走if语句,否则就走else语句:

代码演示:

fun main(args: Array<String>) {
    var a:Int = 88

    if (a > 90){
        println("你是个优秀的学生")
    }else{
        println("你不是个优秀的学生")
    }
}

打印结果(这里只是个测试,88分也是很优秀的哦~):

你不是个优秀的学生

如果我们想要分别打印出某个区间的评价,那么我们就可以使用if else if else相结合的语法使用,例如,给定一个分数,判断大于90分的为优秀,8090分的为良好,6080分的为及格,其它为差生。

代码演示:

fun main(args: Array<String>) {
    var a:Int = 48

    if (a > 90){
        println("你是个优秀的学生")
    }else if(a>80&&a<90){
        println("你是个良好的学生")
    }else if(a>60&&a<80){
        println("你是个及格的学生")
    }else{
        println("你是个差生")
    }
}

打印结果:

你是个差生

条件控制流程的语法基本就是如下图2.5.1

(图2.5.1)

2.5.3:if 表达式的结果赋值给一个变量

If表达式把结果赋值到一个变量,这在Kotlin语法中是特有的一种表现形式,类似于Java语法中三元运算符。

代码演示:

fun main(args: Array<String>) {
    var bool=true

    var ifNum=if (bool)
        88
    else
        66

    println(ifNum)
}

打印结果:

88

看到上面的代码,如果您是刚入门的小白,是不是有一点发懵,这是什么操作,怎么大括号都没了,而且声明的变量也没指定类型啊;不要着急,我一点点的来为您讲解,关于var bool = true 这样的定义是没有错的,这个在上面的章节中也有提到,在Kotlin语法中,如果不指定它的类型,那么它就会自己去寻找,然后为自己设定好对应的类型;至于if表达式没有大括号,这样写和java语句有点类似,java中也是可以这样操作的,有一点需要注意,这样写,if后面必须跟着else,否则会编译错误。

2.5.4:使用区间

使用 in 运算符来检测某个数字是否在指定区间内,区间格式为 x..y

代码演示:

fun main(args: Array<String>) {
    var a=6
    if (a in 1..8){
        println(a.toString()+"在这个区间")
    }else{
        println(a.toString()+"不在这个区间")
    }
}

打印结果:

6在这个区间

2.5.5:When 表达式

when 将它的参数和所有的分支条件顺序比较,直到某个分支满足条件,

when 既可以被当做表达式使用也可以被当做语句使用,如果它被当做表达式,符合条件的分支的值就是整个表达式的值,如果当做语句使用,则忽略个别分支的值。

when 类似其他语言的 switch 操作符(Kotlin没有switch这个操作符)。其最简单的形式如下:

fun main(args: Array<String>) {
    val a = 8
    when (a) {
        6 -> print("a == 6")
        66 -> print("a == 66")
        else -> { // 注意这个块
            print("a 不是 6 ,也不是 66")
        }
    }
}

打印结果:

a 不是 6 ,也不是 66

when 中,else switch default是一样的,如果其他分支都不满足条件将会求值 else 分支,如果很多分支需要用相同的方式处理,则可以把多个分支条件放在一起,用逗号分隔:

fun main(args: Array<String>) {
    val a = 8
    when (a) {
        6,66 -> print("a == 6 || a == 66")
        else -> { // 注意这个块
            print("a 不是 6 ,也不是 66")
        }
    }
}

我们也可以检测一个值在(in)或者不在(!in)一个区间或者集合中:

fun main(args: Array<String>) {
    val a = 8
    when (a) {
        in 1..6 -> print("在1..6区间")
        !in 10..20-> print("在10..20区间")
        else -> {
            print("哪个区间都不在")
        }
    }
}

打印结果:

10..20区间

when 也可以用来取代 if-else if链。 如果不提供参数,所有的分支条件都是简单的布尔表达式,而当一个分支的条件为真时则执行该分支。

代码演示:

fun main(args: Array<String>) {
    val a = 98
    when {
        a>90 -> print("优秀")
        a>80&&a<90 -> print("良好")
        a>60&&a<80 -> print("及格")
        else -> print("差生")
    }
}

打印结果:

优秀

 获取更多文章,请关注我的公众号:搜索HelloAbner或者扫描下面二维码


猜你喜欢

转载自blog.csdn.net/ming_147/article/details/80194640