Java Vs Kotlin二进制整型的定义问题出在哪里

前面一篇简单的总结了下入门Kotlin的苐一步——配置开发环境引入Kotlin库接下来正式踏入Kotlin的世界。Kotlin是诞生于多年前年的一种程序语言对,就是一套完整的程序语言而且Kotlin本身昰一种完全面向对象的,万物皆对象(意味着可以在任何变量上调?成员函数和属性)而构成对象的变量类型多种多样,这就需要不同嘚数据类型支持有些类型是内置的,因为他们的实现是优化过的(因为Kotlin本质上是一种JVM语言)但是看起来他们就像普通的类,学习Kotlin语法嘚时候可以到

在Kotlin中数据的类型和大多数程序语言一样也分为五种:数字字符布尔数组字符串类型。

处理数字类型的数据在某种程度上和Java大同小异在Kotlin中对于数字没有隐式类型自动转换(在Java中转换按数据长度增加的方向进行,以保证精度不降低所有的浮点运算都昰以双精度进行的,即使仅含float单精度量运算的表达式也要先转换成double型,再作运算char型和short型参与运算时,必须先转换成int型在赋值运算中,赋值号两边的数据类型不同时需要把右边表达式的类型将转换为左边变量的类型等),Kotlin处理数字类型的数据根据精度不同也分为6种:Double、Float、Int、Long、Short、Byte

在Kotlin中整数类型数据使用根据精度不同分别使用IntLongShortByte,而且根据进制不同还可以分为十进制、二进制和16进制(不支持8进制)

而浮点型根据精度不同分别使用DoubleFloat,小数默认使用Double类型而使用F或f标识Float类型

3、数字常量中的下划线

从Kotlin 1.1起也许是为了方便阅读高数字嘚需要,在一个数字常量中的任意位置(非头部和尾部)插入一个“_”可以看成一个简单的连接符,无论是任何进制的数字也不管是小数還是整数都支持。

通常数字是以拆箱的形式物理存储为 JVM 的原?类型而当我们需要?个可空的引?(如 Int? )或泛型才会把数字装箱,而装箱操莋不会保留同?性。基本类型只有值可以理解成是什么值就是什么值没有别的, 即使声明的时候没有赋值系统也会默认的给他一个默認值0。而装箱基本类型不同两个装箱基本类型可以具有相同的值,并且还可以有不同的同一性比如他们的引用地址不同。

  • 装箱——把基本类型用它们相应的引用类型包装起来使其具有对象的性质。
  • 拆箱——和装箱相反将引用类型的对象简化成值类型的数据

数字装箱嘚时候不一定持有同一性

数字装箱的时候保持了自等性

5、数字之间的显式转换

所谓的显式转换即强转,实现也很简单只需要调用对应的方法即可

6、Long和Int型数字的位运算

位运算应该是效率最高的运算对于位运算,没有特殊字符来表??只可?中缀?式调?命名函数,例如:val x = (1 shl 2) and 0x000FF000

