Kotlin学习笔记--String比较和Map

最近在学习kotlin,遇到一些细节上的知识点,作为学习笔记整理一下
1、String的比较
先来看看Java(Android)的

         String s1=new String("aaa");
        String s2=new String("aaa");

        if(s1==s2){
            Log.e("chen","s1==s2");
        }else{
            Log.e("chen","s1!=s2");
        }

        if(s1.equals(s2)){
            Log.e("chen","s1.equals(s2)");
        }else{
            Log.e("chen","---s1.equals(s2)");
        }

        String s3="bbb";
        String s4="bbb";

        if(s3==s4){
            Log.e("chen","s3==s4");
        }else{
            Log.e("chen","s3!=s4");
        }

        if(s3.equals(s4)){
            Log.e("chen","s3.equals(s4)");
        }else{
            Log.e("chen","---s3.equals(s4)");
        }

对应日志是:

11-09 11:55:44.079 27781-27781/com.demo.androdidemo E/chen: s1!=s2
11-09 11:55:44.080 27781-27781/com.demo.androdidemo E/chen: s1.equals(s2)
11-09 11:55:44.080 27781-27781/com.demo.androdidemo E/chen: s3==s4
11-09 11:55:44.080 27781-27781/com.demo.androdidemo E/chen: s3.equals(s4)

在Java中,String的 == 是对比数据的地址,equals是笔记的值。java中有个常量池,所有使用过的字符串都会被扔进去,当这个字符串再次被使用的时候就不会是new一个新的,而是取池里的。

现在,我们再看看kotlin的

        var s1="aaa"

        var s2="aaa"

        println(s1==s2)

        println("----")

        println(s1.equals(s2))

        println("----")

        println( TextUtils.equals(s1,s2))

对应日志是:

        11-09 09:47:21.337 31819-31819/com.kotlin.demo I/System.out: true
        11-09 09:47:21.337 31819-31819/com.kotlin.demo I/System.out: ----
        11-09 09:47:21.337 31819-31819/com.kotlin.demo I/System.out: true
        11-09 09:47:21.337 31819-31819/com.kotlin.demo I/System.out: ----
        11-09 09:47:21.337 31819-31819/com.kotlin.demo I/System.out: true

从日志可以看出来, == 和equals的结果是相等的
这里说一个equals的重载方法,可以忽略大小写
代码如下:

        var s1 = "ABC"

        var s2 = "abc"

        println(s1 == s2)

        println("----")

        //true,忽略大小写
        println(s1.equals(s2,true))

        println("----")

        //false,不忽略大小写
        println(s1.equals(s2,false))

对应日志:

        11-09 09:52:22.904 867-867/com.kotlin.demo I/System.out: false
        11-09 09:52:22.904 867-867/com.kotlin.demo I/System.out: ----
        11-09 09:52:22.912 867-867/com.kotlin.demo I/System.out: true
        11-09 09:52:22.912 867-867/com.kotlin.demo I/System.out: ----
        11-09 09:52:22.912 867-867/com.kotlin.demo I/System.out: false

2、map

        var map_1=TreeMap<Int,String>()

        map_1[1]="111"
        map_1[2]="222"

        Log.e("=map_1=","map_1.size is ${map_1.size}")

        Log.e("=chen=","map_1[1] is ${map_1[1]}")
        Log.e("=chen=","map_1[1] is ${map_1[2]}")


        var map_2=TreeMap<String,String>()

        map_2["1"]="111"
        map_2["2"]="222"

        Log.e("=map_2=","map_2.size is ${map_2.size}")

        Log.e("=chen=","""map_2[1] is ${map_2["1"]}""")
        Log.e("=chen=","""map_2[1] is ${map_2["2"]}""")

对应日志:

11-09 12:10:24.436 30130-30130/com.kotlin.demo E/=map_1=: map_1.size is 2
11-09 12:10:24.436 30130-30130/com.kotlin.demo E/=chen=: map_1[1] is 111
11-09 12:10:24.436 30130-30130/com.kotlin.demo E/=chen=: map_1[1] is 222

11-09 12:10:24.436 30130-30130/com.kotlin.demo E/=map_2=: map_2.size is 2
11-09 12:10:24.436 30130-30130/com.kotlin.demo E/=chen=: map_2[1] is 111
11-09 12:10:24.436 30130-30130/com.kotlin.demo E/=chen=: map_2[1] is 222

没问题。也容易理解。了解kotlin的,应该知道。它还有个Any类型。那么,再试试这个类型

       var map=TreeMap<Any,String>()

        map[1]="111"
        map[2]="222"

        Log.e("=map=","map.size is ${map.size}")

        Log.e("=chen=","map[1] is ${map[1]}")
        Log.e("=chen=","map[1] is ${map[2]}")
11-09 12:12:43.376 30921-30921/com.kotlin.demo E/=map=: map.size is 2
11-09 12:12:43.376 30921-30921/com.kotlin.demo E/=chen=: map[1] is 111
11-09 12:12:43.376 30921-30921/com.kotlin.demo E/=chen=: map[1] is 222

日志结果也对,但是,Any不是只能指向一种类型,而是可以指向任意类型的“任意类型”
改一下上面的代码:

        var map=TreeMap<Any,String>()

        map[1]="111"
        map["2"]="222"

        Log.e("=map=","map.size is ${map.size}")

        Log.e("=chen=","map[1] is ${map[1]}")
        Log.e("=chen=","""map[1] is ${map["2"]}""")

写完以后,没有提示任何错误。现在,直接运行
日志提示

Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

错误的行数指向

 map["2"]="222"

Int不能转换成String。请注意这个上面的一行是 map[1]。1是Int,“2”是String

结论:
1、在使用Any的时候,如果map的key都是同一种类型,是没问题的。但是,如果出现了多种类型。会把后面的作为标准去比对前面的。如果前面的不能转换,就报错。
如上:1 在 “2”前面。执行到“2”的时候,发现了新类型String,就去回头看前面的类型,发现上面的是Int类型的1,不能转换成String,就报错。
2、这个写法应该没人会这么写吧。无意中发现,总结一下!!!

猜你喜欢

转载自blog.csdn.net/u014620028/article/details/78488290