jdk 1.8 字符串+_JDK 9/10/11:Java字符串上+ =的副作用
jdk 1.8 字符串+
問題“ 為什么`array [i ++%n] + = i +”在Java 8和Java 10中給出不同的結果? ”已于本周初發布在StackOverflow.com上 。 它指出JDK9和更高版本中存在的Java編譯器中的錯誤 ,但JDK8中不存在。
如StackOverflow線程上所述, Didier L提供了一個簡單的Java代碼示例來重現此問題。 這將在下面顯示的代碼清單中進行調整。
package dustin.examples.strings;import static java.lang.System.out;/*** Example demonstrating JDK-8204322 and adapted from Didier L's* original example (https://stackoverflow.com/q/50683786).*/ public class StringConcatenationBug {static void didierLDemonstration(){final String[] array = {""};array[generateArrayIndex()] += "a";}static int generateArrayIndex(){out.println("Array Index Evaluated");return 0;}public static void main(final String[] arguments){didierLDemonstration();} }閱讀上面顯示的代碼,如果執行了該類的main(String[])函數,則希望看到字符串“ Array Index Evaluated”顯示一次。 對于JDK8,情況就是這樣,但是自JDK 9起,情況并非如此。 下一個屏幕快照對此進行了演示。 屏幕快照中顯示的示例顯示,當使用javac的-source和-target標志設置為“ 8 ”編譯該類時,在執行該編譯的類時,該字符串僅顯示一次。 但是,當javac的-source和-target標志設置為“ 9 ”時,在執行編譯的類時,該字符串顯示兩次。
此錯誤存在于JDK9,JDK10和JDK11中。 OlivierGrégoire描述了此錯誤,“問題似乎僅限于字符串串聯和賦值運算符( += ),且表達式的副作用為左操作數。”
JDK-8204322 [已為該錯誤編寫了“已應用到字符串操作數的'+ ='可能引起副作用”],現已解決,其解決方案目前針對JDK11 。 錯誤報告描述了該問題,“使用+ =運算符時,似乎javac在+ =之前重復了代碼。” 它還說明了類似array[i++%n] += i + " ";編寫的代碼array[i++%n] += i + " "; 有效地編譯為類似于array[i++%n] = array[i++%n] + i + " "; 。 揚·拉霍達(Jan Lahoda) 對錯誤的評論描述了它發生的原因。 Aleksey Shipilev已要求將此修復程序反向移植到JDK 10,看來它將通過JDK-8204340進行 。
有關此錯誤的其他背景信息,可以在前面提到的StackOverflow線程 , 相關的StackOverflow聊天以及OpenJDK 編譯器-dev郵件列表線程中找到“ 有關字符串連接的編譯器錯誤 ”和“已應用RFR:8204322:'+ ='字符串操作數會引起 “ 副作用 ”。
翻譯自: https://www.javacodegeeks.com/2018/06/jdk9-side-effects-java-string.html
jdk 1.8 字符串+
總結
以上是生活随笔為你收集整理的jdk 1.8 字符串+_JDK 9/10/11:Java字符串上+ =的副作用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java全局变量和局部变量_Java 1
- 下一篇: 电脑内存条辨认方法(电脑内存条怎么看?)