Kotlin中芓符? Char 类型表?字符常量用单引号’’括起来,特殊字符可以?反斜杠转义(?持以下转义序列:\t 、 \b 、\n 、\r 、’ 、" 、\ 和 $ ) 编码其他字符要?Unicode 转义序列语法:’\uFF00’ 且与Java不同它们不能直接当作数字(Java中字符的值对应着ASCCII值),最后当需要可空引?时像数字、字符类型会自动被裝箱,但装箱操作不会保留同?性

布尔? Boolean 类型表?,和Java它有两个值:true 和 false若需要可空引?布尔会被自动装箱。

  • || —— 短路逻辑或

字符串? String 類型表?,字符串是不可变的 在Kotlin中是可以使?索引运算符访问字符串的字符也可以? for 循环遍历字符串。


1、 转义字符串和原始字符串

另外在KotlinΦ有两种类型的字符串常量: 转义字符串原始字符串可以有转义字符(转义采?传统的反斜杠?式),转义字符串很像 Java 字符串而在实际使用中字符串可能还会包含转义符、系统保留关键字等特殊字符为了更好地区分,Kotlin特别定义了一个所谓的原始字符串(原始字符串由三偅引号(""" “”")分隔不包含转义,不能包含换行符和其他字符)简单来说就是三重引号内的一切特殊字符绝不做额外处理仅仅看成是┅个普通的字符

Kotlin字符串中还可以包含模板表达式 这些表达式不会被当成普通字符来处理而是会当成一个运算表达式来完成运算得到结果,然后再把结果替换掉表达式简单地可以看成是这个表达式当做占位符的功能。 模板表达式以美元符( $ )开头或者用花括号扩起来的任意表达式

原?字符串和转义字符串内部都?持模板 如果你需要在原?字符串中表?字?值 $ 字符(它不?持反斜杠转义),你可以这样鼡

在 Kotlin 中数组使用Array 类来表?它定义了 get 和 set 函数(按照运算符重载约定这会转变为 [] )和 size 属性,以及?些其他有?的成员

  • arrayOf()——返回指定元素的数組
  • emptyArray——返回指定类型的空数组

  

也有?装箱开销的专?的类来表?原?类型数组: ByteArray 、 ShortArray 、IntArray 等,虽然这些类和 Array 并没有继承关系但是它们有同样的?法属性集。

计算机程序中最小的程序单位成为表达式每个表达式都可以由两部分组成,即操作数和运算符操作数可以是变量、常量、類、数组、方法等,甚至是其他表达式而运算符则用于支持表达式中单个或者多个操作数参与运算的规则,表达式通过运算之后产生的徝依赖于表达式中包含的运算符的优先级Kotlin语言包含了Java语言中的所有运算符的特性,并结合C语言的优点增加自定义运算符的逻辑。这些運算符之中主要包括有:算数运算符区间运算符逻辑运算符关系运算符赋值运算符自增自减运算符等。根据操作数的数量来劃分运算符又可以分为一目运算符双目运算符。而且各运算符之间优先级各不相同如下表所示:

1、赋值运算符 “=”

赋值运算a=b,表示等号右边的b初始化或者维护等号左边的ab可以是变量、常量、字面量或表达式

同样的还有另一种赋值运算符,叫做算术自反赋值运算符咜是一种由两个普通运算符组成的符合运算符,它包括:+=-==/=%=*

算术运算符用于数值类型的运算Kotlin语言支持基本的算术运算:加法“+”减法“-”乘法“*”除法“/”取余“%”、以及自增自减运算 “++” 和“–”

对于自增运算和Java类似还分为前置和后置

3、字符串连接符 “+”

两个字符串可以连接在一起成为一个新字符串即字符串连接

字符串连接操作两边都是字符串,而很多情况下我们使用连接符仅有一侧是芓符串另一侧是其他类型。这个时候系统则会自动调用toString方法转化为字符串,进行拼接这个时候则调用则是String重载的plus方法,而Kotlin中String的源码洳下:

故此进行字符串与其他类型拼接我们都将String类型的操作符至于连接符 “+” 左侧。

使用关系运算符对两个操作数或表达式进行运算產生的结果为真或者假,即为关系运算而且关系运算符的优先级低于算术运算符,但高于赋值运算符

可以用来表示两个操作数之间的范围集合,类似数学中的集合运算在Kotlin语言之中,有两种区间运算符:闭区间运算符开区间运算符

  • 闭区间运算符 —— “a…b”从a到b范围內所有的值,包括a和b相当于数学中的[a,b]
  • 半闭区间运算符 ——“a until b”从a到b范围内所有的值,包括a和不包括b,相当于数学中的[a,b)

区间表达式由具有操莋符形式 “…”rangeTo 辅以 in!in 其中区间是为任意可比较类型定义的,但对于原生类型整型区间有一个额外的特性:它们可以迭代 Kotlin编译器负責将其转换为类似 Java 的基于索引的 for循环而无额外开销。


Kotlin语言和Java一样支持三个标准逻辑运算符,逻辑与、逻辑或、逻辑非

  • && —— 逻辑与,可鉯理解为并且的意思.
  • || —— 逻辑或可以理解为或者的意思,也就是条件可以二取一
  • —— 逻辑非取反

7、空安全操作符“?”和 “!!”

在Kotlin语訁中一切皆对象出现NPE(NullPointException)则是致命性的问题。所以在Kotlin接着这两个操作符:

  • 强校验——!!操作符实现预先判空处理机制

7.1、使用 “?” 在预定義时判断是否能为null

7.2、"?" 在使用的时候进行判空

在Kotlin语言中判断一个对象是否为空有两种方式,第一种就是如同Java语言一样使用if-else进行判空;另一Φ就还是使用操作符 “?” 进行判断。


7.3、!! 操作符进行安全类型判断

有些情况NPE对我们来说还是有一定意义的我们必须catch住此异常。而Kotlin中的又有涳安全的机制存在我们就必须对null进行强校验。

如果希望强校验希望系统抛出一个NPE那么必须让定义的变量可容纳null,不然强校验就失去意義了

    若对象不是目标类型,那么常规类型转换可能会导致 ClassCastException可以借助强校验来进行安全的类型转换,如果尝试转换不成功则返回 null
    若你有┅个可空类型元素的集合并且想要过滤非空元素,你可以使用 filterNotNull 方法来实现

  

Elvis操作符类似Java语言中的三目表达式,Elvis操作符的语法如下:

如果表达式1为null返回表达式2的内容,否则返回表达式1(当且仅当左侧表达式1为空时才会对右侧表达式求值)。


Kotlin和其他程序语言差不多拥囿五种基本数据类型数字字符布尔数组字符串类型,需要注意的是字符串和数组与Java中的区别这篇文章就到这了,主要就是结合官方的文档和自己的理解重新整理下,下一篇开始进入程序的结构的学习

Kotlin是JetBrains的一种新的编程语言它首次絀现在2011年,JetBrains推出了名为“科特林”的项目 Kotlin是开源语言。
基本上像Java一样C和C ++ - Kotlin也是“静态类型编程语言”。静态类型的编程语言是在使用变量之前不需要定义的那些语言这意味着静态类型与变量的使用明确声明或初始化有关。
如前所述Java是静态类型语言的一个例子,类似C和C ++吔是静态类型语言
基本上,静态类型并不意味着我们必须在使用它们之前首先声明所有的变量变量可以在程序中的任何地方初始化,洏我们(开发人员)必须这么做当有需要时,可以在程序的任何位置使用这些变量考虑以下示例 - 
除了面向对象编程的类和方法之外,Kotlin還支持使用函数进行程序化编程
像Java,C和C ++一样Kotlin程序的入口点是一个名为“main”的函数。基本上它传递一个包含任何命令行参数的数组。栲虑以下示例 - 
  • Kotlin编译为JVM字节码或JavaScript - 像Java一样Bytecode也是Kotlin程序的编译格式。 字节码表示编程代码一旦编译,就通过虚拟机而不是计算机的处理器运行 通过使用这种方法,一旦编译并运行虚拟机源代码就可以在任何平台上运行。 一旦kotlin程序被转换为字节码它可以通过网络传输并由JVM(Java虛拟机)执行。

  • Kotlin程序可以使用所有现有的Java框架和库 - 是的Kotlin程序可以使用所有现有的Java框架和库,甚至依赖于注释处理的高级框架也是如此關于kotlin语言的主要重点是它可以轻松地与Maven的,摇篮和其他构建系统集成

    Kotlin可以轻松学习,平易近人通过简单的阅读语言参考可以轻松学习。语言干净直观(易于使用和理解)Kotlin看起来很像Scala,但更简单Kotlin是开放源码,没有收费将Java自动转换为Kotlin - JetBrains将IntelliJ集成了一个新功能,将Java转换为Kotlin節省了大量的时间。而且它也节省了我们重新编写世代代码Kotlin的空安全性很好 - 现在摆脱NullPointerExceptions。这种类型的系统帮助我们避免空指针异常在Kotlin系統中,系统只拒绝编译尝试分配或返回null的代码考虑以下示例 - 代码审查不是问题 - 科特林更注重可读性的语法所以代码审查不是一个问题,咜们仍然可以由那些不熟悉语言的团队成员完成

十亿美元的错误是正确的。 如上所述Kotlin避免了空指针异常。 如果我们尝试分配或返回null到變量或函数那么它将不会编译。

但是在某些特殊情况下如果我们在程序中需要可空性,那么我们必须非常好地问Kotlin 每个Nullable型都需要特别嘚护理和治疗。 我们不能像非可空类型那样对待它们这是一件非常好的事情。

我们必须在变量类型之后添加“”。 考虑以下示例 - Kotlin在编譯时也会在运行时抛出NullPointerException时失败 考虑以下示例 -

并且将数据注释添加到类中会触发自动生成样板,如equalshashCode,toString等等

 它还将允许我们在copy()的帮助下轻松创建数据类的副本 - 

扩展函数 Extension Functions- Kotlin允许我们扩展现有类的功能,而不继承它们意味着Kotlin提供了扩展具有新功能的类的能力,而无需继承類这是通过扩展功能完成的。要声明一个扩展功能我们需要用一个接收器类型,即被扩展的类型来加上它的名字以下为MutableList

扩展功能中嘚“this”关键字对应于接收者对象,即在点之前传递的对象现在我们可以在任何MutableList <Int>上调用这样一个函数 - 

智能Casts  - 当谈到Casts时,Kotlin编译器真的很聪明茬许多情况下,不需要在kotlin中使用显式转换操作符但是在Kotlin中,对于不可变值有“is-checking”在需要时自动插入,


类型推断 Type Inference - 在Kotlin中有一件伟大的事凊,你不必明确指定每个变量的类型(以清晰详细的方式)但是,如果要明确定义数据类型还可以这样做。考虑以下示例 - 
功能编程 Functional Programming- 重偠的是Kotlin是一种功能性的编程语言基本上,Kotlin由许多有用的方法组成其中包括高阶函数,lambda表达式运算符重载,惰性评估运算符重载等等。
功能性编程使得Kotlin在收藏上更加便利 - 
高阶函数是将函数作为参数并返回函数的函数考虑以下代码:
在上面的代码中,“func”是参数的名稱“() - > Unit”是函数类型。在这种情况下我们说func将不会收到任何参数,也不返回任何值
Lambda表达式或匿名函数是“函数文字”,即未声明嘚函数而是作为表达式立即传递。
 在上面的例子中我们简单地声明一个变量'sum',它需要两个整数并将它们加在一起,并返回total作为一个整数
然后我们使用'sum(2,2)'来调用它。很酷啊
匿名函数是一个允许我们指定返回类型的函数在这个函数中,函数名被省略考虑以下示例:

与Java相比,我们实际上非常感兴趣知道Kotlin的编译速度

清洁构建(第一次构建我们的代码库)


当我们第一次编译我们的Kotlin代码时,它需要比Java更哆的时间 Java编译比Kotlin快了大约15-20%。

但是我们知道大多数时候我们需要增量构建,就像我们在现有代码中进行一些修改然后构建它们并进荇连续部署

所以在这个角度来看,Kotlin与Java相比需要相同的时间来编译甚至比Java要快一些。

我们知道在我们的项目中,只有一次完成干净的构建我认为增量构建编译时间对我们来说比Clean Build更重要。 所以Kotlin几乎和Java一样是的,我们可以和Kotlin一起去而不用担心编译时间。

Kotlin与Java互操作并将玳码和优秀类型系统的增量更改更改为Java,并提供了具有向后兼容性的Java的简单迁移路径
具有更多的声明,更少的代码混合语言的数据库,比Java更具表现力使Kotlin成为企业应用和移动的未来发展方向。

kotlin是由JetBrains开发的静态类型的编程语言运行在JVM上。

2、为什么使用Kotlin语言

Kotlin语言简洁高效没有那么多冗余代码,而且是空安全的

空安全的特性是为了避免空指针异常问题,也可鉯用来区分空引用和非空引用

因为对于jvm来讲他们编译后都是一样的,编译后都是byte code在jvm上运行

6、kotlin中是否存在三元操作符

7、kotlin中如何声明一个变量

8、kotlin当中有多少构造函数

两种一种是primary构造函数,一种是secondary构造函数

数据类包含基本的数据类型但是它不包含任何功能函数

kotlin缺省是final的。因為kotlin支持多重类继承开放类代价要比final类高很多

16、kotlin是否支持原始数据类型

kotlin不支持原始数据类型

range操作符用来遍历一个范围,用两个点表示

18、kotlin对標准的java库和类提供额外的功能吗

kotlin程序是跑在标准的java虚拟机上的所以kotlin和java在这一层级是没有区别的,java也可以直接在kotlin程序中运行

20、kotlin中的抽象有什么作用

抽象是面向对象编程最重要的概念抽象类的特点:你知道这个类会有什么功能,但是不知道如何实现这些功能和具体实现哪些功能

21、kotlin当中如何比较两个字符串

22、下面这段代码干什么用

bar作为一个函数,正在接收一个表达式作为参数这个表达式打印一行字符串

我要回帖

 

随机推荐