Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin:字符的哈希代码与ASCII值相同_Kotlin_Hash_Char_Standard Library - Fatal编程技术网

Kotlin:字符的哈希代码与ASCII值相同

Kotlin:字符的哈希代码与ASCII值相同,kotlin,hash,char,standard-library,Kotlin,Hash,Char,Standard Library,我注意到Char值的hashcode正是它们在ASCII中的ID,例如: println('a'.hashCode()) //is 97 根据合同,这是真的吗?我在哪里可以看到它的实施?类Any.kt不包含实现,Char.kt也不包含 我注意到Char值的hashcode正是它们在ASCII[…]中的ID 这是不可能的。ASCII只有128个值,但KotlinChar有65536个值,因此很明显,Char不能将其ASCII值作为哈希码,因为其中99.8%没有ASCII值 合同上是这样吗 不,不

我注意到Char值的hashcode正是它们在ASCII中的ID,例如:

println('a'.hashCode()) //is 97
根据合同,这是真的吗?我在哪里可以看到它的实施?类Any.kt不包含实现,Char.kt也不包含

我注意到Char值的hashcode正是它们在ASCII[…]中的ID

这是不可能的。ASCII只有128个值,但Kotlin
Char
有65536个值,因此很明显,
Char
不能将其ASCII值作为哈希码,因为其中99.8%没有ASCII值

合同上是这样吗

不,不是。该合同为:

fun hashCode():Int
返回对象的哈希代码值。
hashCode
的总合同为:

  • 只要在同一对象上多次调用它,
    hashCode
    方法必须始终返回相同的整数,前提是不修改对象上的
    equals
    比较中使用的信息
  • 如果根据
    equals()
    方法,两个对象相等,则对两个对象中的每个对象调用
    hashCode
    方法必须产生相同的整数结果
这就是全部合同。与ASCII之间没有任何关系

我在哪里可以看到这个的实现?类Any.kt不包含实现,Char.kt也不包含

我假设像或这样的类型实际上不是作为Kotlin对象实现的,而是出于性能原因作为编译器内部函数实现的。例如,我希望
42
在JVM平台上是一个JVM
int
,在ECMAScript平台上是一个ECMAScript
number
,而不是作为一个具有对象头、实例变量表、类指针等的完整对象实现

碰巧的是,Kotlin的
hashCode()
合同也与几乎所有其他语言的合同相匹配,因此我希望他们尽可能重复使用底层平台的实现。(事实上,我怀疑这正是以这种方式设计合同的原因。)


即使对于Kotlin/Native,将
Kotlin.Int
映射到本机整数
Int\u fast32\u t
int32\u t
类型也是有意义的。

在JVM上,
Char
Int
(以及
Boolean
Byte
Short
Long
Float
,和
Double
)在可能的情况下进行编译,但并不总是可能的,例如,在需要为空、在集合中用作泛型类型或用于与Java对象的互操作性的情况下。在这些情况下,值被“装箱”到包装器对象中;请看…(续)很可能是Sun故意选择了那些包装器的哈希代码来匹配原始值,以通过自动装箱减少其中一个gotchas。(虽然还有好几个。)但如果合同中没有,你就不应该依赖它。