Java程序员应该了解的常见未定义行为是什么 [封闭]

2022-09-02 03:18:45

此问题相同,但适用于java

更新根据少数人的评论和回应,很明显Java几乎没有未定义的行为。

所以我想问一下,哪些行为是不明显的。请在回答时区分两个:)


答案 1

与线程有关的任何内容...:)

也:

  • 重写方法并期望它们在版本之间以相同的方式使用
  • 关于底层平台的假设(例如,文件分隔符)
  • 垃圾回收/最终确定的详细信息
  • 有关类初始化的一些详细信息
  • Integer.valueOf(等)是否返回相同的对象
  • 性能、延迟和内存使用情况

答案 2

Java中非常非常少的未定义行为,与C / C++相比,它是一个定义得更明确的平台。这样做的原因是,C/C++编译器旨在为非常不同的平台生成代码,因此被授予相当广泛的自由,以防止过于严格的要求迫使编译器为给定平台生成次优代码。

Java牺牲了其中的一些,以非常精确的方式定义了几乎所有的行为,并且只允许很小的自由度。这当然使平台更容易处理。

发生未定义行为的主要领域是多个线程的确切时间和调度(正如Tom Hawtin已经提到的)。

有几个地方的行为并不明显,“虽然,所以它可能看起来没有定义,但不是(奥斯卡·雷耶斯给出的字符串比较例子就是一个很好的例子)。

还有一些地方的行为被定义为未定义(例如,HashMap中的元素顺序被定义为依赖于实现的,不需要是恒定的)。