--- title: Javaåºç¡å¸¸è§é¢è¯é¢æ»ç»(ä¸) category: Java tag: - Javaåºç¡ head: - - meta - name: keywords content: JVM,JDK,JRE,åèç 详解,Java åºæ¬æ°æ®ç±»å,è£ ç®±åæç®± - - meta - name: description content: å ¨ç½è´¨éæé«çJavaåºç¡å¸¸è§ç¥è¯ç¹åé¢è¯é¢æ»ç»ï¼å¸æå¯¹ä½ æå¸®å©ï¼ --- ## åºç¡æ¦å¿µä¸å¸¸è¯ ### Java è¯è¨æåªäºç¹ç¹? 1. ç®åæå¦ï¼ 2. é¢å对象ï¼å°è£ ï¼ç»§æ¿ï¼å¤æï¼ï¼ 3. 平尿 å ³æ§ï¼ Java èææºå®ç°å¹³å°æ å ³æ§ï¼ï¼ 4. æ¯æå¤çº¿ç¨ï¼ C++ è¯è¨æ²¡æå ç½®çå¤çº¿ç¨æºå¶ï¼å æ¤å¿ é¡»è°ç¨æä½ç³»ç»çå¤çº¿ç¨åè½æ¥è¿è¡å¤çº¿ç¨ç¨åºè®¾è®¡ï¼è Java è¯è¨å´æä¾äºå¤çº¿ç¨æ¯æï¼ï¼ 5. å¯é æ§ï¼ 6. å®å ¨æ§ï¼ 7. æ¯æç½ç»ç¼ç¨å¹¶ä¸å¾æ¹ä¾¿ï¼ Java è¯è¨è¯çæ¬èº«å°±æ¯ä¸ºç®åç½ç»ç¼ç¨è®¾è®¡çï¼å æ¤ Java è¯è¨ä¸ä» æ¯æç½ç»ç¼ç¨èä¸å¾æ¹ä¾¿ï¼ï¼ 8. ç¼è¯ä¸è§£éå¹¶åï¼ > **ð ä¿®æ£ï¼åè§ï¼ [issue#544](https://github.com/Snailclimb/JavaGuide/issues/544)ï¼** ï¼C++11 å¼å§ï¼2011 å¹´çæ¶åï¼,C++å°±å¼å ¥äºå¤çº¿ç¨åºï¼å¨ windowsãlinuxãmacos é½å¯ä»¥ä½¿ç¨`std::thread`å`std::async`æ¥å建线ç¨ãåè龿¥ï¼http://www.cplusplus.com/reference/thread/thread/?kw=thread ð æå±ä¸ä¸ï¼ âWrite Once, Run Anywhereï¼ä¸æ¬¡ç¼åï¼éå¤è¿è¡ï¼âè¿å¥å®£ä¼ å£å·ï¼çå¿ç»å ¸ï¼æµä¼ äºå¥½å¤å¹´ï¼ä»¥è³äºï¼ç´å°ä»å¤©ï¼ä¾ç¶æå¾å¤äººè§å¾è·¨å¹³å°æ¯ Java è¯è¨æå¤§çä¼å¿ãå®é ä¸ï¼è·¨å¹³å°å·²ç»ä¸æ¯ Java æå¤§çåç¹äºï¼åç§ JDK æ°ç¹æ§ä¹ä¸æ¯ãç®åå¸é¢ä¸èæåææ¯å·²ç»é常æçï¼æ¯å¦ä½ éè¿ Docker å°±å¾å®¹æå®ç°è·¨å¹³å°äºãå¨æçæ¥ï¼Java 强大ççæææ¯ï¼ ### JVM vs JDK vs JRE #### JVM Java èææºï¼JVMï¼æ¯è¿è¡ Java åèç çèææºãJVM æé对ä¸åç³»ç»çç¹å®å®ç°ï¼Windowsï¼Linuxï¼macOSï¼ï¼ç®çæ¯ä½¿ç¨ç¸åçåèç ï¼å®ä»¬é½ä¼ç»åºç¸åçç»æãåèç åä¸åç³»ç»ç JVM å®ç°æ¯ Java è¯è¨â䏿¬¡ç¼è¯ï¼éå¤å¯ä»¥è¿è¡âçå ³é®æå¨ã **JVM 并䏿¯åªæä¸ç§ï¼åªè¦æ»¡è¶³ JVM è§èï¼æ¯ä¸ªå ¬å¸ãç»ç»æè 个人é½å¯ä»¥å¼åèªå·±çä¸å± JVMã** ä¹å°±æ¯è¯´æä»¬å¹³æ¶æ¥è§¦å°ç HotSpot VM ä» ä» æ¯æ¯ JVM è§èçä¸ç§å®ç°èå·²ã é¤äºæä»¬å¹³æ¶æå¸¸ç¨ç HotSpot VM å¤ï¼è¿æ J9 VMãZing VMãJRockit VM ç JVM ãç»´åºç¾ç§ä¸å°±æå¸¸è§ JVM ç对æ¯ï¼[Comparison of Java virtual machines](https://en.wikipedia.org/wiki/Comparison_of_Java_virtual_machines) ï¼æå ´è¶£çå¯ä»¥å»ççãå¹¶ä¸ï¼ä½ å¯ä»¥å¨ [Java SE Specifications](https://docs.oracle.com/javase/specs/index.html) 䏿¾å°åä¸ªçæ¬ç JDK 对åºç JVM è§èã  #### JDK å JRE JDK æ¯ Java Development Kit 缩åï¼å®æ¯åè½é½å ¨ç Java SDKã宿¥æ JRE ææ¥æçä¸åï¼è¿æç¼è¯å¨ï¼javacï¼åå·¥å ·ï¼å¦ javadoc å jdbï¼ãå®è½å¤å建åç¼è¯ç¨åºã JRE æ¯ Java è¿è¡æ¶ç¯å¢ã宿¯è¿è¡å·²ç¼è¯ Java ç¨åºæéçææå 容çéåï¼å æ¬ Java èææºï¼JVMï¼ï¼Java ç±»åºï¼java å½ä»¤åå ¶ä»çä¸äºåºç¡æä»¶ã使¯ï¼å®ä¸è½ç¨äºå建æ°ç¨åºã å¦æä½ åªæ¯ä¸ºäºè¿è¡ä¸ä¸ Java ç¨åºçè¯ï¼é£ä¹ä½ åªéè¦å®è£ JRE å°±å¯ä»¥äºãå¦æä½ éè¦è¿è¡ä¸äº Java ç¼ç¨æ¹é¢çå·¥ä½ï¼é£ä¹ä½ å°±éè¦å®è£ JDK äºã使¯ï¼è¿ä¸æ¯ç»å¯¹çãææ¶ï¼å³ä½¿æ¨ä¸æç®å¨è®¡ç®æºä¸è¿è¡ä»»ä½ Java å¼åï¼ä»ç¶éè¦å®è£ JDKãä¾å¦ï¼å¦æè¦ä½¿ç¨ JSP é¨ç½² Web åºç¨ç¨åºï¼é£ä¹ä»ææ¯ä¸è®²ï¼æ¨åªæ¯å¨åºç¨ç¨åºæå¡å¨ä¸è¿è¡ Java ç¨åºãé£ä½ 为ä»ä¹éè¦ JDK å¢ï¼å 为åºç¨ç¨åºæå¡å¨ä¼å° JSP 转æ¢ä¸º Java servletï¼å¹¶ä¸éè¦ä½¿ç¨ JDK æ¥ç¼è¯ servletã ### ä»ä¹æ¯åèç ?éç¨åèç ç好夿¯ä»ä¹? å¨ Java ä¸ï¼JVM å¯ä»¥çè§£ç代ç å°±å«ååèç ï¼å³æ©å±å为 `.class` çæä»¶ï¼ï¼å®ä¸é¢åä»»ä½ç¹å®çå¤çå¨ï¼åªé¢åèææºãJava è¯è¨éè¿åèç çæ¹å¼ï¼å¨ä¸å®ç¨åº¦ä¸è§£å³äºä¼ ç»è§£éåè¯è¨æ§è¡æçä½çé®é¢ï¼åæ¶åä¿çäºè§£éåè¯è¨å¯ç§»æ¤çç¹ç¹ãæä»¥ï¼ Java ç¨åºè¿è¡æ¶ç¸å¯¹æ¥è¯´è¿æ¯é«æçï¼ä¸è¿ï¼å C++ï¼Rustï¼Go çè¯è¨è¿æ¯æä¸å®å·®è·çï¼ï¼èä¸ï¼ç±äºåèç å¹¶ä¸é对ä¸ç§ç¹å®çæºå¨ï¼å æ¤ï¼Java ç¨åºæ 须鿰ç¼è¯ä¾¿å¯å¨å¤ç§ä¸åæä½ç³»ç»çè®¡ç®æºä¸è¿è¡ã **Java ç¨åºä»æºä»£ç å°è¿è¡çè¿ç¨å¦ä¸å¾æç¤ºï¼**  æä»¬éè¦æ ¼å¤æ³¨æçæ¯ `.class->æºå¨ç ` è¿ä¸æ¥ãå¨è¿ä¸æ¥ JVM ç±»å è½½å¨é¦å å è½½åèç æä»¶ï¼ç¶åéè¿è§£éå¨éè¡è§£éæ§è¡ï¼è¿ç§æ¹å¼çæ§è¡é度ä¼ç¸å¯¹æ¯è¾æ ¢ãèä¸ï¼æäºæ¹æ³å代ç 忝ç»å¸¸éè¦è¢«è°ç¨ç(ä¹å°±æ¯æè°ççç¹ä»£ç )ï¼æä»¥åé¢å¼è¿äº JITï¼just-in-time compilationï¼ ç¼è¯å¨ï¼è JIT å±äºè¿è¡æ¶ç¼è¯ãå½ JIT ç¼è¯å¨å®æç¬¬ä¸æ¬¡ç¼è¯åï¼å ¶ä¼å°åèç 对åºçæºå¨ç ä¿å䏿¥ï¼ä¸æ¬¡å¯ä»¥ç´æ¥ä½¿ç¨ãèæä»¬ç¥éï¼æºå¨ç çè¿è¡æçè¯å®æ¯é«äº Java è§£éå¨çãè¿ä¹è§£éäºæä»¬ä¸ºä»ä¹ç»å¸¸ä¼è¯´ **Java æ¯ç¼è¯ä¸è§£éå ±åçè¯è¨** ã > HotSpot éç¨äºæ°æ§è¯ä¼°(Lazy Evaluation)çåæ³ï¼æ ¹æ®äºå «å®å¾ï¼æ¶è大é¨åç³»ç»èµæºçåªæé£ä¸å°é¨åç代ç ï¼çç¹ä»£ç ï¼ï¼èè¿ä¹å°±æ¯ JIT æéè¦ç¼è¯çé¨åãJVM 伿 ¹æ®ä»£ç æ¯æ¬¡è¢«æ§è¡çæ 嵿¶éä¿¡æ¯å¹¶ç¸åºå°ååºä¸äºä¼åï¼å æ¤æ§è¡ç次æ°è¶å¤ï¼å®çé度就è¶å¿«ãJDK 9 å¼å ¥äºä¸ç§æ°çç¼è¯æ¨¡å¼ AOT(Ahead of Time Compilation)ï¼å®æ¯ç´æ¥å°åèç ç¼è¯ææºå¨ç ï¼è¿æ ·å°±é¿å äº JIT é¢ççåæ¹é¢çå¼éãJDK æ¯æåå±ç¼è¯å AOT åä½ä½¿ç¨ã ### 为ä»ä¹ä¸å ¨é¨ä½¿ç¨ AOT å¢ï¼ AOT å¯ä»¥æåç¼è¯èçå¯å¨æ¶é´ï¼é£ä¸ºä»ä¹ä¸å ¨é¨ä½¿ç¨è¿ç§ç¼è¯æ¹å¼å¢ï¼ é¿è¯ç说ï¼è¿å Java è¯è¨çå¨æç¹æ§æåä¸ä¸ç¼çèç³»äºã举个ä¾åï¼CGLIB 卿代ç使ç¨çæ¯ ASM ææ¯ï¼èè¿ç§ææ¯å¤§è´åçæ¯è¿è¡æ¶ç´æ¥å¨å åä¸çæå¹¶å 载修æ¹åçåèç æä»¶ä¹å°±æ¯ `.class` æä»¶ï¼å¦æå ¨é¨ä½¿ç¨ AOT æåç¼è¯ï¼ä¹å°±ä¸è½ä½¿ç¨ ASM ææ¯äºãä¸ºäºæ¯æç±»ä¼¼çå¨æç¹æ§ï¼æä»¥éæ©ä½¿ç¨ JIT 峿¶ç¼è¯å¨ã ### 为ä»ä¹è¯´ Java è¯è¨âç¼è¯ä¸è§£éå¹¶åâï¼ å ¶å®è¿ä¸ªé®é¢æä»¬è®²åèç çæ¶åå·²ç»æå°è¿ï¼å 为æ¯è¾éè¦ï¼æä»¥æä»¬è¿éåæä¸ä¸ã æä»¬å¯ä»¥å°é«çº§ç¼ç¨è¯è¨æç §ç¨åºçæ§è¡æ¹å¼å为两ç§ï¼ - **ç¼è¯å** ï¼[ç¼è¯åè¯è¨](https://zh.wikipedia.org/wiki/%E7%B7%A8%E8%AD%AF%E8%AA%9E%E8%A8%80) ä¼éè¿[ç¼è¯å¨](https://zh.wikipedia.org/wiki/%E7%B7%A8%E8%AD%AF%E5%99%A8)å°æºä»£ç 䏿¬¡æ§ç¿»è¯æå¯è¢«è¯¥å¹³å°æ§è¡çæºå¨ç ãä¸è¬æ åµä¸ï¼ç¼è¯è¯è¨çæ§è¡é度æ¯è¾å¿«ï¼å¼åæçæ¯è¾ä½ã常è§çç¼è¯æ§è¯è¨æ CãC++ãGoãRust ççã - **è§£éå** ï¼[è§£éåè¯è¨](https://zh.wikipedia.org/wiki/%E7%9B%B4%E8%AD%AF%E8%AA%9E%E8%A8%80)ä¼éè¿[è§£éå¨](https://zh.wikipedia.org/wiki/ç´è¯å¨)ä¸å¥ä¸å¥çå°ä»£ç è§£éï¼interpretï¼ä¸ºæºå¨ä»£ç ååæ§è¡ãè§£éåè¯è¨å¼åæçæ¯è¾å¿«ï¼æ§è¡é度æ¯è¾æ ¢ã常è§çè§£éæ§è¯è¨æ PythonãJavaScriptãPHP ççã  æ ¹æ®ç»´åºç¾ç§ä»ç»ï¼ > ä¸ºäºæ¹åç¼è¯è¯è¨çæçèåå±åºç[峿¶ç¼è¯](https://zh.wikipedia.org/wiki/å³æç·¨è¯)ææ¯ï¼å·²ç»ç¼©å°äºè¿ä¸¤ç§è¯è¨é´çå·®è·ãè¿ç§ææ¯æ··åäºç¼è¯è¯è¨ä¸è§£éåè¯è¨çä¼ç¹ï¼å®åç¼è¯è¯è¨ä¸æ ·ï¼å æç¨åºæºä»£ç ç¼è¯æ[åèç ](https://zh.wikipedia.org/wiki/åèç )ãå°æ§è¡ææ¶ï¼åå°åèç ç´è¯ï¼ä¹åæ§è¡ã[Java](https://zh.wikipedia.org/wiki/Java)ä¸[LLVM](https://zh.wikipedia.org/wiki/LLVM)æ¯è¿ç§ææ¯ç代表产ç©ã > > ç¸å ³é 读ï¼[åºæ¬å | Java 峿¶ç¼è¯å¨åçè§£æåå®è·µ](https://tech.meituan.com/2020/10/22/java-jit-practice-in-meituan.html) **为ä»ä¹è¯´ Java è¯è¨âç¼è¯ä¸è§£éå¹¶åâï¼** è¿æ¯å 为 Java è¯è¨æ¢å ·æç¼è¯åè¯è¨çç¹å¾ï¼ä¹å ·æè§£éåè¯è¨çç¹å¾ãå 为 Java ç¨åºè¦ç»è¿å ç¼è¯ï¼åè§£é两个æ¥éª¤ï¼ç± Java ç¼åçç¨åºéè¦å ç»è¿ç¼è¯æ¥éª¤ï¼çæåèç ï¼`.class` æä»¶ï¼ï¼è¿ç§åèç å¿ é¡»ç± Java è§£é卿¥è§£éæ§è¡ã ### Oracle JDK vs OpenJDK å¯è½å¨çè¿ä¸ªé®é¢ä¹åå¾å¤äººåæä¸æ ·å¹¶æ²¡ææ¥è§¦å使ç¨è¿ OpenJDK ãé£ä¹ Oracle JDK å OpenJDK ä¹é´æ¯å¦åå¨é大差å¼ï¼ä¸é¢æéè¿æ¶éå°çä¸äºèµæï¼ä¸ºä½ è§£çè¿ä¸ªè¢«å¾å¤äººå¿½è§çé®é¢ã å¯¹äº Java 7ï¼æ²¡ä»ä¹å ³é®çå°æ¹ãOpenJDK 项ç®ä¸»è¦åºäº Sun æèµ ç HotSpot æºä»£ç ãæ¤å¤ï¼OpenJDK 被é为 Java 7 çåèå®ç°ï¼ç± Oracle å·¥ç¨å¸ç»´æ¤ãå ³äº JVMï¼JDKï¼JRE å OpenJDK ä¹é´çåºå«ï¼Oracle å客å¸åå¨ 2012 å¹´æä¸ä¸ªæ´è¯¦ç»ççæ¡ï¼ > é®ï¼OpenJDK åå¨åºä¸çæºä»£ç ä¸ç¨äºæå»º Oracle JDK ç代ç ä¹é´æä»ä¹åºå«ï¼ > > çï¼é常æ¥è¿ - æä»¬ç Oracle JDK çæ¬æå»ºè¿ç¨åºäº OpenJDK 7 æå»ºï¼åªæ·»å äºå 个é¨åï¼ä¾å¦é¨ç½²ä»£ç ï¼å ¶ä¸å æ¬ Oracle ç Java æä»¶å Java WebStart çå®ç°ï¼ä»¥åä¸äºéæºçç¬¬ä¸æ¹ç»ä»¶ï¼å¦å¾å½¢å æ åå¨ï¼ä¸äºå¼æºçç¬¬ä¸æ¹ç»ä»¶ï¼å¦ Rhinoï¼ä»¥åä¸äºé¶ç¢çä¸è¥¿ï¼å¦éå ææ¡£æç¬¬ä¸æ¹åä½ãå±ææªæ¥ï¼æä»¬çç®çæ¯å¼æº Oracle JDK çææé¨åï¼é¤äºæä»¬èèåä¸åè½çé¨åã **æ»ç»ï¼**ï¼æç¤ºï¼ä¸é¢æ¬å·å çå 容æ¯åºäºåæè¡¥å 说æçï¼å 为åæå¤ªè¿äºæ¦æ¶©é¾æï¼ç¨äººè¯éæ°è§£éäºä¸ï¼å¦æä½ ç徿éé¢çæ¯è¯ï¼å¯ä»¥å¿½ç¥æ¬å·è§£éçå å®¹ï¼ 1. Oracle JDK å¤§æ¦æ¯ 6 个æå䏿¬¡ä¸»è¦çæ¬ï¼ä» 2014 å¹´ 3 æ JDK 8 LTS åå¸å° 2017 å¹´ 9 æ JDK 9 åå¸ç»åäºé¿è¾¾ 3 å¹´å¤çæ¶é´ï¼æä»¥å¹¶ä¸æ»æ¯ 6 个æï¼ï¼è OpenJDK çæ¬å¤§æ¦æ¯ä¸ä¸ªæåå¸ä¸æ¬¡ãä½è¿ä¸æ¯åºå®çï¼æè§å¾äºè§£è¿ä¸ªæ²¡å¥ç¨å¤ã详æ åè§ï¼[https://blogs.oracle.com/java-platform-group/update-and-faq-on-the-java-se-release-cadence](https://blogs.oracle.com/java-platform-group/update-and-faq-on-the-java-se-release-cadence) ã 2. OpenJDK æ¯ä¸ä¸ªåèæ¨¡å并䏿¯å®å ¨å¼æºçï¼è Oracle JDK æ¯ OpenJDK çä¸ä¸ªå®ç°ï¼å¹¶ä¸æ¯å®å ¨å¼æºçï¼ï¼ä¸ªäººè§ç¹ï¼ä¼æå¨ç¥ï¼JDK åæ¥æ¯ SUN å ¬å¸å¼åçï¼åæ¥ SUN å ¬å¸ååç»äº Oracle å ¬å¸ï¼Oracle å ¬å¸ä»¥ Oracle æ°æ®åºèèåï¼è Oracle æ°æ®åºåæ¯éæºçï¼è¿ä¸ªæ¶å Oracle å ¬å¸å°±ä¸æ³å®å ¨å¼æºäºï¼ä½æ¯åæ¥ç SUN å ¬å¸åæ JDK ç»å¼æºäºï¼å¦æè¿ä¸ªæ¶å Oracle æ¶è´åæ¥ä¹åå°±æä»ç»éæºï¼å¿ ç¶ä¼å¼èµ·å¾å¤ Java å¼åè ç䏿»¡ï¼å¯¼è´å¤§å®¶å¯¹ Java 失å»ä¿¡å¿ï¼é£ Oracle å ¬å¸æ¶è´åæ¥ä¸å°±æ Java ç卿éäºåï¼ç¶åï¼Oracle å ¬å¸å°±æ³äºä¸ªéªæä½ï¼è¿æ ·å§ï¼ææä¸é¨åæ ¸å¿ä»£ç 弿ºåºæ¥ç»ä½ 们ç©ï¼å¹¶ä¸æè¦åä½ ä»¬èªå·±æç JDK åºåä¸ï¼ä½ ä»¬å« OpenJDKï¼æå« Oracle JDKï¼æå叿çï¼ä½ 们继ç»ç©ä½ 们çï¼è¦æ¯ä½ 们æåºæ¥ä»ä¹å¥½ç©çä¸è¥¿ï¼æåç»åå¸ Oracle JDK ä¹ä¼æ¿æ¥ç¨ä¸ä¸ï¼ä¸ä¸¾ä¸¤å¾ï¼ï¼OpenJDK 弿ºé¡¹ç®ï¼[https://github.com/openjdk/jdk](https://github.com/openjdk/jdk) 3. Oracle JDK æ¯ OpenJDK æ´ç¨³å®ï¼è¯å®å¦ï¼Oracle JDK ç± Oracle å é¨å¢éè¿è¡åç¬ç åçï¼èä¸å叿¶é´æ¯ OpenJDK æ´é¿ï¼è´¨éæ´æä¿éï¼ãOpenJDK å Oracle JDK ç代ç å ä¹ç¸åï¼OpenJDK çä»£ç æ¯ä» Oracle JDK ä»£ç æ´¾çåºæ¥çï¼å¯ä»¥çè§£ä¸ºå¨ Oracle JDK 忝䏿äºä¸æ¡æ°çåæ¯å« OpenJDKï¼æä»¥å¤§é¨å代ç ç¸åï¼ï¼ä½ Oracle JDK ææ´å¤çç±»åä¸äºé误修å¤ãå æ¤ï¼å¦ææ¨æ³å¼åä¼ä¸/åä¸è½¯ä»¶ï¼æå»ºè®®æ¨éæ© Oracle JDKï¼å 为å®ç»è¿äºå½»åºçæµè¯å稳å®ãæäºæ åµä¸ï¼æäºäººæå°å¨ä½¿ç¨ OpenJDK å¯è½ä¼éå°äºè®¸å¤åºç¨ç¨åºå´©æºçé®é¢ï¼ä½æ¯ï¼åªéåæ¢å° Oracle JDK å°±å¯ä»¥è§£å³é®é¢ï¼ 4. å¨ååºæ§å JVM æ§è½æ¹é¢ï¼Oracle JDK ä¸ OpenJDK ç¸æ¯æä¾äºæ´å¥½çæ§è½ï¼ 5. Oracle JDK ä¸ä¼ä¸ºå³å°åå¸ççæ¬æä¾é¿ææ¯æï¼å¦ææ¯ LTS é¿ææ¯æçæ¬çè¯ä¹ä¼ï¼æ¯å¦ JDK 8ï¼ä½å¹¶ä¸æ¯æ¯ä¸ªçæ¬é½æ¯ LTS çæ¬ï¼ï¼ç¨æ·æ¯æ¬¡é½å¿ é¡»éè¿æ´æ°å°ææ°çæ¬è·å¾æ¯ææ¥è·åææ°çæ¬ï¼ 6. Oracle JDK ä½¿ç¨ BCL/OTN åè®®è·å¾è®¸å¯ï¼è OpenJDK æ ¹æ® GPL v2 许å¯è·å¾è®¸å¯ã > æ¢ç¶ Oracle JDK è¿ä¹å¥½ï¼é£ä¸ºä»ä¹è¿è¦æ OpenJDKï¼ > > çï¼ > > 1. OpenJDK æ¯å¼æºçï¼å¼æºæå³çä½ å¯ä»¥å¯¹å®æ ¹æ®ä½ èªå·±çéè¦è¿è¡ä¿®æ¹ãä¼åï¼æ¯å¦ Alibaba åºäº OpenJDK å¼åäº Dragonwell8ï¼[https://github.com/alibaba/dragonwell8](https://github.com/alibaba/dragonwell8) > > 2. OpenJDK æ¯åä¸å è´¹çï¼è¿ä¹æ¯ä¸ºä»ä¹éè¿ yum å 管çå¨ä¸é»è®¤å®è£ ç JDK æ¯ OpenJDK è䏿¯ Oracle JDKï¼ãè½ç¶ Oracle JDK 乿¯åä¸å è´¹ï¼æ¯å¦ JDK 8ï¼ï¼ä½å¹¶ä¸æ¯ææçæ¬é½æ¯å è´¹çã > > 3. OpenJDK æ´æ°é¢çæ´å¿«ãOracle JDK ä¸è¬æ¯æ¯ 6 个æåå¸ä¸ä¸ªæ°çæ¬ï¼è OpenJDK ä¸è¬æ¯æ¯ 3 个æåå¸ä¸ä¸ªæ°çæ¬ãï¼ç°å¨ä½ ç¥éä¸ºå¥ Oracle JDK æ´ç¨³å®äºå§ï¼å å¨ OpenJDK è¯è¯æ°´ï¼æå¤§é¨åé®é¢é½è§£å³æäºæå¨ Oracle JDK ä¸åå¸ï¼ > > åºäºä»¥ä¸è¿äºåå ï¼OpenJDK è¿æ¯æåå¨çå¿ è¦çï¼  ð æå±ä¸ä¸ï¼ - BCL åè®®ï¼Oracle Binary Code License Agreementï¼ï¼ å¯ä»¥ä½¿ç¨ JDKï¼æ¯æåç¨ï¼ï¼ä½æ¯ä¸è½è¿è¡ä¿®æ¹ã - OTN åè®®ï¼Oracle Technology Network License Agreementï¼ï¼ 11 åä¹åæ°åå¸ç JDK ç¨ç齿¯è¿ä¸ªåè®®ï¼å¯ä»¥èªå·±ç§ä¸ç¨ï¼ä½æ¯åç¨éè¦ä»è´¹ã  ç¸å ³é 读 ðï¼[ãDifferences Between Oracle JDK and OpenJDKã](https://www.baeldung.com/oracle-jdk-vs-openjdk) ### Java å C++ çåºå«? æç¥éå¾å¤äººæ²¡å¦è¿ C++ï¼ä½æ¯é¢è¯å®å°±æ¯æ²¡äºå欢æ¿å±ä»¬ Java å C++ æ¯åï¼æ²¡åæ³ï¼ï¼ï¼å°±ç®æ²¡å¦è¿ C++ï¼ä¹è¦è®°ä¸æ¥ã è½ç¶ï¼Java å C++ 齿¯é¢å对象çè¯è¨ï¼é½æ¯æå°è£ ãç»§æ¿å夿ï¼ä½æ¯ï¼å®ä»¬è¿æ¯ææºå¤ä¸ç¸åçå°æ¹ï¼ - Java ä¸æä¾æéæ¥ç´æ¥è®¿é®å åï¼ç¨åºå åæ´å å®å ¨ - Java çç±»æ¯åç»§æ¿çï¼C++ æ¯æå¤éç»§æ¿ï¼è½ç¶ Java çç±»ä¸å¯ä»¥å¤ç»§æ¿ï¼ä½æ¯æ¥å£å¯ä»¥å¤ç»§æ¿ã - Java æèªå¨å å管çåå¾åæ¶æºå¶(GC)ï¼ä¸éè¦ç¨åºåæå¨éæ¾æ ç¨å åã - C ++åæ¶æ¯ææ¹æ³éè½½åæä½ç¬¦éè½½ï¼ä½æ¯ Java åªæ¯ææ¹æ³éè½½ï¼æä½ç¬¦éè½½å¢å äºå¤ææ§ï¼è¿ä¸ Java æåçè®¾è®¡ææ³ä¸ç¬¦ï¼ã - ...... ## åºæ¬è¯æ³ ### 注éæåªå ç§å½¢å¼ï¼ Java ä¸ç注éæä¸ç§ï¼ 1. **åè¡æ³¨é** ï¼é常ç¨äºè§£éæ¹æ³å æåè¡ä»£ç çä½ç¨ã 2. **å¤è¡æ³¨é** ï¼é常ç¨äºè§£é䏿®µä»£ç çä½ç¨ã 3. **ææ¡£æ³¨é** ï¼é常ç¨äºçæ Java å¼åææ¡£ã ç¨çæ¯è¾å¤çè¿æ¯åè¡æ³¨éåææ¡£æ³¨éï¼å¤è¡æ³¨éå¨å®é å¼åä¸ä½¿ç¨çç¸å¯¹è¾å°ã  卿们ç¼å代ç çæ¶åï¼å¦æä»£ç 鿝è¾å°ï¼æä»¬èªå·±æè å¢éå ¶ä»æåè¿å¯ä»¥å¾è½»æå°çæä»£ç ï¼ä½æ¯å½é¡¹ç®ç»æä¸æ¦å¤æèµ·æ¥ï¼æä»¬å°±éè¦ç¨å°æ³¨éäºã注éå¹¶ä¸ä¼æ§è¡(ç¼è¯å¨å¨ç¼è¯ä»£ç ä¹å伿代ç ä¸çæææ³¨éæ¹æ,åèç ä¸ä¸ä¿ç注é)ï¼æ¯æä»¬ç¨åºååç»èªå·±ççï¼æ³¨éæ¯ä½ ç代ç 说æä¹¦ï¼è½å¤å¸®å©ç代ç ç人快éå°çæ¸ ä»£ç ä¹é´çé»è¾å ³ç³»ãå æ¤ï¼å¨åç¨åºçæ¶åéæå 䏿³¨éæ¯ä¸ä¸ªé常好çä¹ æ¯ã ãClean Codeãè¿æ¬ä¹¦æç¡®æåºï¼ > **代ç çæ³¨é䏿¯è¶è¯¦ç»è¶å¥½ãå®é ä¸å¥½çä»£ç æ¬èº«å°±æ¯æ³¨éï¼æä»¬è¦å°½éè§èåç¾åèªå·±çä»£ç æ¥åå°ä¸å¿ è¦ç注éã** > > **è¥ç¼ç¨è¯è¨è¶³å¤æè¡¨è¾¾åï¼å°±ä¸éè¦æ³¨éï¼å°½ééè¿ä»£ç æ¥éè¿°ã** > > 举个ä¾åï¼ > > 廿ä¸é¢å¤æç注éï¼åªéè¦å建ä¸ä¸ªä¸æ³¨éæè¨åä¸äºç©ç彿°å³å¯ > > ```java > // check to see if the employee is eligible for full benefits > if ((employee.flags & HOURLY_FLAG) && (employee.age > 65)) > ``` > > åºæ¿æ¢ä¸º > > ```java > if (employee.isEligibleForFullBenefits()) > ``` ### æ è¯ç¬¦åå ³é®åçåºå«æ¯ä»ä¹ï¼ 卿们ç¼åç¨åºçæ¶åï¼éè¦å¤§éå°ä¸ºç¨åºãç±»ãåéãæ¹æ³çåååï¼äºæ¯å°±æäº **æ è¯ç¬¦** ãç®åæ¥è¯´ï¼ **æ è¯ç¬¦å°±æ¯ä¸ä¸ªåå** ã æä¸äºæ è¯ç¬¦ï¼Java è¯è¨å·²ç»èµäºäºå ¶ç¹æ®çå«ä¹ï¼åªè½ç¨äºç¹å®çå°æ¹ï¼è¿äºç¹æ®çæ è¯ç¬¦å°±æ¯ **å ³é®å** ãç®åæ¥è¯´ï¼**å ³é®åæ¯è¢«èµäºç¹æ®å«ä¹çæ è¯**符 ãæ¯å¦ï¼å¨æä»¬çæ¥å¸¸çæ´»ä¸ï¼å¦ææä»¬æ³è¦å¼ä¸å®¶åºï¼åè¦ç»è¿ä¸ªåºèµ·ä¸ä¸ªååï¼èµ·çè¿ä¸ªâååâ就嫿 è¯ç¬¦ã使¯æä»¬åºçååä¸è½å«âè¦å¯å±âï¼å 为âè¦å¯å±âè¿ä¸ªååå·²ç»è¢«èµäºäºç¹æ®çå«ä¹ï¼èâè¦å¯å±âå°±æ¯æä»¬æ¥å¸¸çæ´»ä¸çå ³é®åã ### Java è¯è¨å ³é®åæåªäºï¼ | åç±» | å ³é®å | | | | | | | | :------------------- | -------- | ---------- | -------- | ------------ | ---------- | --------- | ------ | | è®¿é®æ§å¶ | private | protected | public | | | | | | ç±»ï¼æ¹æ³ååé修饰符 | abstract | class | extends | final | implements | interface | native | | | new | static | strictfp | synchronized | transient | volatile | enum | | ç¨åºæ§å¶ | break | continue | return | do | while | if | else | | | for | instanceof | switch | case | default | assert | | | é误å¤ç | try | catch | throw | throws | finally | | | | å ç¸å ³ | import | package | | | | | | | åºæ¬ç±»å | boolean | byte | char | double | float | int | long | | | short | | | | | | | | åéå¼ç¨ | super | this | void | | | | | | ä¿çå | goto | const | | | | | | > Tipsï¼ææçå ³é®å齿¯å°åçï¼å¨ IDE ä¸ä¼ä»¥ç¹æ®é¢è²æ¾ç¤ºã > > `default` è¿ä¸ªå ³é®åå¾ç¹æ®ï¼æ¢å±äºç¨åºæ§å¶ï¼ä¹å±äºç±»ï¼æ¹æ³ååé修饰符ï¼è¿å±äºè®¿é®æ§å¶ã > > - å¨ç¨åºæ§å¶ä¸ï¼å½å¨ `switch` ä¸å¹é ä¸å°ä»»ä½æ 嵿¶ï¼å¯ä»¥ä½¿ç¨ `default` æ¥ç¼åé»è®¤å¹é çæ åµã > - å¨ç±»ï¼æ¹æ³ååé修饰符ä¸ï¼ä» JDK8 å¼å§å¼å ¥äºé»è®¤æ¹æ³ï¼å¯ä»¥ä½¿ç¨ `default` å ³é®åæ¥å®ä¹ä¸ä¸ªæ¹æ³çé»è®¤å®ç°ã > - å¨è®¿é®æ§å¶ä¸ï¼å¦æä¸ä¸ªæ¹æ³å没æä»»ä½ä¿®é¥°ç¬¦ï¼åé»è®¤ä¼æä¸ä¸ªä¿®é¥°ç¬¦ `default`ï¼ä½æ¯è¿ä¸ªä¿®é¥°ç¬¦å ä¸äºå°±ä¼æ¥éã â ï¸ æ³¨æ ï¼è½ç¶ `true`, `false`, å `null` çèµ·æ¥åå ³é®åä½å®é ä¸ä»ä»¬æ¯åé¢å¼ï¼åæ¶ä½ ä¹ä¸å¯ä»¥ä½ä¸ºæ è¯ç¬¦æ¥ä½¿ç¨ã 宿¹ææ¡£ï¼[https://docs.oracle.com/javase/tutorial/java/nutsandbolts/\_keywords.html](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html) ### èªå¢èªåè¿ç®ç¬¦ å¨å代ç çè¿ç¨ä¸ï¼å¸¸è§çä¸ç§æ 嵿¯éè¦æä¸ªæ´æ°ç±»ååéå¢å 1 æåå° 1ï¼Java æä¾äºä¸ç§ç¹æ®çè¿ç®ç¬¦ï¼ç¨äºè¿ç§è¡¨è¾¾å¼ï¼å«åèªå¢è¿ç®ç¬¦ï¼++)åèªåè¿ç®ç¬¦ï¼--ï¼ã ++ å -- è¿ç®ç¬¦å¯ä»¥æ¾å¨åéä¹åï¼ä¹å¯ä»¥æ¾å¨åéä¹åï¼å½è¿ç®ç¬¦æ¾å¨åéä¹åæ¶(åç¼)ï¼å èªå¢/åï¼åèµå¼ï¼å½è¿ç®ç¬¦æ¾å¨åéä¹åæ¶(åç¼)ï¼å èµå¼ï¼åèªå¢/åãä¾å¦ï¼å½ `b = ++a` æ¶ï¼å èªå¢ï¼èªå·±å¢å 1ï¼ï¼åèµå¼ï¼èµå¼ç» bï¼ï¼å½ `b = a++` æ¶ï¼å èµå¼(èµå¼ç» b)ï¼åèªå¢ï¼èªå·±å¢å 1ï¼ãä¹å°±æ¯ï¼++a è¾åºçæ¯ a+1 çå¼ï¼a++è¾åºçæ¯ a å¼ãç¨ä¸å¥å£è¯å°±æ¯ï¼â符å·å¨åå°±å å /åï¼ç¬¦å·å¨åå°±åå /åâã ### ç§»ä½è¿ç®ç¬¦ ç§»ä½è¿ç®ç¬¦æ¯æåºæ¬çè¿ç®ç¬¦ä¹ä¸ï¼å 乿¯ç§ç¼ç¨è¯è¨é½å å«è¿ä¸è¿ç®ç¬¦ãç§»ä½æä½ä¸ï¼è¢«æä½çæ°æ®è¢«è§ä¸ºäºè¿å¶æ°ï¼ç§»ä½å°±æ¯å°å ¶åå·¦æåå³ç§»å¨è¥å¹²ä½çè¿ç®ã ç§»ä½è¿ç®ç¬¦å¨åç§æ¡æ¶ä»¥å JDK èªèº«çæºç ä¸ä½¿ç¨è¿æ¯æºå¹¿æ³çï¼`HashMap`ï¼JDK1.8ï¼ ä¸ç `hash` æ¹æ³çæºç å°±ç¨å°äºç§»ä½è¿ç®ç¬¦ï¼ ```java static final int hash(Object key) { int h; // key.hashCode()ï¼è¿åæ£åå¼ä¹å°±æ¯hashcode // ^ ï¼æä½å¼æ // >>>:æ 符å·å³ç§»ï¼å¿½ç¥ç¬¦å·ä½ï¼ç©ºä½é½ä»¥0è¡¥é½ return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); } ``` å¨ Java 代ç éä½¿ç¨ `<<` ã `>>` å`>>>`è½¬æ¢æçæä»¤ç è¿è¡èµ·æ¥ä¼æ´é«æäºã ææ¡æåºæ¬çç§»ä½è¿ç®ç¬¦ç¥è¯è¿æ¯å¾æå¿ è¦çï¼è¿ä¸å å¯ä»¥å¸®å©æä»¬å¨ä»£ç ä¸ä½¿ç¨ï¼è¿å¯ä»¥å¸®å©æä»¬çè§£æºç 䏿¶åå°ç§»ä½è¿ç®ç¬¦ç代ç ã Java 䏿ä¸ç§ç§»ä½è¿ç®ç¬¦ï¼ - `<<` :左移è¿ç®ç¬¦ï¼å左移è¥å¹²ä½ï¼é«ä½ä¸¢å¼ï¼ä½ä½è¡¥é¶ã`x << 1`,ç¸å½äº x ä¹ä»¥ 2(䏿º¢åºçæ åµä¸)ã - `>>` :带符å·å³ç§»ï¼åå³ç§»è¥å¹²ä½ï¼é«ä½è¡¥ç¬¦å·ä½ï¼ä½ä½ä¸¢å¼ãæ£æ°é«ä½è¡¥ 0,è´æ°é«ä½è¡¥ 1ã`x >> 1`,ç¸å½äº x é¤ä»¥ 2ã - `>>>` :æ 符å·å³ç§»ï¼å¿½ç¥ç¬¦å·ä½ï¼ç©ºä½é½ä»¥ 0 è¡¥é½ã ç±äº `double`ï¼`float` å¨äºè¿å¶ä¸çè¡¨ç°æ¯è¾ç¹æ®ï¼å æ¤ä¸è½æ¥è¿è¡ç§»ä½æä½ã ç§»ä½æä½ç¬¦å®é 䏿¯æçç±»ååªæ`int`å`long`ï¼ç¼è¯å¨å¨å¯¹`short`ã`byte`ã`char`ç±»åè¿è¡ç§»ä½åï¼é½ä¼å°å ¶è½¬æ¢ä¸º`int`ç±»ååæä½ã **å¦æç§»ä½ç使°è¶ è¿æ°å¼æå æç使°ä¼ææ ·ï¼** å½ int ç±»å左移/å³ç§»ä½æ°å¤§äºçäº 32 使使¶ï¼ä¼å æ±ä½ï¼%ï¼ååè¿è¡å·¦ç§»/å³ç§»æä½ãä¹å°±æ¯è¯´å·¦ç§»/å³ç§» 32 ä½ç¸å½äºä¸è¿è¡ç§»ä½æä½ï¼32%32=0ï¼ï¼å·¦ç§»/å³ç§» 42 ä½ç¸å½äºå·¦ç§»/å³ç§» 10 ä½ï¼42%32=10ï¼ãå½ long ç±»åè¿è¡å·¦ç§»/å³ç§»æä½æ¶ï¼ç±äº long 对åºçäºè¿å¶æ¯ 64 ä½ï¼å æ¤æ±ä½æä½çåºæ°ä¹åæäº 64ã ä¹å°±æ¯è¯´ï¼`x<<42`çåäº`x<<10`ï¼`x>>42`çåäº`x>>10`ï¼``x >>>42`çåäº`i4 >>> 10`ã **左移è¿ç®ç¬¦ä»£ç 示ä¾** ï¼ ```java int i = -1; System.out.println("åå§æ°æ®ï¼ " + i); System.out.println("åå§æ°æ®å¯¹åºçäºè¿å¶åç¬¦ä¸²ï¼ " + Integer.toBinaryString(i)); i <<= 10; System.out.println("左移 10 ä½åçæ°æ® " + i); System.out.println("左移 10 ä½åçæ°æ®å¯¹åºçäºè¿å¶å符 " + Integer.toBinaryString(i)); ``` è¾åºï¼ ``` åå§æ°æ®ï¼ -1 åå§æ°æ®å¯¹åºçäºè¿å¶åç¬¦ä¸²ï¼ 11111111111111111111111111111111 左移 10 ä½åçæ°æ® -1024 左移 10 ä½åçæ°æ®å¯¹åºçäºè¿å¶å符 11111111111111111111110000000000 ``` ç±äºå·¦ç§»ä½æ°å¤§äºçäº 32 使使¶ï¼ä¼å æ±ä½ï¼%ï¼ååè¿è¡å·¦ç§»æä½ï¼æä»¥ä¸é¢ç代ç 左移 42 ä½ç¸å½äºå·¦ç§» 10 ä½ï¼42%32=10ï¼ï¼è¾åºç»æååé¢ç代ç 䏿 ·ã ```java int i = -1; System.out.println("åå§æ°æ®ï¼ " + i); System.out.println("åå§æ°æ®å¯¹åºçäºè¿å¶åç¬¦ä¸²ï¼ " + Integer.toBinaryString(i)); i <<= 42; System.out.println("左移 10 ä½åçæ°æ® " + i); System.out.println("左移 10 ä½åçæ°æ®å¯¹åºçäºè¿å¶å符 " + Integer.toBinaryString(i)); ``` å³ç§»è¿ç®ç¬¦ä½¿ç¨ç±»ä¼¼ï¼ç¯å¹ é®é¢ï¼è¿éå°±ä¸åæ¼ç¤ºäºã ### continueãbreak å return çåºå«æ¯ä»ä¹ï¼ å¨å¾ªç¯ç»æä¸ï¼å½å¾ªç¯æ¡ä»¶ä¸æ»¡è¶³æè å¾ªç¯æ¬¡æ°è¾¾å°è¦æ±æ¶ï¼å¾ªç¯ä¼æ£å¸¸ç»æã使¯ï¼ææ¶åå¯è½éè¦å¨å¾ªç¯çè¿ç¨ä¸ï¼å½åçäºæç§æ¡ä»¶ä¹å ï¼æåç»æ¢å¾ªç¯ï¼è¿å°±éè¦ç¨å°ä¸é¢å ä¸ªå ³é®è¯ï¼ 1. `continue` ï¼æè·³åºå½åçè¿ä¸æ¬¡å¾ªç¯ï¼ç»§ç»ä¸ä¸æ¬¡å¾ªç¯ã 2. `break` ï¼æè·³åºæ´ä¸ªå¾ªç¯ä½ï¼ç»§ç»æ§è¡å¾ªç¯ä¸é¢çè¯å¥ã `return` ç¨äºè·³åºæå¨æ¹æ³ï¼ç»æè¯¥æ¹æ³çè¿è¡ãreturn ä¸è¬æä¸¤ç§ç¨æ³ï¼ 1. `return;` ï¼ç´æ¥ä½¿ç¨ return ç»ææ¹æ³æ§è¡ï¼ç¨äºæ²¡æè¿åå¼å½æ°çæ¹æ³ 2. `return value;` ï¼return ä¸ä¸ªç¹å®å¼ï¼ç¨äºæè¿åå¼å½æ°çæ¹æ³ æèä¸ä¸ï¼ä¸åè¯å¥çè¿è¡ç»ææ¯ä»ä¹ï¼ ```java public static void main(String[] args) { boolean flag = false; for (int i = 0; i <= 3; i++) { if (i == 0) { System.out.println("0"); } else if (i == 1) { System.out.println("1"); continue; } else if (i == 2) { System.out.println("2"); flag = true; } else if (i == 3) { System.out.println("3"); break; } else if (i == 4) { System.out.println("4"); } System.out.println("xixi"); } if (flag) { System.out.println("haha"); return; } System.out.println("heihei"); } ``` è¿è¡ç»æï¼ ``` 0 xixi 1 2 xixi 3 haha ``` ### åé #### æååéä¸å±é¨åéçåºå«ï¼ - **è¯æ³å½¢å¼** ï¼ä»è¯æ³å½¢å¼ä¸çï¼æåå鿝å±äºç±»çï¼èå±é¨å鿝å¨ä»£ç åææ¹æ³ä¸å®ä¹çåéææ¯æ¹æ³çåæ°ï¼æååéå¯ä»¥è¢« `public`,`private`,`static` ç修饰符æä¿®é¥°ï¼èå±é¨åéä¸è½è¢«è®¿é®æ§å¶ä¿®é¥°ç¬¦å `static` æä¿®é¥°ï¼ä½æ¯ï¼æååéåå±é¨åéé½è½è¢« `final` æä¿®é¥°ã - **å卿¹å¼** ï¼ä»åéå¨å åä¸çå卿¹å¼æ¥ç,妿æååéæ¯ä½¿ç¨ `static` 修饰çï¼é£ä¹è¿ä¸ªæåå鿝å±äºç±»çï¼å¦ææ²¡æä½¿ç¨ `static` 修饰ï¼è¿ä¸ªæåå鿝å±äºå®ä¾çãè对象åå¨äºå å åï¼å±é¨åéååå¨äºæ å åã - **çåæ¶é´** ï¼ä»åéå¨å åä¸ççåæ¶é´ä¸çï¼æååéæ¯å¯¹è±¡çä¸é¨åï¼å®éç对象çå建èåå¨ï¼èå±é¨åééçæ¹æ³çè°ç¨èèªå¨çæï¼éçæ¹æ³çè°ç¨ç»æèæ¶äº¡ã - **é»è®¤å¼** ï¼ä»å鿝妿é»è®¤å¼æ¥çï¼æååéå¦ææ²¡æè¢«èµåå§å¼ï¼åä¼èªå¨ä»¥ç±»åçé»è®¤å¼èèµå¼ï¼ä¸ç§æ åµä¾å¤:被 `final` 修饰çæååéä¹å¿ é¡»æ¾å¼å°èµå¼ï¼ï¼èå±é¨åéåä¸ä¼èªå¨èµå¼ã #### éæåéæä»ä¹ä½ç¨ï¼ éæåéå¯ä»¥è¢«ç±»çææå®ä¾å ±äº«ãæ 论ä¸ä¸ªç±»å建äºå¤å°ä¸ªå¯¹è±¡ï¼å®ä»¬é½å ±äº«åä¸ä»½éæåéã é常æ åµä¸ï¼éæåéä¼è¢« `final` å ³é®å修饰æä¸ºå¸¸éã #### å符å常éåå符串常éçåºå«? 1. **å½¢å¼** : åç¬¦å¸¸éæ¯åå¼å·å¼èµ·çä¸ä¸ªå符ï¼åç¬¦ä¸²å¸¸éæ¯åå¼å·å¼èµ·ç 0 个æè¥å¹²ä¸ªå符ã 2. **å«ä¹** : å符常éç¸å½äºä¸ä¸ªæ´åå¼( ASCII å¼),å¯ä»¥åå 表达å¼è¿ç®; å符串常é代表ä¸ä¸ªå°åå¼(该å符串å¨å åä¸åæ¾ä½ç½®)ã 3. **å å å大å°** ï¼ å符常éåªå 2 个åè; å符串常éå è¥å¹²ä¸ªåèã (**注æï¼ `char` å¨ Java ä¸å 两个åè**) ### æ¹æ³ #### ä»ä¹æ¯æ¹æ³çè¿åå¼?æ¹æ³æåªå ç§ç±»åï¼ **æ¹æ³çè¿åå¼** æ¯ææä»¬è·åå°çæä¸ªæ¹æ³ä½ä¸çä»£ç æ§è¡å产ççç»æï¼ï¼åææ¯è¯¥æ¹æ³å¯è½äº§çç»æï¼ãè¿åå¼çä½ç¨æ¯æ¥æ¶åºç»æï¼ä½¿å¾å®å¯ä»¥ç¨äºå ¶ä»çæä½ï¼ æä»¬å¯ä»¥æç §æ¹æ³çè¿åå¼ååæ°ç±»åå°æ¹æ³å为ä¸é¢è¿å ç§ï¼ **1.æ åæ°æ è¿åå¼çæ¹æ³** ```java public void f1() { //...... } // ä¸é¢è¿ä¸ªæ¹æ³ä¹æ²¡æè¿åå¼ï¼è½ç¶ç¨å°äº return public void f(int a) { if (...) { // è¡¨ç¤ºç»ææ¹æ³çæ§è¡,䏿¹çè¾åºè¯å¥ä¸ä¼æ§è¡ return; } System.out.println(a); } ``` **2.æåæ°æ è¿åå¼çæ¹æ³** ```java public void f2(Parameter 1, ..., Parameter n) { //...... } ``` **3.æè¿å弿 åæ°çæ¹æ³** ```java public int f3() { //...... return x; } ``` **4.æè¿åå¼æåæ°çæ¹æ³** ```java public int f4(int a, int b) { return a * b; } ``` #### éææ¹æ³ä¸ºä»ä¹ä¸è½è°ç¨ééææå? è¿ä¸ªéè¦ç»å JVM çç¸å ³ç¥è¯ï¼ä¸»è¦åå å¦ä¸ï¼ 1. éææ¹æ³æ¯å±äºç±»çï¼å¨ç±»å è½½çæ¶åå°±ä¼åé å åï¼å¯ä»¥éè¿ç±»åç´æ¥è®¿é®ãèééææåå±äºå®ä¾å¯¹è±¡ï¼åªæå¨å¯¹è±¡å®ä¾åä¹åæåå¨ï¼éè¦éè¿ç±»çå®ä¾å¯¹è±¡å»è®¿é®ã 2. å¨ç±»çééææåä¸åå¨çæ¶åéææ¹æ³å°±å·²ç»åå¨äºï¼æ¤æ¶è°ç¨å¨å åä¸è¿ä¸åå¨çééææåï¼å±äºéæ³æä½ã #### éææ¹æ³åå®ä¾æ¹æ³æä½ä¸åï¼ **1ãè°ç¨æ¹å¼** å¨å¤é¨è°ç¨éææ¹æ³æ¶ï¼å¯ä»¥ä½¿ç¨ `ç±»å.æ¹æ³å` çæ¹å¼ï¼ä¹å¯ä»¥ä½¿ç¨ `对象.æ¹æ³å` çæ¹å¼ï¼èå®ä¾æ¹æ³åªæåé¢è¿ç§æ¹å¼ãä¹å°±æ¯è¯´ï¼**è°ç¨éææ¹æ³å¯ä»¥æ éå建对象** ã ä¸è¿ï¼éè¦æ³¨æçæ¯ä¸è¬ä¸å»ºè®®ä½¿ç¨ `对象.æ¹æ³å` çæ¹å¼æ¥è°ç¨éææ¹æ³ãè¿ç§æ¹å¼é常容æé ææ··æ·ï¼éææ¹æ³ä¸å±äºç±»çæä¸ªå¯¹è±¡èæ¯å±äºè¿ä¸ªç±»ã å æ¤ï¼ä¸è¬å»ºè®®ä½¿ç¨ `ç±»å.æ¹æ³å` çæ¹å¼æ¥è°ç¨éææ¹æ³ã ```java public class Person { public void method() { //...... } public static void staicMethod(){ //...... } public static void main(String[] args) { Person person = new Person(); // è°ç¨å®ä¾æ¹æ³ person.method(); // è°ç¨éææ¹æ³ Person.staicMethod() } } ``` **2ã访é®ç±»æåæ¯å¦åå¨éå¶** éææ¹æ³å¨è®¿é®æ¬ç±»çæåæ¶ï¼åªå 许访é®éææåï¼å³éææååéåéææ¹æ³ï¼ï¼ä¸å 许访é®å®ä¾æåï¼å³å®ä¾æååéåå®ä¾æ¹æ³ï¼ï¼èå®ä¾æ¹æ³ä¸åå¨è¿ä¸ªéå¶ã #### éè½½åéåæä»ä¹åºå«ï¼ > é载就æ¯åæ ·çä¸ä¸ªæ¹æ³è½å¤æ ¹æ®è¾å ¥æ°æ®çä¸åï¼ååºä¸åçå¤ç > > éåå°±æ¯å½å类继æ¿èªç¶ç±»çç¸åæ¹æ³ï¼è¾å ¥æ°æ®ä¸æ ·ï¼ä½è¦ååºæå«äºç¶ç±»çååºæ¶ï¼ä½ å°±è¦è¦çç¶ç±»æ¹æ³ **éè½½** åçå¨åä¸ä¸ªç±»ä¸ï¼æè ç¶ç±»ååç±»ä¹é´ï¼ï¼æ¹æ³åå¿ é¡»ç¸åï¼åæ°ç±»åä¸åã个æ°ä¸åã顺åºä¸åï¼æ¹æ³è¿åå¼å访é®ä¿®é¥°ç¬¦å¯ä»¥ä¸åã ãJava æ ¸å¿ææ¯ãè¿æ¬ä¹¦æ¯è¿æ ·ä»ç»éè½½çï¼ > 妿å¤ä¸ªæ¹æ³(æ¯å¦ `StringBuilder` çæé æ¹æ³)æç¸åçååãä¸åçåæ°ï¼ ä¾¿äº§çäºéè½½ã > > ```java > StringBuilder sb = new StringBuilder(); > StringBuilder sb2 = new StringBuilder("HelloWorld"); > ``` > > ç¼è¯å¨å¿ é¡»æéåºå ·ä½æ§è¡åªä¸ªæ¹æ³ï¼å®éè¿ç¨åä¸ªæ¹æ³ç»åºçåæ°ç±»åä¸ç¹å®æ¹æ³è°ç¨æä½¿ç¨çå¼ç±»åè¿è¡å¹é æ¥æéåºç¸åºçæ¹æ³ã 妿ç¼è¯å¨æ¾ä¸å°å¹é çåæ°ï¼ å°±ä¼äº§çç¼è¯æ¶éè¯¯ï¼ å ä¸ºæ ¹æ¬ä¸åå¨å¹é ï¼ æè 没æä¸ä¸ªæ¯å ¶ä»çæ´å¥½(è¿ä¸ªè¿ç¨è¢«ç§°ä¸ºé载解æ(overloading resolution))ã > > Java å 许éè½½ä»»ä½æ¹æ³ï¼ èä¸åªæ¯æé 卿¹æ³ã 综ä¸ï¼é载就æ¯åä¸ä¸ªç±»ä¸å¤ä¸ªååæ¹æ³æ ¹æ®ä¸åçä¼ åæ¥æ§è¡ä¸åçé»è¾å¤çã **éå** éååçå¨è¿è¡æï¼æ¯å类对ç¶ç±»çå 许访é®çæ¹æ³çå®ç°è¿ç¨è¿è¡éæ°ç¼åã 1. æ¹æ³åãåæ°åè¡¨å¿ é¡»ç¸åï¼åç±»æ¹æ³è¿åå¼ç±»ååºæ¯ç¶ç±»æ¹æ³è¿åå¼ç±»åæ´å°æç¸çï¼æåºçå¼å¸¸èå´å°äºçäºç¶ç±»ï¼è®¿é®ä¿®é¥°ç¬¦èå´å¤§äºçäºç¶ç±»ã 2. 妿ç¶ç±»æ¹æ³è®¿é®ä¿®é¥°ç¬¦ä¸º `private/final/static` åå类就ä¸è½éåè¯¥æ¹æ³ï¼ä½æ¯è¢« `static` ä¿®é¥°çæ¹æ³è½å¤è¢«å次声æã 3. æé æ¹æ³æ æ³è¢«éå 综ä¸ï¼**éåå°±æ¯å类对ç¶ç±»æ¹æ³çéæ°æ¹é ï¼å¤é¨æ ·åä¸è½æ¹åï¼å é¨é»è¾å¯ä»¥æ¹åã** | åºå«ç¹ | éè½½æ¹æ³ | éåæ¹æ³ | | :--------- | :------- | :----------------------------------------------------------- | | åçèå´ | åä¸ä¸ªç±» | åç±» | | åæ°å表 | å¿ é¡»ä¿®æ¹ | ä¸å®ä¸è½ä¿®æ¹ | | è¿åç±»å | å¯ä¿®æ¹ | åç±»æ¹æ³è¿åå¼ç±»ååºæ¯ç¶ç±»æ¹æ³è¿åå¼ç±»åæ´å°æç¸ç | | å¼å¸¸ | å¯ä¿®æ¹ | åç±»æ¹æ³å£°ææåºçå¼å¸¸ç±»åºæ¯ç¶ç±»æ¹æ³å£°ææåºçå¼å¸¸ç±»æ´å°æç¸çï¼ | | 访é®ä¿®é¥°ç¬¦ | å¯ä¿®æ¹ | ä¸å®ä¸è½åæ´ä¸¥æ ¼çéå¶ï¼å¯ä»¥éä½éå¶ï¼ | | åçé¶æ®µ | ç¼è¯æ | è¿è¡æ | **æ¹æ³çéåè¦éµå¾ªâ两å两å°ä¸å¤§â**ï¼ä»¥ä¸å 容æå½èªãç¯ç Java 讲ä¹ãï¼[issue#892](https://github.com/Snailclimb/JavaGuide/issues/892) ï¼ï¼ - â两åâ峿¹æ³åç¸åãå½¢åå表ç¸åï¼ - â两å°âæçæ¯åç±»æ¹æ³è¿åå¼ç±»ååºæ¯ç¶ç±»æ¹æ³è¿åå¼ç±»åæ´å°æç¸çï¼åç±»æ¹æ³å£°ææåºçå¼å¸¸ç±»åºæ¯ç¶ç±»æ¹æ³å£°ææåºçå¼å¸¸ç±»æ´å°æç¸çï¼ - âä¸å¤§âæçæ¯åç±»æ¹æ³çè®¿é®æéåºæ¯ç¶ç±»æ¹æ³çè®¿é®æéæ´å¤§æç¸çã âï¸ å ³äº **éåçè¿åå¼ç±»å** è¿ééè¦é¢å¤å¤è¯´æä¸ä¸ï¼ä¸é¢ç表述ä¸å¤ªæ¸ æ°åç¡®ï¼å¦ææ¹æ³çè¿åç±»åæ¯ void ååºæ¬æ°æ®ç±»åï¼åè¿åå¼éåæ¶ä¸å¯ä¿®æ¹ã使¯å¦ææ¹æ³çè¿å弿¯å¼ç¨ç±»åï¼éåæ¶æ¯å¯ä»¥è¿å该å¼ç¨ç±»åçåç±»çã ```java public class Hero { public String name() { return "è¶ çº§è±é"; } } public class SuperMan extends Hero{ @Override public String name() { return "è¶ äºº"; } public Hero hero() { return new Hero(); } } public class SuperSuperMan extends SuperMan { public String name() { return "è¶ çº§è¶ çº§è±é"; } @Override public SuperMan hero() { return new SuperMan(); } } ``` #### ä»ä¹æ¯å¯åé¿åæ°ï¼ ä» Java5 å¼å§ï¼Java æ¯æå®ä¹å¯åé¿åæ°ï¼æè°å¯åé¿åæ°å°±æ¯å 许å¨è°ç¨æ¹æ³æ¶ä¼ å ¥ä¸å®é¿åº¦çåæ°ãå°±æ¯å¦ä¸é¢çè¿ä¸ª `printVariable` æ¹æ³å°±å¯ä»¥æ¥å 0 个æè å¤ä¸ªåæ°ã ```java public static void method1(String... args) { //...... } ``` å¦å¤ï¼å¯ååæ°åªè½ä½ä¸ºå½æ°çæåä¸ä¸ªåæ°ï¼ä½å ¶åé¢å¯ä»¥æä¹å¯ä»¥æ²¡æä»»ä½å ¶ä»åæ°ã ```java public static void method2(String arg1, String... args) { //...... } ``` **éå°æ¹æ³éè½½çæ åµæä¹åå¢ï¼ä¼ä¼å å¹é åºå®åæ°è¿æ¯å¯ååæ°çæ¹æ³å¢ï¼** çæ¡æ¯ä¼ä¼å å¹é åºå®åæ°çæ¹æ³ï¼å 为åºå®åæ°çæ¹æ³å¹é 度æ´é«ã æä»¬éè¿ä¸é¢è¿ä¸ªä¾åæ¥è¯æä¸ä¸ã ```java /** * 微信æ JavaGuide åå¤"é¢è¯çªå»"å³å¯å è´¹é¢å个人ååç Java é¢è¯æå * * @author Guideå¥ * @date 2021/12/13 16:52 **/ public class VariableLengthArgument { public static void printVariable(String... args) { for (String s : args) { System.out.println(s); } } public static void printVariable(String arg1, String arg2) { System.out.println(arg1 + arg2); } public static void main(String[] args) { printVariable("a", "b"); printVariable("a", "b", "c", "d"); } } ``` è¾åºï¼ ``` ab a b c d ``` å¦å¤ï¼Java çå¯ååæ°ç¼è¯åå®é ä¼è¢«è½¬æ¢æä¸ä¸ªæ°ç»ï¼æä»¬çç¼è¯åçæç `class`æä»¶å°±å¯ä»¥çåºæ¥äºã ```java public class VariableLengthArgument { public static void printVariable(String... args) { String[] var1 = args; int var2 = args.length; for(int var3 = 0; var3 < var2; ++var3) { String s = var1[var3]; System.out.println(s); } } // ...... } ``` ## åºæ¬æ°æ®ç±»å ### Java ä¸çå ç§åºæ¬æ°æ®ç±»åäºè§£ä¹ï¼ Java 䏿 8 ç§åºæ¬æ°æ®ç±»åï¼åå«ä¸ºï¼ - 6 ç§æ°åç±»åï¼ - 4 ç§æ´æ°åï¼`byte`ã`short`ã`int`ã`long` - 2 ç§æµ®ç¹åï¼`float`ã`double` - 1 ç§å符类åï¼`char` - 1 ç§å¸å°åï¼`boolean`ã è¿ 8 ç§åºæ¬æ°æ®ç±»åçé»è®¤å¼ä»¥åæå 空é´ç大å°å¦ä¸ï¼ | åºæ¬ç±»å | 使° | åè | é»è®¤å¼ | åå¼èå´ | | :-------- | :--- | :--- | :------ | ------------------------------------------ | | `byte` | 8 | 1 | 0 | -128 ~ 127 | | `short` | 16 | 2 | 0 | -32768 ~ 32767 | | `int` | 32 | 4 | 0 | -2147483648 ~ 2147483647 | | `long` | 64 | 8 | 0L | -9223372036854775808 ~ 9223372036854775807 | | `char` | 16 | 2 | 'u0000' | 0 ~ 65535 | | `float` | 32 | 4 | 0f | 1.4E-45 ~ 3.4028235E38 | | `double` | 64 | 8 | 0d | 4.9E-324 ~ 1.7976931348623157E308 | | `boolean` | 1 | | false | trueãfalse | å¯¹äº `boolean`ï¼å®æ¹ææ¡£æªæç¡®å®ä¹ï¼å®ä¾èµäº JVM ååçå ·ä½å®ç°ãé»è¾ä¸çè§£æ¯å ç¨ 1 ä½ï¼ä½æ¯å®é ä¸ä¼èèè®¡ç®æºé«æåå¨å ç´ ã å¦å¤ï¼Java çæ¯ç§åºæ¬ç±»åæå åå¨ç©ºé´ç大å°ä¸ä¼åå ¶ä»å¤§å¤æ°è¯è¨é£æ ·éæºå¨ç¡¬ä»¶æ¶æçååèååãè¿ç§æå åå¨ç©ºé´å¤§å°çä¸åæ§æ¯ Java ç¨åºæ¯ç¨å ¶ä»å¤§å¤æ°è¯è¨ç¼åçç¨åºæ´å ·å¯ç§»æ¤æ§çåå ä¹ä¸ï¼ãJava ç¼ç¨ææ³ã2.2 èææå°ï¼ã **注æï¼** 1. Java éä½¿ç¨ `long` ç±»åçæ°æ®ä¸å®è¦å¨æ°å¼åé¢å ä¸ **L**ï¼å¦åå°ä½ä¸ºæ´åè§£æã 2. `char a = 'h'`char :åå¼å·ï¼`String a = "hello"` :åå¼å·ã è¿å «ç§åºæ¬ç±»å齿坹åºçå è£ ç±»åå«ä¸ºï¼`Byte`ã`Short`ã`Integer`ã`Long`ã`Float`ã`Double`ã`Character`ã`Boolean` ã ### åºæ¬ç±»ååå è£ ç±»åçåºå«ï¼ - æååéå è£ ç±»åä¸èµå¼å°±æ¯ `null` ï¼èåºæ¬ç±»åæé»è®¤å¼ä¸ä¸æ¯ `null`ã - å è£ ç±»åå¯ç¨äºæ³åï¼èåºæ¬ç±»åä¸å¯ä»¥ã - åºæ¬æ°æ®ç±»åçå±é¨åéåæ¾å¨ Java èææºæ ä¸çå±é¨åé表ä¸ï¼åºæ¬æ°æ®ç±»åçæååéï¼æªè¢« `static` 修饰 ï¼åæ¾å¨ Java èææºçå ä¸ãå è£ ç±»åå±äºå¯¹è±¡ç±»åï¼æä»¬ç¥éå 乿æå¯¹è±¡å®ä¾é½åå¨äºå ä¸ã - ç¸æ¯äºå¯¹è±¡ç±»åï¼ åºæ¬æ°æ®ç±»åå ç¨ç空é´é常å°ã **为ä»ä¹è¯´æ¯å 乿æå¯¹è±¡å®ä¾å¢ï¼** è¿æ¯å 为 HotSpot èææºå¼å ¥äº JIT ä¼åä¹åï¼ä¼å¯¹å¯¹è±¡è¿è¡éé¸åæï¼å¦æåç°æä¸ä¸ªå¯¹è±¡å¹¶æ²¡æéé¸å°æ¹æ³å¤é¨ï¼é£ä¹å°±å¯è½éè¿æ éæ¿æ¢æ¥å®ç°æ ä¸åé ï¼èé¿å å ä¸åé å å â ï¸ æ³¨æ ï¼ **åºæ¬æ°æ®ç±»å忾卿 䏿¯ä¸ä¸ªå¸¸è§ç误åºï¼** åºæ¬æ°æ®ç±»åçæååéå¦ææ²¡æè¢« `static` 修饰çè¯ï¼ä¸å»ºè®®è¿ä¹ä½¿ç¨ï¼åºè¯¥è¦ä½¿ç¨åºæ¬æ°æ®ç±»å对åºçå è£ ç±»åï¼ï¼å°±åæ¾å¨å ä¸ã ```java class BasicTypeVar{ private int x; } ``` ### å è£ ç±»åçç¼åæºå¶äºè§£ä¹ï¼ Java åºæ¬æ°æ®ç±»åçå è£ ç±»åç大é¨åé½ç¨å°äºç¼åæºå¶æ¥æåæ§è½ã `Byte`,`Short`,`Integer`,`Long` è¿ 4 ç§å è£ ç±»é»è®¤åå»ºäºæ°å¼ **[-128ï¼127]** çç¸åºç±»åçç¼åæ°æ®ï¼`Character` åå»ºäºæ°å¼å¨ **[0,127]** èå´çç¼åæ°æ®ï¼`Boolean` ç´æ¥è¿å `True` or `False`ã **Integer ç¼åæºç ï¼** ```java public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); } private static class IntegerCache { static final int low = -128; static final int high; static { // high value may be configured by property int h = 127; } } ``` **`Character` ç¼åæºç :** ```java public static Character valueOf(char c) { if (c <= 127) { // must cache return CharacterCache.cache[(int)c]; } return new Character(c); } private static class CharacterCache { private CharacterCache(){} static final Character cache[] = new Character[127 + 1]; static { for (int i = 0; i < cache.length; i++) cache[i] = new Character((char)i); } } ``` **`Boolean` ç¼åæºç ï¼** ```java public static Boolean valueOf(boolean b) { return (b ? TRUE : FALSE); } ``` å¦æè¶ åºå¯¹åºèå´ä»ç¶ä¼å»å建æ°ç对象ï¼ç¼åçèå´åºé´ç大å°åªæ¯å¨æ§è½åèµæºä¹é´çæè¡¡ã ä¸¤ç§æµ®ç¹æ°ç±»åçå è£ ç±» `Float`,`Double` 并没æå®ç°ç¼åæºå¶ã ```java Integer i1 = 33; Integer i2 = 33; System.out.println(i1 == i2);// è¾åº true Float i11 = 333f; Float i22 = 333f; System.out.println(i11 == i22);// è¾åº false Double i3 = 1.2; Double i4 = 1.2; System.out.println(i3 == i4);// è¾åº false ``` ä¸é¢æä»¬æ¥çä¸ä¸é®é¢ãä¸é¢ç代ç çè¾åºç»ææ¯ `true` è¿æ¯ `false` å¢ï¼ ```java Integer i1 = 40; Integer i2 = new Integer(40); System.out.println(i1==i2); ``` `Integer i1=40` è¿ä¸è¡ä»£ç ä¼åçè£ ç®±ï¼ä¹å°±æ¯è¯´è¿è¡ä»£ç çä»·äº `Integer i1=Integer.valueOf(40)` ãå æ¤ï¼`i1` ç´æ¥ä½¿ç¨çæ¯ç¼åä¸ç对象ãè`Integer i2 = new Integer(40)` ä¼ç´æ¥å建æ°ç对象ã å æ¤ï¼çæ¡æ¯ `false` ãä½ ç对äºåï¼ è®°ä½ï¼**æææ´åå è£ ç±»å¯¹è±¡ä¹é´å¼çæ¯è¾ï¼å ¨é¨ä½¿ç¨ equals æ¹æ³æ¯è¾**ã  ### èªå¨è£ ç®±ä¸æç®±äºè§£åï¼åçæ¯ä»ä¹ï¼ **ä»ä¹æ¯èªå¨æè£ ç®±ï¼** - **è£ ç®±**ï¼å°åºæ¬ç±»åç¨å®ä»¬å¯¹åºçå¼ç¨ç±»åå è£ èµ·æ¥ï¼ - **æç®±**ï¼å°å è£ ç±»å转æ¢ä¸ºåºæ¬æ°æ®ç±»åï¼ ä¸¾ä¾ï¼ ```java Integer i = 10; //è£ ç®± int n = i; //æç®± ``` ä¸é¢è¿ä¸¤è¡ä»£ç 对åºçåèç ä¸ºï¼ ```java L1 LINENUMBER 8 L1 ALOAD 0 BIPUSH 10 INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer; PUTFIELD AutoBoxTest.i : Ljava/lang/Integer; L2 LINENUMBER 9 L2 ALOAD 0 ALOAD 0 GETFIELD AutoBoxTest.i : Ljava/lang/Integer; INVOKEVIRTUAL java/lang/Integer.intValue ()I PUTFIELD AutoBoxTest.n : I RETURN ``` ä»åèç ä¸ï¼æä»¬åç°è£ ç®±å ¶å®å°±æ¯è°ç¨äº å è£ ç±»ç`valueOf()`æ¹æ³ï¼æç®±å ¶å®å°±æ¯è°ç¨äº `xxxValue()`æ¹æ³ã å æ¤ï¼ - `Integer i = 10` çä»·äº `Integer i = Integer.valueOf(10)` - `int n = i` çä»·äº `int n = i.intValue()`; 注æï¼**妿é¢ç¹æè£ ç®±çè¯ï¼ä¹ä¼ä¸¥éå½±åç³»ç»çæ§è½ãæä»¬åºè¯¥å°½éé¿å ä¸å¿ è¦çæè£ ç®±æä½ã** ```java private static long sum() { // åºè¯¥ä½¿ç¨ long è䏿¯ Long Long sum = 0L; for (long i = 0; i <= Integer.MAX_VALUE; i++) sum += i; return sum; } ``` ### 为ä»ä¹æµ®ç¹æ°è¿ç®çæ¶åä¼æç²¾åº¦ä¸¢å¤±çé£é©ï¼ æµ®ç¹æ°è¿ç®ç²¾åº¦ä¸¢å¤±ä»£ç æ¼ç¤ºï¼ ```java float a = 2.0f - 1.9f; float b = 1.8f - 1.7f; System.out.println(a);// 0.100000024 System.out.println(b);// 0.099999905 System.out.println(a == b);// false ``` 为ä»ä¹ä¼åºç°è¿ä¸ªé®é¢å¢ï¼ è¿ä¸ªåè®¡ç®æºä¿åæµ®ç¹æ°çæºå¶æå¾å¤§å ³ç³»ãæä»¬ç¥éè®¡ç®æºæ¯äºè¿å¶çï¼èä¸è®¡ç®æºå¨è¡¨ç¤ºä¸ä¸ªæ°åæ¶ï¼å®½åº¦æ¯æéçï¼æ é循ç¯çå°æ°åå¨å¨è®¡ç®æºæ¶ï¼åªè½è¢«æªæï¼æä»¥å°±ä¼å¯¼è´å°æ°ç²¾åº¦åçæå¤±çæ åµãè¿ä¹å°±æ¯è§£éäºä¸ºä»ä¹æµ®ç¹æ°æ²¡æåæ³ç¨äºè¿å¶ç²¾ç¡®è¡¨ç¤ºã å°±æ¯å¦è¯´åè¿å¶ä¸ç 0.2 å°±æ²¡åæ³ç²¾ç¡®è½¬æ¢æäºè¿å¶å°æ°ï¼ ```java // 0.2 转æ¢ä¸ºäºè¿å¶æ°çè¿ç¨ä¸ºï¼ä¸æä¹ä»¥ 2ï¼ç´å°ä¸åå¨å°æ°ä¸ºæ¢ï¼ // å¨è¿ä¸ªè®¡ç®è¿ç¨ä¸ï¼å¾å°çæ´æ°é¨åä»ä¸å°ä¸æåå°±æ¯äºè¿å¶çç»æã 0.2 * 2 = 0.4 -> 0 0.4 * 2 = 0.8 -> 0 0.8 * 2 = 1.6 -> 1 0.6 * 2 = 1.2 -> 1 0.2 * 2 = 0.4 -> 0ï¼åç循ç¯ï¼ ... ``` å ³äºæµ®ç¹æ°çæ´å¤å 容ï¼å»ºè®®çä¸ä¸[è®¡ç®æºç³»ç»åºç¡ï¼åï¼æµ®ç¹æ°](http://kaito-kidd.com/2018/08/08/computer-system-float-point/)è¿ç¯æç« ã ### å¦ä½è§£å³æµ®ç¹æ°è¿ç®ç精度丢失é®é¢ï¼ `BigDecimal` å¯ä»¥å®ç°å¯¹æµ®ç¹æ°çè¿ç®ï¼ä¸ä¼é æç²¾åº¦ä¸¢å¤±ãé常æ åµä¸ï¼å¤§é¨åéè¦æµ®ç¹æ°ç²¾ç¡®è¿ç®ç»æçä¸å¡åºæ¯ï¼æ¯å¦æ¶åå°é±çåºæ¯ï¼é½æ¯éè¿ `BigDecimal` æ¥åçã ```java BigDecimal a = new BigDecimal("1.0"); BigDecimal b = new BigDecimal("0.9"); BigDecimal c = new BigDecimal("0.8"); BigDecimal x = a.subtract(b); BigDecimal y = b.subtract(c); System.out.println(x); /* 0.1 */ System.out.println(y); /* 0.1 */ System.out.println(Objects.equals(x, y)); /* true */ ``` å ³äº `BigDecimal` ç详ç»ä»ç»ï¼å¯ä»¥ççæåçè¿ç¯æç« ï¼[BigDecimal 详解](./bigdecimal.md)ã ### è¶ è¿ long æ´åçæ°æ®åºè¯¥å¦ä½è¡¨ç¤ºï¼ åºæ¬æ°å¼ç±»å齿ä¸ä¸ªè¡¨è¾¾èå´ï¼å¦æè¶ è¿è¿ä¸ªèå´å°±ä¼ææ°å¼æº¢åºçé£é©ã å¨ Java ä¸ï¼64 ä½ long æ´åæ¯æå¤§çæ´æ°ç±»åã ```java long l = Long.MAX_VALUE; System.out.println(l + 1); // -9223372036854775808 System.out.println(l + 1 == Long.MIN_VALUE); // true ``` `BigInteger` å é¨ä½¿ç¨ `int[]` æ°ç»æ¥åå¨ä»»æå¤§å°çæ´å½¢æ°æ®ã ç¸å¯¹äºå¸¸è§æ´æ°ç±»åçè¿ç®æ¥è¯´ï¼`BigInteger` è¿ç®çæçä¼ç¸å¯¹è¾ä½ã ## åè - What is the difference between JDK and JRE?ï¼https://stackoverflow.com/questions/1906445/what-is-the-difference-between-jdk-and-jre - Oracle vs OpenJDKï¼https://www.educba.com/oracle-vs-openjdk/ - Differences between Oracle JDK and OpenJDKï¼https://stackoverflow.com/questions/22358071/differences-between-oracle-jdk-and-openjdk - å½»åºå¼æJavaçç§»ä½æä½ç¬¦ï¼https://juejin.cn/post/6844904025880526861