专栏首页RunhwGuo的Coding之路kotlin源码阅读——字符串
原创

kotlin源码阅读——字符串

filename:String.kt/StringsJVM.kt/Arrays.kt/CharSequence.kt

讲完基础数据类型之后,这一篇就看一下String字符串,其实字符串也是每个言语里最基本的数据类型,但是为什么没有把字符串放到基础数据类型呢,是因为字符串是比基础类型更复杂,有更多的内容,所以单独一篇来说一下字符串类型。

先上一张String.kt的图。

String.kt源码

刚看到String.kt源码的时候,不知道小伙伴是否和我一样,String是有很多操作方法的,光构造函数就不止这5个方法,但是Kotlin把为什么没有“定义”那些方法呢,比如replace/indexOf等等,是不是有点奇怪?

抱着这个问题,我动手写了一些demo。

Demo

如图,在String.kt没有定义的方法,byteInputStream和replace是怎么被调用的呢?

可以点击查看replace源码实现:

StringJVM.kt

我们可以看到跳转到了StringsJVM.kt了,在这个文件里,通过Kotlin的语法糖——方法扩展,定义了replace,且用actual,指定Kotlin的String.replace是Java的String.replace的别名函数。再看一个更直观的例子。

这里的意思,就是说Kotlin的String.nativeIndexOf是直接调用Java的String.indexOf(Kotlin与Java 100%兼容)。

如果把StringsJVM.kt这个文件,浏览一遍,我们会发现Kotlin的String里的方法,大部分都是直接调用Java的String里的方法,从这里看到Kotlin复用了很多Java的api。

说到这里,大家应该明白了,Kotlin的String方法是通过方法扩展的方式,散落在不同的kt文件里,且大部分是复用Java逻辑的。

我们接着看和String相关的其他源码文件。

CharSequence.kt文件

CharSequence类是String的接口类,在kotlin包中。

从源码看,这个接口简单定义了可读String的基本行为,length/get/subSequence。

同样,我们知道JVM上CharSequence的行为,也不止这三个,我这里找到其他的扩展函数,看官可以自行阅读。

再看一下Arrays.kt

这个Kotlin文件,定义封装了JVM中byte[],char[],int[]等“低级”行为,其中CharArray就是代表了JVM中char[]。源码如下,很简单,我就不做过多解读。

Kotlin与Java一样,同为JVM上的语言,讲完String,这个不可变的字符串,还需要再介绍些StringBuiler可变的字符串。

上源码截图:

看到这张截图,是不是更简单粗暴了?直接整个类都是java.lang.StringBuilder的别名,Kotlin真是太机智了。详情请参照java.lang.StringBuilder。

至此Kotlin的字符串源码分析,就完结了,如有哪里有纰漏的,欢迎评论,一起学习。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Kotlin源码阅读——system模块

    在kotlin的源码目录里,每个模块都有相应的md文件,做以说明。在kotlin最主要的stdlin/src目录下有一个Module.md:

    Runhwguo
  • Node.js源码学习——搭建阅读调试代码环境

    声明下笔者的环境,Mac(10.14.6) CLion WebStorm(其他平台Node.js文档里也有介绍)

    Runhwguo
  • Android Studio环境查看hide和internal api

    在Android开发环境中,我们经常会看一些Android Framework源码,比如说我们想看一下Toast的实现原理。

    Runhwguo
  • java基础06

    待你如初见
  • 阅读Spring源码:IOC控制反转前的处理

    从ClassPathXmlApplicationContext入口,最终都会调用到

    beifengtz
  • Python爬虫入门教程 44-100 Charles的安装与使用-手机APP爬虫部分

    Charles和Fiddler一样,也是一款抓包工具,比Fiddler界面更加清晰,支持多平台

    梦想橡皮擦
  • MockMvc -你需要一个测试基类

    用例虽然能执行成功,但是还存在着不少问题。最为严重的,就是代码冗余度太高。两次模拟的HTTP请求,虽然请求的方式和发送内容不同,但是整个请求的组装、发送和结果验...

    Criss@陈磊
  • Java设计模式之适配器模式

    今天讲适配器模式,这个模式也很简单,你笔记本上的那个拖在外面的黑盒子就是个适配器,一般你在中国能用,在日本也能用,虽然两个国家的的电源电压不同,中国是220V,...

    CoderJed
  • ES中添加 IK 分词器

    https://github.com/medcl/elasticsearch-analysis-ik/releases

    用户5927264
  • 【小家Spring】Spring中@Value注解有多强大?从原理层面去剖析为何它有如此大的“能耐“

    @Value注解是Spring3.0后提出来的一个注解。注解内容本身非常之简单,但是它提供的功能却非常之强大。

    YourBatman

扫码关注云+社区

领取腾讯云代金券