我主要使用Int
,Double
和String
,Char
。最近,我对节省内存产生了兴趣,我意识到即使是很小的字节数也会大得多,这会影响程序,甚至影响移动速度和电池寿命。(尤其是内存中的数据资源)
所以,当数据不需要存储大的数字时,我尝试使用Byte
,Short
。例如,字节表示-128~127
,缩写为-32768~32767
。
这是个好主意吗?
我的主要问题是我想知道Kotlin中const val的数据类型,因为它会自动定义数据类型。
const val THIS_IS_STRING = "HelloWorld"
const val THIS_IS_CHAR = 'C'
const val NUMBER_1 = -124
const val NUMBER_2 = 31000
const val NUMBER_3 = 1000000
const val NUMBER_4 = 1232188777777344444
const val NUMBER_5 = 29128812312732881231273712
const val NUMBER_6 = 0.423
const val NUMBER_7 = 0.2121222222441
const val NUMBER_8 = 0.813881281237123991827312324
const val NUMBER_9 = 0.5123090982307037412398190092340239423094803820432423423209823092342342348209384023984023480923840923840009930923094029848901
它们的数据类型是什么(数字)?
或者我应该这样定义以节省资源?还是我不需要?
const val MIN:Byte = -124
const val MID:Short = 31000
const val MAX:Int = 1000000
...
``
Kotlin类型推断 - 在Kotlin中,大多数情况下,只要编译器能够推断,就不需要指定正在使用的对象的类型。
所以,我们只需要根据我们想要生成的变量类型来编写var或val,并且通常可以推断出类型。我们也可以显式地指定类型。例如,您定义了val REQUEST_code=100
。在幕后,REQUEST\u code
用Int
数据类型初始化,因为REQUEST\u code
的值是Int
类型,编译器推断REQUEST\u code
也是Int
类型。请注意,Kotlin是一种静态类型的语言。这意味着类型是在编译时解析的,永远不会更改。
尽管Kotlin使用类型推断(自动识别某些内容),这意味着我们在初始化变量时也可以选择指定数据类型,如下所示:
val REQUEST_CODE: Int = 100
两者在将其转换为字节码时的行为相同。
见鬼,如果我们使用隐式声明,Kotlin如何确定数字的数据类型?
好问题,Kotlin提供了一组表示数字的内置类型。对于整数,有四种不同大小的类型,因此有不同的值范围。
所有初始化为整数值不超过Int最大值的变量都具有推断的类型Int
。如果初始值超过此值,则该类型为Long
。要显式指定Long
值,请将后缀L
附加到该值。因此,每当您严格希望节省内存时,建议对数据类型(如Byte
)使用显式类型声明
val one = 1 // Int
val threeBillion = 3000000000 // Long
val oneLong = 1L // Long
val oneByte: Byte = 1
参考
类型推断描述在https://kotlinlang.org/docs/reference/basic-types.html
基本上,当没有为范围为-231到231-1的数字指定时,默认类型是Int
,高于此值的是Long
。要显式指定Long
值,请将后缀L
附加到该值。因此,每当您严格希望节省内存时,建议为Byte
和Long
使用显式类型声明。
val one = 1 // inferred as Int
val threeBillion = 3000000000 // inferred as Long
val oneL = 1L // explicitly specify Long type by appending with L
val oneLong: Long = 1L // explicitly specify Long by type
val oneByte: Byte = 1 // explicitly specify Byte for saving memory
对于浮点数,默认类型为Double
,您可以通过指定类型或追加f
来切换到浮点。
val pi = 3.14 // Double
val piFloat: Float = 3.14 // explicitly specify Float by type
val e = 2.7182818284 // Double
val eFloat = 2.7182818284f // explicitly specify Float by appending with f
字符和字符串本质上只有一种数据类型,因此默认情况下是Char
和String
,无需显式更改。
通常建议指定类型以节省内存,因为它是恒定的,永远不会改变,所以保存是一个更好的选择,但这一切都取决于您。
这取决于您是想向kotlin还是self提供数据类型分配。如果通过提供资源类型保存值。您可以保存数据,也可以依赖kotlin。
但是如果你保存数据,我会建议你提供数据类型:
让我们举个例子:
fun main() {
var b: Any = 124
println(b)
if(b is Float) {
println("Float")
}
else if(b is Double) {
println("Double")
}else if(b is Byte){
println("byte")
}else if(b is Int){
println("int")
}else if(b is Short){
println("short")
}
}
它将以Int
的形式提供输出。
所以我建议提供数据类型。
它与扩展函数有什么关系?为什么带有的是函数,而不是关键字? 这个主题似乎没有明确的留档,只有关于扩展的知识假设。
我在我的一个项目中使用RxJava,我使用Android Studio插件将我的一个类转换为静态编程语言,并在maplambda(java中的Func1)之一中,中间体返回如下所示。 我不知道这意味着什么。
我正在学习静态编程语言,我在函数方面有一些问题。我试图创建一个带有通用参数的函数接口。Java我会创建这样的东西: 然后我可以在其他地方像这样使用它(给定扩展: 你是怎么和Kotlin写这篇文章的? 我尝试的第一件事是使用如下类型别名: 但是,当我将绑定添加到type参数时,它停止了工作: 第二种方法是编写一个扩展函数类型的接口: 然而,现在我不知道如何用这个来实例化lambda函数。当我从中创建
为了描述Gradle构建脚本,我们可以通过< code>build.gradle.kts文件使用Kotlin。在< code>dependencies和build 部分全局定义要使用的Kotlin版本是一个常见的问题(在给定的情况下使用不同的版本是相当罕见的)。 请考虑以下代码 (Gradle 4.3.1): 如您所见,kotlin(在本例中为1.2.30)定义了两次:和,它们通常没有区别。由于D
这里已经阐明了和之间的区别。 但我的问题是,为什么我们要使用关键字?从生成的Java代码角度来看没有区别。 静态编程语言代码: 生成:
有了这个数据模型... TestClass.kt 我的目标是反序列化以下json值: 我在这里看到了解决方案并尝试了这个,但是我的“反序列化”方法中的断点似乎永远不会命中。 选项Deserializer.java TestDeserialization.kt 建筑gradle(用于版本信息)