# Javaåºç¡é¢è¯é¢
å¤§å®¶å¥½ï¼ææ¯å°æã
Java åºç¡è¿åï¼å¨é¢è¯éçå°ä½æç¹ç¹æ®ââå®ä¸å MySQLãRedis 飿 ·æ¯æ¬¡é½æ¯æ ¸å¿èç¹ï¼ä½å¦æä½ çå¾ä¸å¥½ï¼ä¼ç»é¢è¯å®çä¸"åºæ¬å䏿å®"çå°è±¡ï¼è¿ä¸ªä»£ä»·å ¶å®æºå¤§çãå¾å¤äººç¨ Java åäºå¥½å 年代ç ï¼å´è¯´ä¸æ¸ æ¥ JVM å JDK çå ³ç³»ãint å Integer çåºå«ã为ä»ä¹è¦éå hashCodeï¼è¿äºé®é¢çèµ·æ¥ç®åï¼ä½çèµ·æ¥å¾å®¹æé²é¦ ã
è¿ç¯æç« æ´çäº Java åºç¡é¢è¯ä¸æå¸¸è¢«é®å°çç¥è¯ç¹ï¼æ¶µçæ ¸å¿æ¦å¿µãæ°æ®ç±»åãé¢å对象ãå ³é®åãåå°ã注解ãå¼å¸¸ãJava 8 æ°ç¹æ§ãIO çå 容ï¼è¦çæ¯è¾å ¨é¢ãå 容ååçè§£ï¼ä¸æ¯è®©ä½ èå®ä¹ï¼èæ¯å¸®ä½ ææ¸ æ¥"è¿ä¸ªä¸è¥¿å¨ Java é为ä»ä¹æ¯è¿æ ·è®¾è®¡ç"ã
æå åå¨é¢è¯éåºç°é¢çç¹å«é«ï¼å»ºè®®éç¹è±æ¶é´ï¼
- é¢å对象ä¸å¤§ç¹æ§ï¼å°è£ ãç»§æ¿ã夿ï¼å°¤å ¶æ¯å¤æçå ç§ä½ç°å½¢å¼ãéè½½åéåçåºå«ï¼è¿ç±»é¢çèµ·æ¥åºç¡ï¼ä½å¾å¤äººçå¾å¾æµ ï¼å®¹æè¢«è¿½é®å°å壿 è¨ã
- int å Integerï¼ä¸ºä»ä¹è¦æå è£ ç±»ãèªå¨è£ ç®±æç®±çåçãInteger çç¼åæºå¶ï¼-128 å° 127ï¼ï¼è¿æ¡çº¿é®å¾å¾é¢ç¹ï¼èä¸å¾å®¹æåºåã
- StringãStringBufferãStringBuilderï¼ä¸è çåºå«åéç¨åºæ¯ï¼ä»¥å String ä¸å¯åæ§çåçï¼è¿æ¯ä¸éèé¢ï¼ä½æ¯æ¬¡è¿æ¯ä¼é®ã
- equals å hashCodeï¼ä¸ºä»ä¹è¦é å¥éåãä¸éå伿ä»ä¹é®é¢ï¼å¨ HashMap å HashSet éçå½±åï¼è¿ä¸ªå¾å¤äººåªç¥éç»è®ºï¼çä¸åºèåçåå ã
- Java 8 æ°ç¹æ§ï¼Lambda 表达å¼ãStream APIãOptionalï¼è¿äºå¨å®é å¼åéç¨å¾å¾å¤ï¼é¢è¯éä¹ç»å¸¸é®ã
- åå°æºå¶ï¼æ¯ä»ä¹ãæä¹ç¨ãå®é åºç¨å¨åªéï¼Spring ç IOC å°±æ¯å ¸åï¼ï¼è¿åçè§£æ¸ æ¥äºå¯¹åé¢å¦æ¡æ¶åç徿叮å©ã
å¦æä½ æ¯ç¬¬ä¸æ¬¡ç³»ç»åå¤ Java åºç¡ï¼å»ºè®®å æé¢åå¯¹è±¡åæ°æ®ç±»åææ¸ æ¥ï¼åå»çåå°ã注解è¿äºç¨å¾®æ·±ä¸ç¹çå å®¹ï¼æ´ä½ç解起æ¥ä¼é¡ºå¾å¤ã
# æ¦å¿µ
# 说ä¸ä¸Javaçç¹ç¹
ä¸»è¦æä»¥ä¸çç¹ç¹ï¼
- 平尿 å ³æ§ï¼Javaçâç¼å䏿¬¡ï¼è¿è¡æ å¤ä¸å¨âå²å¦æ¯å ¶æå¤§çç¹ç¹ä¹ä¸ãJavaç¼è¯å¨å°æºä»£ç ç¼è¯æåèç ï¼bytecodeï¼ï¼è¯¥åèç å¯ä»¥å¨ä»»ä½å®è£ äºJavaèææºï¼JVMï¼çç³»ç»ä¸è¿è¡ã
- é¢å对象ï¼Javaæ¯ä¸é¨ä¸¥æ ¼çé¢å对象ç¼ç¨è¯è¨ï¼å ä¹ä¸å齿¯å¯¹è±¡ãé¢å对象ç¼ç¨ï¼OOPï¼ç¹æ§ä½¿å¾ä»£ç æ´æäºç»´æ¤åéç¨ï¼å æ¬ç±»ï¼classï¼ã对象ï¼objectï¼ãç»§æ¿ï¼inheritanceï¼ã夿ï¼polymorphismï¼ãæ½è±¡ï¼abstractionï¼åå°è£ ï¼encapsulationï¼ã
- å å管çï¼Javaæèªå·±çåå¾åæ¶æºå¶ï¼èªå¨ç®¡çå åååæ¶ä¸å使ç¨ç对象ãè¿æ ·ï¼å¼åè ä¸éè¦æå¨ç®¡çå åï¼ä»èåå°å åæ³æ¼åå ¶ä»å åç¸å ³çé®é¢ã
# Java çä¼å¿åå£å¿æ¯ä»ä¹ï¼
é¦å ï¼Javaçä¼å¿ï¼æè®°å¾è·¨å¹³å°åºè¯¥æ¯ä¸ä¸ªå¤§ç¹ï¼å 为JVMçåå¨ï¼ä¸æ¬¡ç¼åå°å¤è¿è¡ãç¶åé¢å对象ï¼è¿ä¸ªå¯è½ä¹æ¯ä¼å¿ï¼ä¸è¿ç°å¨å¾å¤è¯è¨é½æ¯æé¢å对象ï¼ä½æ¯Javaç设计ä»ä¸å¼å§å°±æ¯OOPçãè¿æå¼ºå¤§ççæç³»ç»ï¼æ¯å¦Springæ¡æ¶ï¼Hibernateï¼åç§åºåå·¥å ·ï¼ç¤¾åºæ¯æå¤§ï¼ä¼ä¸åºç¨å¹¿æ³ãå¦å¤ï¼å åç®¡çæ¹é¢ï¼èªå¨åå¾åæ¶æºå¶ï¼åå°äºå åæ³æ¼çé®é¢ï¼å¯¹å¼åè å好ãè¿æå¤çº¿ç¨æ¯æï¼å ç½®ççº¿ç¨æºå¶ï¼æ¹ä¾¿å¹¶åç¼ç¨ãå®å ¨æ§æ¹é¢ï¼Javaæå®å ¨æ¨¡åï¼æ¯å¦æ²ç®±æºå¶ï¼éåç½ç»ç¯å¢ãè¿æç¨³å®æ§ï¼ä¼ä¸çº§åºç¨é¿æä½¿ç¨ï¼çæ¬æ´æ°ä¹æ¯è¾æ³¨éååå ¼å®¹ã
å£å¿çè¯ï¼æ§è½å¯è½æ¯ä¸ä¸ªï¼è½ç¶JVMä¼åäºå¾å¤ï¼ä½ç¸æ¯C++æè Rustè¿ç§åçç¼è¯è¯è¨ï¼è¿æ¯æä¸å®å¼éãç¹å«æ¯å¯å¨æ¶é´ï¼æ¯å¦å¾®æå¡åºæ¯ä¸ï¼å¯è½ä¸å¦Goä¹ç±»çå¿«ãè¯æ³ç¹çï¼æ¯å¦æ ·æ¿ä»£ç å¤ï¼ä¹å没ælambdaçæ¶åæ´éº»ç¦ï¼ç°å¨æäºä½æ¯èµ·Pythonè¿æ¯ä¸å¤ç®æ´ãå åæ¶èï¼JVMæ¬èº«å å åï¼å¯¹äºèµæºæéçç¯å¢å¯è½ä¸å¤ªå好ãè¿æé¢å对象è¿äºä¸¥æ ¼ï¼ææ¶ååç®åç¨åºåè麻ç¦ï¼è½ç¶Java8å¼å ¥äºå½æ°å¼ç¼ç¨ï¼ä½ä¸å¦å ¶ä»è¯è¨èªç¶ãè¿æå¼åæçï¼ç¸æ¯å¨æè¯è¨å¦Pythonï¼Javaéè¦æ´å¤ä»£ç ï¼ç¼è¯è¿ç¨ä¹å¯è½ææ ¢å¼åèå¥ã
# Java为ä»ä¹æ¯è·¨å¹³å°çï¼
Java è½æ¯æè·¨å¹³å°ï¼ä¸»è¦ä¾èµäº JVM å ³ç³»æ¯è¾å¤§ã
JVM乿¯ä¸ä¸ªè½¯ä»¶ï¼ä¸åç平尿ä¸åççæ¬ãæä»¬ç¼åçJavaæºç ï¼ç¼è¯åä¼çæä¸ç§ .class æä»¶ï¼ç§°ä¸ºåèç æä»¶ãJavaèææºå°±æ¯è´è´£å°åèç æä»¶ç¿»è¯æç¹å®å¹³å°ä¸çæºå¨ç ç¶åè¿è¡ãä¹å°±æ¯è¯´ï¼åªè¦å¨ä¸åå¹³å°ä¸å®è£ 对åºçJVMï¼å°±å¯ä»¥è¿è¡åèç æä»¶ï¼è¿è¡æä»¬ç¼åçJavaç¨åºã
èè¿ä¸ªè¿ç¨ä¸ï¼æä»¬ç¼åçJavaç¨åºæ²¡æå任使¹åï¼ä» ä» æ¯éè¿JVMè¿ä¸âä¸é´å±âï¼å°±è½å¨ä¸åå¹³å°ä¸è¿è¡ï¼çæ£å®ç°äºâ䏿¬¡ç¼è¯ï¼å°å¤è¿è¡âçç®çã
JVMæ¯ä¸ä¸ªâæ¡¥æ¢âï¼æ¯ä¸ä¸ªâä¸é´ä»¶âï¼æ¯å®ç°è·¨å¹³å°çå ³é®ï¼Java代ç é¦å 被ç¼è¯æåèç æä»¶ï¼åç±JVMå°åèç æä»¶ç¿»è¯ææºå¨è¯è¨ï¼ä»èè¾¾å°è¿è¡Javaç¨åºçç®çã
ç¼è¯çç»æä¸æ¯çææºå¨ç ï¼èæ¯çæåèç ï¼åèç ä¸è½ç´æ¥è¿è¡ï¼å¿ é¡»éè¿JVMç¿»è¯ææºå¨ç æè½è¿è¡ãä¸åå¹³å°ä¸ç¼è¯çæçåèç æ¯ä¸æ ·çï¼ä½æ¯ç±JVMç¿»è¯æçæºå¨ç å´ä¸ä¸æ ·ã
æä»¥ï¼è¿è¡Javaç¨åºå¿ é¡»æJVMçæ¯æï¼å 为ç¼è¯çç»æä¸æ¯æºå¨ç ï¼å¿ é¡»è¦ç»è¿JVMç忬¡ç¿»è¯æè½æ§è¡ãå³ä½¿ä½ å°Javaç¨åºæå æå¯æ§è¡æä»¶ï¼ä¾å¦ .exeï¼ï¼ä»ç¶éè¦JVMçæ¯æã
跨平å°çæ¯Javaç¨åºï¼ä¸æ¯JVMãJVMæ¯ç¨C/C++å¼åçï¼æ¯ç¼è¯åçæºå¨ç ï¼ä¸è½è·¨å¹³å°ï¼ä¸åå¹³å°ä¸éè¦å®è£ ä¸åçæ¬çJVMã

# JVMãJDKãJREä¸è å ³ç³»ï¼

å®ä»¬ä¹é´çå ³ç³»å¦ä¸ï¼
- JVMæ¯Javaèææºï¼æ¯Javaç¨åºè¿è¡çç¯å¢ãå®è´è´£å°Javaåèç ï¼ç±Javaç¼è¯å¨çæï¼è§£éæç¼è¯ææºå¨ç ï¼å¹¶æ§è¡ç¨åºãJVMæä¾äºå å管çãåå¾åæ¶ãå®å ¨æ§çåè½ï¼ä½¿å¾Javaç¨åºå ·å¤è·¨å¹³å°æ§ã
- JDKæ¯Javaå¼åå·¥å ·å ï¼æ¯å¼åJavaç¨åºæéçå·¥å ·éåãå®å å«äºJVMãç¼è¯å¨ï¼javacï¼ãè°è¯å¨ï¼jdbï¼çå¼åå·¥å ·ï¼ä»¥åä¸ç³»åçç±»åºï¼å¦Javaæ ååºåå¼åå·¥å ·åºï¼ãJDKæä¾äºå¼åãç¼è¯ãè°è¯åè¿è¡Javaç¨åºæéçå ¨é¨å·¥å ·åç¯å¢ã
- JREæ¯Javaè¿è¡æ¶ç¯å¢ï¼æ¯Javaç¨åºè¿è¡æéçæå°ç¯å¢ãå®å å«äºJVMåä¸ç»Javaç±»åºï¼ç¨äºæ¯æJavaç¨åºçæ§è¡ãJREä¸å å«å¼åå·¥å ·ï¼åªæä¾Javaç¨åºè¿è¡æéçè¿è¡ç¯å¢ã
# JVM å Java æå¥åºå«ï¼
Javaæ¯è¯è¨ï¼JVMæ¯å¹³å°ï¼ä¸ä¸ªæ¯å代ç çå·¥å ·ï¼ä¸ä¸ªæ¯è·ä»£ç çç¯å¢ï¼ä¸¤è åå·¥ä¸åä½ç¸äºé åã
ç®åæ¥è¯´ï¼Javaæ¯ä¸é¨ç¼ç¨è¯è¨ï¼å°±æ¯æä»¬å¹³æ¶å代ç ç¨çé£ä¸ªè¯è¨ï¼åStringãListè¿äºé½æ¯Javaè¯è¨æä¾çãèJVMå¢ï¼å ¨ç§°æ¯Javaèææºï¼å®æ¯ç¨æ¥è¿è¡Javaç¨åºçä¸ä¸ªå¹³å°æè 说è¿è¡ç¯å¢ã

æä¸ªæ¯æ¹ï¼Java就忝æä»¬åæç« ç¨ç䏿ï¼èJVM就忝è½å¤é 读åçè§£è¿ç¯æç« ç人ãæä»¬ç¨Javaè¯è¨å代ç ï¼ä½ä»£ç ä¸è½ç´æ¥è¿è¡ï¼å¾å éè¿ç¼è¯å¨ç¼è¯æåèç ï¼ä¹å°±æ¯.classæä»¶ï¼ç¶åJVMåæè¿äºåèç ç¿»è¯ææºå¨è½æçæä»¤å»æ§è¡ã
è¿éé¢è¿æä¸ä¸ªå¾å ³é®çç¹ï¼å°±æ¯Javaè½å¤è·¨å¹³å°ï¼ä¹å°±æ¯"䏿¬¡ç¼è¯ï¼å°å¤è¿è¡"ãè¿ä¸ªè·¨å¹³å°è½åå ¶å®ä¸»è¦æ¯JVMæä¾çãæä»¬å好çJava代ç ç¼è¯æåèç åï¼è¿ä»½åèç å¯ä»¥å¨WindowsçJVMä¸è¿è¡ï¼ä¹å¯ä»¥å¨LinuxçJVMä¸è¿è¡ï¼è¿å¯ä»¥å¨Macä¸è¿è¡ãè½ç¶åºå±æä½ç³»ç»ä¸ä¸æ ·ï¼ä½å 为æJVMè¿ä¸å±ï¼å®å¸®æä»¬å±è½äºè¿äºå·®å¼ï¼å好äºéé ãæä»¥æ¬è´¨ä¸æ¯JVMä¾èµå¹³å°ï¼ä½Javaåèç ä¸ä¾èµå¹³å°ã

åç®å说说å®ä»¬åå ¶ä»æ¦å¿µçå ³ç³»ãJDKæ¯å¼åå·¥å ·å ï¼é颿ç¼è¯å¨ãè°è¯å·¥å ·è¿äºï¼ä¹å å«äºJREãJREæ¯è¿è¡ç¯å¢ï¼å å«äºJVMåJavaçæ ¸å¿ç±»åºãæä»¥å ³ç³»å°±æ¯JDK大äºJRE大äºJVMï¼ä¸ä¸ªæ¯ä¸ä¸ªå°ãå¦æä½ è¦å¼åJavaç¨åºå°±å¾è£ JDKï¼å¦æåªæ¯è¿è¡å«äººå好çç¨åºï¼è£ 个JREå°±å¤äºã

è¿æä¸ç¹ï¼JVMå ¶å®ä¸åªè½è·Javaãå 为JVMæ§è¡çæ¯åèç ï¼æä»¥åKotlinãScalaè¿äºè¯è¨ï¼è½ç¶è¯æ³è·Javaä¸ä¸æ ·ï¼ä½ç¼è¯å乿¯çæJavaåèç ï¼ä¸æ ·å¯ä»¥å¨JVMä¸è¿è¡ãæä»¥JVMç°å¨å·²ç»ä¸åªæ¯Javaçä¸å±äºï¼èæ¯æ´ä¸ªJVMè¯è¨çæçåºç¡å¹³å°ã
# 为ä»ä¹Javaè§£éåç¼è¯é½æï¼
é¦å å¨Javaç»è¿ç¼è¯ä¹åçæåèç æä»¶ï¼æ¥ä¸æ¥è¿å ¥JVMä¸ï¼å°±æä¸¤ä¸ªæ¥éª¤ç¼è¯åè§£éã å¦ä¸å¾ï¼

ç¼è¯æ§ï¼
- Javaæºä»£ç é¦å 被ç¼è¯æåèç ï¼JIT 伿ç¼è¯è¿çæºå¨ç ä¿åèµ·æ¥,以å¤ä¸æ¬¡ä½¿ç¨ã
è§£éæ§ï¼
- JVMä¸ä¸ä¸ªæ¹æ³è°ç¨è®¡æ°å¨ï¼å½ç´¯è®¡è®¡æ°å¤§äºä¸å®å¼çæ¶åï¼å°±ä½¿ç¨JITè¿è¡ç¼è¯çææºå¨ç æä»¶ãå¦åå°±æ¯ç¨è§£éå¨è¿è¡è§£éæ§è¡ï¼ç¶ååèç 乿¯ç»è¿è§£éå¨è¿è¡è§£éè¿è¡çã
æä»¥Javaæ¢æ¯ç¼è¯å乿¯è§£éæ§è¯è¨ï¼é»è®¤éç¨çæ¯è§£éå¨åç¼è¯å¨æ··åçæ¨¡å¼ã
# jvmæ¯ä»ä¹
JVMæ¯ java èææºï¼ä¸»è¦å·¥ä½æ¯è§£éèªå·±çæä»¤éï¼å³åèç ï¼å¹¶æ å°å°æ¬å°çCPUæä»¤éåOSçç³»ç»è°ç¨ã
JVMå±è½äºä¸æä½ç³»ç»å¹³å°ç¸å ³çä¿¡æ¯ï¼ä½¿å¾Javaç¨åºåªéè¦çæå¨Javaèææºä¸è¿è¡çç®æ 代ç ï¼åèç ï¼ï¼å°±å¯å¨å¤ç§å¹³å°ä¸ä¸å ä¿®æ¹çè¿è¡ï¼è¿ä¹æ¯Javaè½å¤â䏿¬¡ç¼è¯ï¼å°å¤è¿è¡çâåå ã
# ç¼è¯åè¯è¨åè§£éåè¯è¨çåºå«ï¼
ç¼è¯åè¯è¨åè§£éåè¯è¨çåºå«å¨äºï¼
- ç¼è¯åè¯è¨ï¼å¨ç¨åºæ§è¡ä¹åï¼æ´ä¸ªæºä»£ç ä¼è¢«ç¼è¯ææºå¨ç æè åèç ï¼çæå¯æ§è¡æä»¶ãæ§è¡æ¶ç´æ¥è¿è¡ç¼è¯åç代ç ï¼é度快ï¼ä½è·¨å¹³å°æ§è¾å·®ã
- è§£éåè¯è¨ï¼å¨ç¨åºæ§è¡æ¶ï¼éè¡è§£éæ§è¡æºä»£ç ï¼ä¸çæç¬ç«ç坿§è¡æä»¶ãé常ç±è§£éå¨å¨æè§£éå¹¶æ§è¡ä»£ç ï¼è·¨å¹³å°æ§å¥½ï¼ä½æ§è¡é度ç¸å¯¹è¾æ ¢ã
- å ¸åçç¼è¯åè¯è¨å¦CãC++ï¼å ¸åçè§£éåè¯è¨å¦PythonãJavaScriptã
# PythonåJavaåºå«æ¯ä»ä¹ï¼
- Javaæ¯ä¸ç§å·²ç¼è¯çç¼ç¨è¯è¨ï¼Javaç¼è¯å¨å°æºä»£ç ç¼è¯ä¸ºåèç ï¼èåèç åç±Javaèææºæ§è¡
- pythonæ¯ä¸ç§è§£éè¯è¨ï¼ç¿»è¯æ¶ä¼å¨æ§è¡ç¨åºçåæ¶è¿è¡ç¿»è¯ã
# å¼ä¼ éåå¼ç¨ä¼ éçåºå«ï¼
å¨ Java ä¸ï¼åæ°ä¼ éåªæå¼ä¼ éä¸ç§æ¹å¼ï¼ä¸åå¨çæ£ç âå¼ç¨ä¼ éâãä½å¾å¤äººä¼æ··æ·è¿ä¸¤ä¸ªæ¦å¿µï¼æ ¸å¿åºå«å¨äºä¼ éçæ¯ âå¼ç坿¬â è¿æ¯ âå¼ç¨ç坿¬âã
å¼ä¼ éï¼Pass by Valueï¼ãä¼ éçæ¯å®é
å¼ç坿¬ï¼éç¨äºåºæ¬æ°æ®ç±»åï¼å¦ intãchar çï¼ï¼ä¿®æ¹æ¹æ³å
ç忰坿¬ï¼ä¸ä¼å½±åååéçå¼ãä¾åï¼
public static void main(String[] args) {
int num = 10;
changeValue(num);
System.out.println(num); // è¾åº 10ï¼ååéæªè¢«ä¿®æ¹ï¼
}
public static void changeValue(int a) {
a = 20; // ä»
ä¿®æ¹å¯æ¬
}
å¼ç¨ä¼ éçè¯¯è§£ï¼æ¬è´¨ä»æ¯å¼ä¼ éï¼ã对äºå¯¹è±¡ï¼å¼ç¨ç±»åï¼ï¼ä¼ éçæ¯å¯¹è±¡å¼ç¨ç坿¬ï¼èé对象æ¬èº«ï¼ã
两个å¼ç¨ï¼åå¼ç¨å坿¬ï¼æååä¸ä¸ªå¯¹è±¡ï¼å æ¤éè¿å¯æ¬ä¿®æ¹å¯¹è±¡å 鍿°æ®ï¼ä¼å½±åå对象ãä½å¦æä¿®æ¹å¯æ¬çæåï¼å¦éæ°èµå¼ï¼ï¼ä¸ä¼å½±ååå¼ç¨çæåã示ä¾ï¼
public class Person {
String name;
Person(String name) { this.name = name; }
}
public static void main(String[] args) {
Person p = new Person("Alice");
changeName(p);
System.out.println(p.name); // è¾åº "Bob"ï¼å¯¹è±¡å
é¨è¢«ä¿®æ¹ï¼
changeReference(p);
System.out.println(p.name); // ä»è¾åº "Bob"ï¼åå¼ç¨æåæªåï¼
}
// ä¿®æ¹å¯¹è±¡å
鍿°æ®
public static void changeName(Person obj) {
obj.name = "Bob"; // 坿¬ååå¼ç¨æååä¸ä¸ªå¯¹è±¡
}
// ä¿®æ¹å¯æ¬çæåï¼ä¸å½±ååå¼ç¨ï¼
public static void changeReference(Person obj) {
obj = new Person("Charlie"); // 坿¬æåæ°å¯¹è±¡ï¼åå¼ç¨ä»æåæ§å¯¹è±¡
}
ç®åæ¥è¯´ï¼Java 䏿æåæ°ä¼ é齿¯å¼ä¼ éï¼
- åºæ¬ç±»åä¼ é âå¼ç坿¬âï¼ä¿®æ¹å¯æ¬ä¸å½±ååå¼ã
- å¼ç¨ç±»åä¼ é âå¼ç¨ç坿¬âï¼éè¿å¯æ¬å¯ä¿®æ¹å¯¹è±¡å 容ï¼ä½æ æ³æ¹ååå¼ç¨çæåã
# æ°æ®ç±»å
# å «ç§åºæ¬çæ°æ®ç±»å
Javaæ¯ææ°æ®ç±»ååä¸ºä¸¤ç±»ï¼ åºæ¬æ°æ®ç±»ååå¼ç¨æ°æ®ç±»åã
åºæ¬æ°æ®ç±»åå ±æ8ç§ï¼å¯ä»¥å为ä¸ç±»ï¼
- æ°å¼åï¼æ´æ°ç±»åï¼byteãshortãintãlongï¼åæµ®ç¹ç±»åï¼floatãdoubleï¼
- å符åï¼char
- å¸å°åï¼boolean

8ç§åºæ¬æ°æ®ç±»åçé»è®¤å¼ã使°ãåå¼èå´ï¼å¦ä¸è¡¨æç¤ºï¼
| æ°æ®ç±»å | å ç¨å¤§å°ï¼åèï¼ | 使° | åå¼èå´ | é»è®¤å¼ | æè¿° |
|---|---|---|---|---|---|
byte | 1 | 8 | -128ï¼-2^7ï¼ å° 127ï¼2^7 - 1ï¼ | 0 | æ¯æå°çæ´æ°ç±»åï¼éåç¨äºèçå åï¼ä¾å¦å¨å¤çæä»¶æç½ç»æµæ¶åå¨å°èå´æ´æ°æ°æ®ã |
short | 2 | 16 | -32768ï¼-2^15ï¼ å° 32767ï¼2^15 - 1ï¼ | 0 | è¾å°ä½¿ç¨ï¼é常ç¨äºå¨éè¦èçå å䏿°å¼èå´å¨è¯¥åºé´çåºæ¯ã |
int | 4 | 32 | -2147483648ï¼-2^31ï¼ å° 2147483647ï¼2^31 - 1ï¼ | 0 | æå¸¸ç¨çæ´æ°ç±»åï¼å¯æ»¡è¶³å¤§å¤æ°æ¥å¸¸ç¼ç¨ä¸æ´æ°è®¡ç®çéæ±ã |
long | 8 | 64 | -9223372036854775808ï¼-2^63ï¼ å° 9223372036854775807ï¼2^63 - 1ï¼ | 0L | ç¨äºè¡¨ç¤ºéå¸¸å¤§çæ´æ°ï¼å½ int ç±»åæ æ³æ»¡è¶³éæ±æ¶ä½¿ç¨ï¼å®ä¹æ¶æ°å¼åéå L æ lã |
float | 4 | 32 | 1.4E - 45 å° 3.4028235E38 | 0.0f | åç²¾åº¦æµ®ç¹æ°ï¼ç¨äºè¡¨ç¤ºå°æ°ï¼ç²¾åº¦ç¸å¯¹è¾ä½ï¼å®ä¹æ¶æ°å¼åéå F æ fã |
double | 8 | 64 | 4.9E - 324 å° 1.7976931348623157E308 | 0.0d | åç²¾åº¦æµ®ç¹æ°ï¼ç²¾åº¦æ¯ float é«ï¼æ¯ Java ä¸è¡¨ç¤ºå°æ°çé»è®¤ç±»åã |
char | 2 | 16 | '\u0000'ï¼0ï¼ å° '\uffff'ï¼65535ï¼ | '\u0000' | ç¨äºè¡¨ç¤ºå个å符ï¼éç¨ Unicode ç¼ç ï¼å¯è¡¨ç¤ºåç§è¯è¨çå符ã |
boolean | æ æç¡®åè大å°ï¼çè®ºä¸ 1 ä½ï¼ | æ æç¡®ä½æ° | true æ false | false | ç¨äºé»è¾å¤æï¼åªæä¸¤ä¸ªåå¼ï¼å¸¸ç¨äºæ¡ä»¶å¤æåå¾ªç¯æ§å¶çé»è¾åºæ¯ã |
FloatåDoubleçæå°å¼åæå¤§å¼é½æ¯ä»¥ç§å¦è®°æ°æ³çå½¢å¼è¾åºçï¼ç»å°¾çâE+æ°åâ表示Eä¹åçæ°åè¦ä¹ä»¥10çå¤å°åãæ¯å¦3.14E3å°±æ¯3.14Ã1000=3140ï¼3.14E-3å°±æ¯3.14/1000=0.00314ã
注æä¸ä¸å ç¹ï¼
- Javaå «ç§åºæ¬æ°æ®ç±»åçåèæ°ï¼1åè(byteãboolean)ã 2åè(shortãchar)ã4åè(intãfloat)ã8åè(longãdouble)
- æµ®ç¹æ°çé»è®¤ç±»å为doubleï¼å¦æéè¦å£°æä¸ä¸ªå¸¸é为floatåï¼åå¿ é¡»è¦å¨æ«å°¾å ä¸fæFï¼
- æ´æ°çé»è®¤ç±»å为intï¼å£°æLongå卿«å°¾å ä¸læè Lï¼
- å «ç§åºæ¬æ°æ®ç±»åçå è£ ç±»ï¼é¤äºcharçæ¯Characterãintç±»åçæ¯Integerï¼å ¶ä»é½æ¯é¦åæ¯å¤§å
- charç±»åæ¯æ 符å·çï¼ä¸è½ä¸ºè´ï¼æä»¥æ¯0å¼å§ç
# intålongæ¯å¤å°ä½ï¼å¤å°åèçï¼
intç±»åæ¯ 32 ä½ï¼bitï¼ï¼å 4 个åèï¼byteï¼ï¼int æ¯æç¬¦å·æ´æ°ç±»åï¼å ¶åå¼èå´æ¯ä» -2^31 å° 2^31-1 ãä¾å¦ï¼å¨ä¸ä¸ªç®åç计æ°å¨ç¨åºä¸ï¼å¦æä½¿ç¨intç±»åæ¥åå¨è®¡æ°å¼ï¼å®å¯ä»¥è¡¨ç¤ºçæå¤§æ£æ°æ¯ 2,147,483,647ãå¦æè®¡æ°å¼è¶ è¿è¿ä¸ªèå´ï¼å°±ä¼åçæº¢åºï¼å¯¼è´ç»æä¸ç¬¦å颿ãlongç±»åæ¯ 64 ä½ï¼å 8 个åèï¼longç±»å乿¯æç¬¦å·æ´æ°ç±»åï¼å®çåå¼èå´æ¯ä» -2^63 å° 2^63 -1 ï¼å¨å¤çè¾å¤§çæ´æ°æ°å¼æ¶ï¼æintç±»åçåå¼èå´ä¸å¤ï¼å°±éè¦ä½¿ç¨longç±»åãä¾å¦ï¼å¨ä¸ä¸ªæä»¶ä¼ è¾ç¨åºä¸ï¼æä»¶ç大å°å¯è½ä¼å¾å¤§ï¼ä½¿ç¨intç±»åå¯è½æ æ³å确表示ï¼èlongç±»åå°±å¯ä»¥å¾å¥½å°å¤çè¿ç§æ åµã
# longåintå¯ä»¥äºè½¬å ï¼
å¯ä»¥çï¼Javaä¸çlongåintå¯ä»¥ç¸äºè½¬æ¢ãç±äºlongç±»åçèå´æ¯intç±»å大ï¼å æ¤å°int转æ¢ä¸ºlongæ¯å®å
¨çï¼èå°long转æ¢ä¸ºintå¯è½ä¼å¯¼è´æ°æ®ä¸¢å¤±ææº¢åºã
å°int转æ¢ä¸ºlongå¯ä»¥éè¿ç´æ¥èµå¼æå¼ºå¶ç±»åè½¬æ¢æ¥å®ç°ãä¾å¦ï¼
int intValue = 10;
long longValue = intValue; // èªå¨è½¬æ¢ï¼å®å
¨ç
å°long转æ¢ä¸ºintéè¦ä½¿ç¨å¼ºå¶ç±»å转æ¢ï¼ä½éè¦æ³¨ææ½å¨çæ°æ®ä¸¢å¤±ææº¢åºé®é¢ã

ä¾å¦ï¼
long longValue = 100L;
int intValue = (int) longValue; // 强å¶ç±»å转æ¢ï¼å¯è½ä¼ææ°æ®ä¸¢å¤±ææº¢åº
å¨å°long转æ¢ä¸ºintæ¶ï¼å¦ælongValueçå¼è¶
åºäºintç±»åçèå´ï¼è½¬æ¢ç»æå°æ¯æªæåçä½ä½é¨åãå æ¤ï¼å¨è¿è¡è½¬æ¢ä¹åï¼å»ºè®®å
æ£æ¥longValueç弿¯å¦å¨intç±»åçèå´å
ï¼ä»¥é¿å
æ°æ®ä¸¢å¤±ææº¢åºçé®é¢ã
# æ°æ®ç±»åè½¬æ¢æ¹å¼ä½ ç¥éåªäºï¼
- èªå¨ç±»å转æ¢ï¼éå¼è½¬æ¢ï¼ï¼å½ç®æ ç±»åçèå´å¤§äºæºç±»åæ¶ï¼Javaä¼èªå¨å°æºç±»å转æ¢ä¸ºç®æ ç±»åï¼ä¸éè¦æ¾å¼çç±»å转æ¢ãä¾å¦ï¼å°
int转æ¢ä¸ºlongãå°float转æ¢ä¸ºdoubleçã - 强å¶ç±»å转æ¢ï¼æ¾å¼è½¬æ¢ï¼ï¼å½ç®æ ç±»åçèå´å°äºæºç±»åæ¶ï¼éè¦ä½¿ç¨å¼ºå¶ç±»å转æ¢å°æºç±»å转æ¢ä¸ºç®æ ç±»åãè¿å¯è½å¯¼è´æ°æ®ä¸¢å¤±ææº¢åºãä¾å¦ï¼å°
long转æ¢ä¸ºintãå°double转æ¢ä¸ºintçãè¯æ³ä¸ºï¼ç®æ ç±»å åéå = (ç®æ ç±»å) æºç±»åã - å符串转æ¢ï¼Javaæä¾äºå°åç¬¦ä¸²è¡¨ç¤ºçæ°æ®è½¬æ¢ä¸ºå
¶ä»ç±»åæ°æ®çæ¹æ³ãä¾å¦ï¼å°å符串转æ¢ä¸ºæ´å
intï¼å¯ä»¥ä½¿ç¨Integer.parseInt()æ¹æ³ï¼å°å符串转æ¢ä¸ºæµ®ç¹ådoubleï¼å¯ä»¥ä½¿ç¨Double.parseDouble()æ¹æ³çã - æ°å¼ä¹é´ç转æ¢ï¼Javaæä¾äºä¸äºæ°å¼ç±»åä¹é´çè½¬æ¢æ¹æ³ï¼å¦å°æ´å转æ¢ä¸ºå符åãå°å符å转æ¢ä¸ºæ´åçãè¿äºè½¬æ¢æ¹å¼å¯ä»¥éè¿ç±»åçå
è£
ç±»æ¥å®ç°ï¼ä¾å¦
Characterç±»ãIntegerç±»çæä¾äºç¸åºçè½¬æ¢æ¹æ³ã
# ç±»åäºè½¬ä¼åºç°ä»ä¹é®é¢åï¼
åºæ¬æ°æ®ç±»å转æ¢çé®é¢
彿å°èå´æ°æ®ç±»åèµå¼ç»å¤§èå´æ°æ®ç±»åæ¶ï¼Java ä¼èªå¨è¿è¡ç±»å转æ¢ï¼è¿ç§è½¬æ¢ä¸è¬æ¯å®å ¨çã
int num = 100;
long bigNum = num; // èªå¨å°int转æ¢ä¸ºlong
使¯å¤§èå´æ°æ®ç±»åèµå¼ç»å°èå´æ°æ®ç±»åæ¶ï¼ä¼åçæ°æ®æ°æ®æº¢åºæè 精度æå¤±çé®é¢ã
- æ°æ®æº¢åºï¼å¦æå¤§èå´æ°æ®ç±»åèµå¼ç»å°èå´æ°æ®ç±»åæ¶ï¼å½ç®æ ç±»åæ æ³å®¹çº³åæ°æ®æ¶ï¼å°±ä¼åçæ°æ®æº¢åºãæ¯å¦ä¸é¢ï¼byte ç±»åçåå¼èå´æ¯ - 128 å° 127ã300 çäºè¿å¶è¡¨ç¤ºä¸º
00000001 00101100ï¼å¼ºå¶è½¬æ¢ä¸º byte ç±»åæ¶ï¼ä¼ä¸¢å¼é«ä½åèï¼åªä¿çä½ä½ç 8 ä½00101100ï¼å ¶åè¿å¶å¼ä¸º 44ã
int largeNum = 300;
byte b = (byte) largeNum; // bçå¼ä¸º44
- 精度æå¤±ï¼å¨è¿è¡æµ®ç¹æ°ç±»åçè½¬æ¢æ¶ï¼å¯è½ä¼åç精度æå¤±ãç±äºæµ®ç¹æ°ç表示æ¹å¼ä¸åï¼å°ä¸ä¸ªåç²¾åº¦æµ®ç¹æ°(
float)转æ¢ä¸ºåç²¾åº¦æµ®ç¹æ°(double)æ¶ï¼ç²¾åº¦å¯è½ä¼æå¤±ï¼å¦æ double 转æ¢ä¸º int ä¹ä¼åç精度æå¤±çé®é¢ï¼å¦ä¸ï¼
double d = 3.14;
int i = (int) d; // içå¼ä¸º3ï¼å°æ°é¨å0.14被èå¼
对象å¼ç¨è½¬æ¢çé®é¢
åä¸è½¬åæ¯èªå¨è¿è¡çï¼è䏿¯å®å ¨çï¼å¦ä¸ï¼
class Animal {}
class Dog extends Animal {}
Dog dog = new Dog();
Animal animal = dog; // èªå¨åä¸è½¬å
使¯åä¸è½¬åéè¦æå¨è¿è¡ï¼å¹¶ä¸åå¨é£é©ã妿ç¶ç±»å¯¹è±¡å®é ä¸å¹¶ä¸æ¯ç®æ åç±»çå®ä¾ï¼å¨è½¬åæ¶å°±ä¼æåºå¼å¸¸ï¼
Animal animal = new Animal();
Dog dog = (Dog) animal; // è¿è¡æ¶æåºClassCastException
åå æ¯Java ç对象å¨è¿è¡æ¶ä¼è®°å½å
¶çå®ç±»åï¼å½è¿è¡åä¸è½¬åæ¶ï¼Java 伿£æ¥å¯¹è±¡çå®é
ç±»åæ¯å¦ä¸ç®æ ç±»åå
¼å®¹ã妿ä¸å
¼å®¹ï¼å°±ä¼æåºClassCastExceptionã
è§£å³æ¹å¼æ¯éè¦ä½¿ç¨ instanceof æ£æ¥ï¼
if (animal instanceof Dog) {
Dog dog = (Dog) animal; // åªæç¡®è®¤animalæ¯Dogçå®ä¾æ¶æè¿è¡è½¬å
}
# 为ä»ä¹ç¨bigDecimal ä¸ç¨double ï¼
doubleä¼åºç°ç²¾åº¦ä¸¢å¤±çé®é¢ï¼doubleæ§è¡çæ¯äºè¿å¶æµ®ç¹è¿ç®ï¼äºè¿å¶æäºæ åµä¸ä¸è½åç¡®ç表示ä¸ä¸ªå°æ°ï¼å°±ååè¿å¶ä¸è½åç¡®ç表示1/3(1/3=0.3333...)ï¼ä¹å°±æ¯è¯´äºè¿å¶è¡¨ç¤ºå°æ°çæ¶ååªè½å¤è¡¨ç¤ºè½å¤ç¨1/(2^n)çåçä»»æç»åï¼ä½æ¯0.1ä¸è½å¤ç²¾ç¡®è¡¨ç¤ºï¼å 为å®ä¸è½å¤è¡¨ç¤ºæä¸º1/(2^n)çåçå½¢å¼ã
æ¯å¦ï¼
System.out.println(0.05 + 0.01);
System.out.println(1.0 - 0.42);
System.out.println(4.015 * 100);
System.out.println(123.3 / 100);
è¾åºï¼
0.060000000000000005
0.5800000000000001
401.49999999999994
1.2329999999999999
å¯ä»¥çå°å¨Javaä¸è¿è¡æµ®ç¹æ°è¿ç®çæ¶åï¼ä¼åºç°ä¸¢å¤±ç²¾åº¦çé®é¢ãé£ä¹æä»¬å¦æå¨è¿è¡ååä»·æ ¼è®¡ç®çæ¶åï¼å°±ä¼åºç°é®é¢ã徿å¯è½é ææä»¬æä¸æ0.06å ï¼å´æ æ³è´ä¹°ä¸ä¸ª0.05å åä¸ä¸ª0.01å çååãå 为å¦ä¸æç¤ºï¼ä»ä»¬ä¸¤ä¸ªçæ»å为0.060000000000000005ãè¿æ çæ¯ä¸ä¸ªå¾ä¸¥éçé®é¢ï¼å°¤å ¶æ¯å½çµåç½ç«çå¹¶åéä¸å»çæ¶åï¼åºç°çé®é¢å°æ¯å·¨å¤§çãå¯è½ä¼å¯¼è´æ æ³ä¸åï¼æè 对账åºç°é®é¢ã
è Decimal æ¯ç²¾ç¡®è®¡ç® , æä»¥ä¸è¬çµæ¯å°éé±çè®¡ç® , é½ä½¿ç¨ Decimalã
import java.math.BigDecimal;
public class BigDecimalExample {
public static void main(String[] args) {
BigDecimal num1 = new BigDecimal("0.1");
BigDecimal num2 = new BigDecimal("0.2");
BigDecimal sum = num1.add(num2);
BigDecimal product = num1.multiply(num2);
System.out.println("Sum: " + sum);
System.out.println("Product: " + product);
}
}
//è¾åº
Sum: 0.3
Product: 0.02
å¨ä¸è¿°ä»£ç ä¸ï¼æä»¬å建äºä¸¤ä¸ªBigDecimal对象num1ånum2ï¼åå«è¡¨ç¤º0.1å0.2è¿ä¸¤ä¸ªåè¿å¶æ°ãç¶åï¼æä»¬ä½¿ç¨add()æ¹æ³è®¡ç®å®ä»¬çåï¼å¹¶ä½¿ç¨multiply()æ¹æ³è®¡ç®å®ä»¬çä¹ç§¯ãæåï¼æä»¬éè¿System.out.println()æå°ç»æã
è¿æ ·ç使ç¨BigDecimalå¯ä»¥ç¡®ä¿ç²¾ç¡®çåè¿å¶æ°å¼è®¡ç®ï¼é¿å
äºä½¿ç¨doubleå¯è½åºç°çèå
¥è¯¯å·®ãéè¦æ³¨æçæ¯ï¼å¨å建BigDecimal对象æ¶ï¼åºè¯¥ä½¿ç¨å符串ä½ä¸ºåæ°ï¼è䏿¯ç´æ¥ä½¿ç¨æµ®ç¹æ°å¼ï¼ä»¥é¿å
æµ®ç¹æ°ç²¾åº¦ä¸¢å¤±ã
# è£ ç®±åæç®±æ¯ä»ä¹ï¼
è£ ç®±ï¼Boxingï¼åæç®±ï¼Unboxingï¼æ¯å°åºæ¬æ°æ®ç±»åå对åºçå è£ ç±»ä¹é´è¿è¡è½¬æ¢çè¿ç¨ã
Integer i = 10; //è£
ç®±
int n = i; //æç®±
èªå¨è£ 箱主è¦åçå¨ä¸¤ç§æ åµï¼ä¸ç§æ¯èµå¼æ¶ï¼å¦ä¸ç§æ¯å¨æ¹æ³è°ç¨çæ¶åã
èµå¼æ¶
è¿æ¯æå¸¸è§çä¸ç§æ åµï¼å¨Java 1.5以åæä»¬éè¦æå¨å°è¿è¡è½¬æ¢æè¡ï¼èç°å¨ææç转æ¢é½æ¯ç±ç¼è¯å¨æ¥å®æã
//before autoboxing
Integer iObject = Integer.valueOf(3);
Int iPrimitive = iObject.intValue()
//after java5
Integer iObject = 3; //autobxing - primitive to wrapper conversion
int iPrimitive = iObject; //unboxing - object to primitive conversion
æ¹æ³è°ç¨æ¶
彿们卿¹æ³è°ç¨æ¶ï¼æä»¬å¯ä»¥ä¼ å ¥åå§æ°æ®å¼æè 对象ï¼åæ ·ç¼è¯å¨ä¼å¸®æä»¬è¿è¡è½¬æ¢ã
public static Integer show(Integer iParam){
System.out.println("autoboxing example - method invocation i: " + iParam);
return iParam;
}
//autoboxing and unboxing in method invocation
show(3); //autoboxing
int result = show(3); //unboxing because return type of method is Integer
showæ¹æ³æ¥åInteger对象ä½ä¸ºåæ°ï¼å½è°ç¨show(3)æ¶ï¼ä¼å°intå¼è½¬æ¢æå¯¹åºçInteger对象ï¼è¿å°±æ¯æè°çèªå¨è£
ç®±ï¼showæ¹æ³è¿åInteger对象ï¼èint result = show(3);ä¸result为intç±»åï¼æä»¥è¿æ¶ååçèªå¨æç®±æä½ï¼å°showæ¹æ³çè¿åçIntegerå¯¹è±¡è½¬æ¢æintå¼ã
èªå¨è£ ç®±çå¼ç«¯
èªå¨è£ ç®±æä¸ä¸ªé®é¢ï¼é£å°±æ¯å¨ä¸ä¸ªå¾ªç¯ä¸è¿è¡èªå¨è£ ç®±æä½çæ åµï¼å¦ä¸é¢çä¾åå°±ä¼å建å¤ä½ç对象ï¼å½±åç¨åºçæ§è½ã
Integer sum = 0; for(int i=1000; i<5000; i++){ sum+=i; }
ä¸é¢ç代ç sum+=iå¯ä»¥çæsum = sum + iï¼ä½æ¯+è¿ä¸ªæä½ç¬¦ä¸éç¨äºInteger对象ï¼é¦å
sumè¿è¡èªå¨æç®±æä½ï¼è¿è¡æ°å¼ç¸å æä½ï¼æååçèªå¨è£
ç®±æä½è½¬æ¢æInteger对象ãå
¶å
é¨ååå¦ä¸
int result = sum.intValue() + i; Integer sum = new Integer(result);
ç±äºæä»¬è¿é声æçsum为Integerç±»åï¼å¨ä¸é¢ç循ç¯ä¸ä¼å建å°è¿4000个æ ç¨çInteger对象ï¼å¨è¿æ ·åºå¤§ç循ç¯ä¸ï¼ä¼éä½ç¨åºçæ§è½å¹¶ä¸å éäºåå¾åæ¶çå·¥ä½éãå æ¤å¨æä»¬ç¼ç¨æ¶ï¼éè¦æ³¨æå°è¿ä¸ç¹ï¼æ£ç¡®å°å£°æåéç±»åï¼é¿å å 为èªå¨è£ ç®±å¼èµ·çæ§è½é®é¢ã
# Java为ä»ä¹è¦æIntegerï¼
Integerå¯¹åºæ¯intç±»åçå è£ ç±»ï¼å°±æ¯æintç±»åå è£ æObject对象ï¼å¯¹è±¡å°è£ æå¾å¤å¥½å¤ï¼å¯ä»¥æå±æ§ä¹å°±æ¯æ°æ®è·å¤çè¿äºæ°æ®çæ¹æ³ç»åå¨ä¸èµ·ï¼æ¯å¦Integerå°±æparseInt()çæ¹æ³æ¥ä¸é¨å¤çintåç¸å ³çæ°æ®ã
å¦ä¸ä¸ªé常éè¦çåå å°±æ¯å¨Javaä¸ç»å¤§é¨åæ¹æ³æç±»é½æ¯ç¨æ¥å¤ç类类å对象çï¼å¦ArrayListéå类就åªè½ä»¥ç±»ä½ä¸ºä»çåå¨å¯¹è±¡ï¼èè¿æ¶å¦ææ³æä¸ä¸ªintåçæ°æ®åå ¥listæ¯ä¸å¯è½çï¼å¿ é¡»æå®å è£ æç±»ï¼ä¹å°±æ¯Integeræè½è¢«Listææ¥åãæä»¥Integerçå卿¯å¾å¿ è¦çã
æ³åä¸çåºç¨
å¨Javaä¸ï¼æ³ååªè½ä½¿ç¨å¼ç¨ç±»åï¼èä¸è½ä½¿ç¨åºæ¬ç±»åãå æ¤ï¼å¦æè¦å¨æ³åä¸ä½¿ç¨intç±»åï¼å¿ 须使ç¨Integerå è£ ç±»ãä¾å¦ï¼å设æä»¬æä¸ä¸ªåè¡¨ï¼æä»¬æ³è¦å°å ¶å ç´ æåºï¼å¹¶å°æåºç»æåå¨å¨ä¸ä¸ªæ°çå表ä¸ã妿æä»¬ä½¿ç¨åºæ¬æ°æ®ç±»åintï¼æ æ³ç´æ¥ä½¿ç¨Collections.sort()æ¹æ³ã使¯ï¼å¦ææä»¬ä½¿ç¨Integerå è£ ç±»ï¼æä»¬å°±å¯ä»¥è½»æ¾å°ä½¿ç¨Collections.sort()æ¹æ³ã
List<Integer> list = new ArrayList<>();
list.add(3);
list.add(1);
list.add(2);
Collections.sort(list);
System.out.println(list);
转æ¢ä¸çåºç¨
å¨Javaä¸ï¼åºæ¬ç±»ååå¼ç¨ç±»åä¸è½ç´æ¥è¿è¡è½¬æ¢ï¼å¿ 须使ç¨å è£ ç±»æ¥å®ç°ãä¾å¦ï¼å°ä¸ä¸ªintç±»åçå¼è½¬æ¢ä¸ºStringç±»åï¼å¿ é¡»é¦å å°å ¶è½¬æ¢ä¸ºIntegerç±»åï¼ç¶åå转æ¢ä¸ºStringç±»åã
int i = 10;
Integer integer = new Integer(i);
String str = integer.toString();
System.out.println(str);
éåä¸çåºç¨
Javaéåä¸åªè½åå¨å¯¹è±¡ï¼èä¸è½åå¨åºæ¬æ°æ®ç±»åãå æ¤ï¼å¦æè¦å°intç±»åçæ°æ®åå¨å¨éåä¸ï¼å¿ 须使ç¨Integerå è£ ç±»ãä¾å¦ï¼å设æä»¬æä¸ä¸ªåè¡¨ï¼æä»¬æ³è¦è®¡ç®åè¡¨ä¸ææå ç´ çåã妿æä»¬ä½¿ç¨åºæ¬æ°æ®ç±»åintï¼æä»¬éè¦ä½¿ç¨ä¸ä¸ªå¾ªç¯æ¥éåå表ï¼å¹¶å°æ¯ä¸ªå ç´ ç¸å ã使¯ï¼å¦ææä»¬ä½¿ç¨Integerå è£ ç±»ï¼æä»¬å¯ä»¥ç´æ¥ä½¿ç¨stream()æ¹æ³æ¥è®¡ç®ææå ç´ çåã
List<Integer> list = new ArrayList<>();
list.add(3);
list.add(1);
list.add(2);
int sum = list.stream().mapToInt(Integer::intValue).sum();
System.out.println(sum);
# Integerç¸æ¯intæä»ä¹ä¼ç¹ï¼
intæ¯Javaä¸çåå§æ°æ®ç±»åï¼èIntegeræ¯intçå è£ ç±»ã
Integerå int çåºå«ï¼
- åºæ¬ç±»ååå¼ç¨ç±»åï¼é¦å ï¼intæ¯ä¸ç§åºæ¬æ°æ®ç±»åï¼èIntegeræ¯ä¸ç§å¼ç¨ç±»åãåºæ¬æ°æ®ç±»åæ¯Javaä¸æåºæ¬çæ°æ®ç±»åï¼å®ä»¬æ¯é¢å®ä¹çï¼ä¸éè¦å®ä¾åå°±å¯ä»¥ä½¿ç¨ãèå¼ç¨ç±»ååéè¦éè¿å®ä¾å对象æ¥ä½¿ç¨ãè¿æå³çï¼ä½¿ç¨intæ¥åå¨ä¸ä¸ªæ´æ°æ¶ï¼ä¸éè¦ä»»ä½é¢å¤çå ååé ï¼è使ç¨Integeræ¶ï¼å¿ 须为对象åé å åã卿§è½æ¹é¢ï¼åºæ¬æ°æ®ç±»åçæä½é常æ¯ç¸åºçå¼ç¨ç±»åå¿«ã
- èªå¨è£ ç®±åæç®±ï¼å ¶æ¬¡ï¼Integerä½ä¸ºintçå è£ ç±»ï¼å®å¯ä»¥å®ç°èªå¨è£ ç®±åæç®±ãèªå¨è£ ç®±æ¯æå°åºæ¬ç±»å转å为ç¸åºçå è£ ç±»ç±»åï¼èèªå¨æç®±åæ¯å°å è£ ç±»ç±»å转å为ç¸åºçåºæ¬ç±»åãè¿ä½¿å¾Javaç¨åºåæ´å æ¹ä¾¿å°è¿è¡æ°æ®ç±»å转æ¢ãä¾å¦ï¼å½æä»¬éè¦å°intç±»åçå¼èµç»Integeråéæ¶ï¼Javaå¯ä»¥èªå¨å°å°intç±»å转æ¢ä¸ºIntegerç±»åãåæ ·å°ï¼å½æä»¬éè¦å°Integerç±»åçå¼èµç»intåéæ¶ï¼Javaå¯ä»¥èªå¨å°å°Integerç±»å转æ¢ä¸ºintç±»åã
- 空æéå¼å¸¸ï¼å¦å¤ï¼intåéå¯ä»¥ç´æ¥èµå¼ä¸º0ï¼èIntegeråéå¿ é¡»éè¿å®ä¾å对象æ¥èµå¼ã妿坹ä¸ä¸ªæªç»åå§åçIntegeråéè¿è¡æä½ï¼å°±ä¼åºç°ç©ºæéå¼å¸¸ãè¿æ¯å 为å®è¢«èµäºäºnullå¼ï¼ènull弿¯æ æ³è¿è¡èªå¨æç®±çã
# é£ä¸ºä»ä¹è¿è¦ä¿çintç±»åï¼
å è£ ç±»æ¯å¼ç¨ç±»åï¼å¯¹è±¡çå¼ç¨å对象æ¬èº«æ¯åå¼åå¨çï¼è对äºåºæ¬ç±»åæ°æ®ï¼åé对åºçå ååç´æ¥å卿°æ®æ¬èº«ã
å æ¤ï¼åºæ¬ç±»åæ°æ®å¨è¯»åæçæ¹é¢ï¼è¦æ¯å è£ ç±»é«æã餿¤ä¹å¤ï¼å¨64ä½JVMä¸ï¼å¨å¼å¯å¼ç¨åç¼©çæ åµä¸ï¼ä¸ä¸ªInteger对象å ç¨16个åèçå å空é´ï¼èä¸ä¸ªintç±»åæ°æ®åªå ç¨4åèçå å空é´ï¼åè 对空é´çå ç¨æ¯åè ç4åã
ä¹å°±æ¯è¯´ï¼ä¸ç®¡æ¯è¯»åæçï¼è¿æ¯å卿çï¼åºæ¬ç±»å齿¯å è£ ç±»é«æã
# 说ä¸ä¸ integerçç¼å
JavaçIntegerç±»å é¨å®ç°äºä¸ä¸ªéæç¼åæ± ï¼ç¨äºåå¨ç¹å®èå´å çæ´æ°å¼å¯¹åºçInteger对象ã
é»è®¤æ åµä¸ï¼è¿ä¸ªèå´æ¯-128è³127ãå½éè¿Integer.valueOf(int)æ¹æ³å建ä¸ä¸ªå¨è¿ä¸ªèå´å çæ´æ°å¯¹è±¡æ¶ï¼å¹¶ä¸ä¼æ¯æ¬¡é½çææ°ç对象å®ä¾ï¼èæ¯å¤ç¨ç¼åä¸çç°æå¯¹è±¡ï¼ä¼ç´æ¥ä»å åä¸ååºï¼ä¸éè¦æ°å»ºä¸ä¸ªå¯¹è±¡ã
# é¢å对象
# æä¹çè§£é¢å对象ï¼ç®å说说å°è£ ç»§æ¿å¤æ
é¢å对象æ¯ä¸ç§ç¼ç¨èå¼ï¼å®å°ç°å®ä¸çä¸çäºç©æ½è±¡ä¸ºå¯¹è±¡ï¼å¯¹è±¡å ·æå±æ§ï¼ç§°ä¸ºå段æå±æ§ï¼åè¡ä¸ºï¼ç§°ä¸ºæ¹æ³ï¼ãé¢å对象ç¼ç¨çè®¾è®¡ææ³æ¯ä»¥å¯¹è±¡ä¸ºä¸å¿ï¼éè¿å¯¹è±¡ä¹é´çäº¤äºæ¥å®æç¨åºçåè½ï¼å ·æçµæ´»æ§å坿©å±æ§ï¼éè¿å°è£ åç»§æ¿å¯ä»¥æ´å¥½å°åºå¯¹éæ±ååã
Javaé¢å对象çä¸å¤§ç¹æ§å æ¬ï¼å°è£ ãç»§æ¿ã夿ï¼
- å°è£ ï¼å°è£ æ¯æå°å¯¹è±¡ç屿§ï¼æ°æ®ï¼åè¡ä¸ºï¼æ¹æ³ï¼ç»åå¨ä¸èµ·ï¼å¯¹å¤éè对象çå é¨ç»èï¼ä» éè¿å¯¹è±¡æä¾çæ¥å£ä¸å¤ç交äºãå°è£ çç®çæ¯å¢å¼ºå®å ¨æ§åç®åç¼ç¨ï¼ä½¿å¾å¯¹è±¡æ´å ç¬ç«ã
- ç»§æ¿ï¼ç»§æ¿æ¯ä¸ç§å¯ä»¥ä½¿å¾åç±»èªå¨å ±äº«ç¶ç±»æ°æ®ç»æåæ¹æ³çæºå¶ã宿¯ä»£ç å¤ç¨çéè¦ææ®µï¼éè¿ç»§æ¿å¯ä»¥å»ºç«ç±»ä¸ç±»ä¹é´ç屿¬¡å ³ç³»ï¼ä½¿å¾ç»ææ´å æ¸ æ°ã
- 夿ï¼å¤ææ¯æå 许ä¸åç±»ç对象对å䏿¶æ¯ä½åºååºãå³åä¸ä¸ªæ¥å£ï¼ä½¿ç¨ä¸åçå®ä¾èæ§è¡ä¸åæä½ã夿æ§å¯ä»¥å为ç¼è¯æ¶å¤æï¼éè½½ï¼åè¿è¡æ¶å¤æï¼éåï¼ãå®ä½¿å¾ç¨åºå ·æè¯å¥½ççµæ´»æ§åæ©å±æ§ã
# 夿ä½ç°å¨åªå 个æ¹é¢ï¼
夿å¨é¢å对象ç¼ç¨ä¸å¯ä»¥ä½ç°å¨ä»¥ä¸å 个æ¹é¢ï¼
- æ¹æ³éè½½ï¼
- æ¹æ³éè½½æ¯æåä¸ç±»ä¸å¯ä»¥æå¤ä¸ªååæ¹æ³ï¼å®ä»¬å ·æä¸åçåæ°å表ï¼åæ°ç±»åãæ°éæé¡ºåºä¸åï¼ãè½ç¶æ¹æ³åç¸åï¼ä½æ ¹æ®ä¼ å ¥çåæ°ä¸åï¼ç¼è¯å¨ä¼å¨ç¼è¯æ¶ç¡®å®è°ç¨åªä¸ªæ¹æ³ã
- 示ä¾ï¼å¯¹äºä¸ä¸ª
addæ¹æ³ï¼å¯ä»¥å®ä¹ä¸ºadd(int a, int b)åadd(double a, double b)ã
- æ¹æ³éåï¼
- æ¹æ³é忝æåç±»è½å¤æä¾å¯¹ç¶ç±»ä¸ååæ¹æ³çå ·ä½å®ç°ãå¨è¿è¡æ¶ï¼JVM伿 ¹æ®å¯¹è±¡çå®é ç±»åç¡®å®è°ç¨åªä¸ªçæ¬çæ¹æ³ãè¿æ¯å®ç°å¤æçä¸»è¦æ¹å¼ã
- 示ä¾ï¼å¨ä¸ä¸ªå¨ç©ç±»ä¸ï¼å®ä¹ä¸ä¸ª
soundæ¹æ³ï¼åç±»Dogå¯ä»¥éåè¯¥æ¹æ³ä»¥å®ç°barkï¼èCatå¯ä»¥å®ç°meowã
- æ¥å£ä¸å®ç°ï¼
- 夿ä¹ä½ç°å¨æ¥å£ç使ç¨ä¸ï¼å¤ä¸ªç±»å¯ä»¥å®ç°åä¸ä¸ªæ¥å£ï¼å¹¶ä¸ç¨æ¥å£ç±»åçå¼ç¨æ¥è°ç¨è¿äºç±»çæ¹æ³ãè¿ä½¿å¾ç¨åºå¨é¢å¯¹ä¸åå ·ä½å®ç°æ¶ä¿æä¸è´¯çè°ç¨æ¹å¼ã
- 示ä¾ï¼å¤ä¸ªç±»ï¼å¦
Dog,Catï¼é½å®ç°äºä¸ä¸ªAnimalæ¥å£ï¼å½ç¨Animalç±»åçå¼ç¨æ¥è°ç¨makeSoundæ¹æ³æ¶ï¼ä¼è§¦å对åºçå®ç°ã
- åä¸è½¬åååä¸è½¬åï¼
- å¨Javaä¸ï¼å¯ä»¥ä½¿ç¨ç¶ç±»ç±»åçå¼ç¨æåå类对象ï¼è¿æ¯åä¸è½¬åãéè¿è¿ç§æ¹å¼ï¼å¯ä»¥å¨è¿è¡æ¶æéç¨ä¸åçåç±»å®ç°ã
- åä¸è½¬åæ¯å°ç¶ç±»å¼ç¨è½¬åå
¶å类类åï¼ä½å¨æ§è¡åéè¦ç¡®è®¤å¼ç¨å®é
æåç对象类å以é¿å
ClassCastExceptionã
# å¤æè§£å³äºä»ä¹é®é¢ï¼
å¤ææ¯æåç±»å¯ä»¥æ¿æ¢ç¶ç±»ï¼å¨å®é ç代ç è¿è¡è¿ç¨ä¸ï¼è°ç¨åç±»çæ¹æ³å®ç°ã夿è¿ç§ç¹æ§ä¹éè¦ç¼ç¨è¯è¨æä¾ç¹æ®çè¯æ³æºå¶æ¥å®ç°ï¼æ¯å¦ç»§æ¿ãæ¥å£ç±»ã
夿å¯ä»¥æé«ä»£ç çæ©å±æ§åå¤ç¨æ§ï¼æ¯å¾å¤è®¾è®¡æ¨¡å¼ã设计ååãç¼ç¨æå·§ç代ç å®ç°åºç¡ãæ¯å¦çç¥æ¨¡å¼ãåºäºæ¥å£èéå®ç°ç¼ç¨ãä¾èµåç½®ååãé弿¿æ¢ååãå©ç¨å¤æå»æåé¿ç if-else è¯å¥çç
# é¢å对象ç设计ååä½ ç¥éæåªäºå
é¢å对象ç¼ç¨ä¸çå 大ååï¼
- åä¸èè´£ååï¼SRPï¼ï¼ä¸ä¸ªç±»åºè¯¥åªæä¸ä¸ªå¼èµ·å®ååçåå ï¼å³ä¸ä¸ªç±»åºè¯¥åªè´è´£ä¸é¡¹èè´£ãä¾åï¼èèä¸ä¸ªå工类ï¼å®åºè¯¥åªè´è´£ç®¡çå工信æ¯ï¼èä¸åºè´è´£å ¶ä»æ å ³å·¥ä½ã
- 弿¾å°éååï¼OCPï¼ï¼è½¯ä»¶å®ä½åºè¯¥å¯¹æ©å±å¼æ¾ï¼å¯¹ä¿®æ¹å°éãä¾åï¼éè¿å¶å®æ¥å£æ¥å®ç°è¿ä¸ååï¼æ¯å¦å®ä¹ä¸ä¸ªå¾å½¢ç±»ï¼ç¶å让ä¸åç±»åçå¾å½¢ç»§æ¿è¿ä¸ªç±»ï¼èä¸éè¦ä¿®æ¹å¾å½¢ç±»æ¬èº«ã
- éæ°æ¿æ¢ååï¼LSPï¼ï¼å类对象åºè¯¥è½å¤æ¿æ¢æææç¶ç±»å¯¹è±¡ãä¾åï¼ä¸ä¸ªæ£æ¹å½¢æ¯ä¸ä¸ªç©å½¢ï¼ä½å¦æä¿®æ¹ä¸ä¸ªç©å½¢çé«åº¦å宽度æ¶ï¼æ£æ¹å½¢çè¡ä¸ºåºè¯¥å¦ä½æ¹åå°±æ¯ä¸ä¸ªè¿åéæ°æ¿æ¢ååçä¾åã
- æ¥å£é离ååï¼ISPï¼ï¼å®¢æ·ç«¯ä¸åºè¯¥ä¾èµé£äºå®ä¸éè¦çæ¥å£ï¼å³æ¥å£åºè¯¥å°èä¸ãä¾åï¼éè¿æ¥å£æ½è±¡å±æ¥å®ç°åºå±åé«å±æ¨¡åä¹é´çè§£è¦ï¼æ¯å¦ä½¿ç¨ä¾èµæ³¨å ¥ã
- ä¾èµåç½®ååï¼DIPï¼ï¼é«å±æ¨¡åä¸åºè¯¥ä¾èµä½å±æ¨¡åï¼äºè é½åºè¯¥ä¾èµäºæ½è±¡ï¼æ½è±¡ä¸åºè¯¥ä¾èµäºç»èï¼ç»èåºè¯¥ä¾èµäºæ½è±¡ãä¾åï¼å¦æä¸ä¸ªå ¬å¸ç±»å å«é¨é¨ç±»ï¼åºè¯¥èè使ç¨åæ/èåå ³ç³»ï¼è䏿¯å°å ¬å¸ç±»ç»§æ¿èªé¨é¨ç±»ã
- æå°ç¥è¯åå (Law of Demeter)ï¼ä¸ä¸ªå¯¹è±¡åºå½å¯¹å ¶ä»å¯¹è±¡ææå°çäºè§£ï¼åªä¸å ¶ç´æ¥çæå交äºã
# éè½½ä¸éåæä»ä¹åºå«ï¼
- éè½½ï¼Overloadingï¼æçæ¯å¨åä¸ä¸ªç±»ä¸ï¼å¯ä»¥æå¤ä¸ªååæ¹æ³ï¼å®ä»¬å ·æä¸åçåæ°å表ï¼åæ°ç±»åãåæ°ä¸ªæ°æåæ°é¡ºåºä¸åï¼ï¼ç¼è¯å¨æ ¹æ®è°ç¨æ¶çåæ°ç±»åæ¥å³å®è°ç¨åªä¸ªæ¹æ³ã
- éåï¼Overridingï¼æçæ¯åç±»å¯ä»¥éæ°å®ä¹ç¶ç±»ä¸çæ¹æ³ï¼æ¹æ³åãåæ°å表åè¿åç±»åå¿ é¡»ä¸ç¶ç±»ä¸çæ¹æ³ä¸è´ï¼éè¿@overrideæ³¨è§£æ¥æç¡®è¡¨ç¤ºè¿æ¯å¯¹ç¶ç±»æ¹æ³çéåã
éè½½æ¯æå¨åä¸ä¸ªç±»ä¸å®ä¹å¤ä¸ªååæ¹æ³ï¼èé忝æåç±»éæ°å®ä¹ç¶ç±»ä¸çæ¹æ³ã
# æ½è±¡ç±»åæ®éç±»åºå«ï¼
- å®ä¾åï¼æ®éç±»å¯ä»¥ç´æ¥å®ä¾å对象ï¼èæ½è±¡ç±»ä¸è½è¢«å®ä¾åï¼åªè½è¢«ç»§æ¿ã
- æ¹æ³å®ç°ï¼æ®éç±»ä¸çæ¹æ³å¯ä»¥æå ·ä½çå®ç°ï¼èæ½è±¡ç±»ä¸çæ¹æ³å¯ä»¥æå®ç°ä¹å¯ä»¥æ²¡æå®ç°ã
- ç»§æ¿ï¼ä¸ä¸ªç±»å¯ä»¥ç»§æ¿ä¸ä¸ªæ®éç±»ï¼èä¸å¯ä»¥ç»§æ¿å¤ä¸ªæ¥å£ï¼èä¸ä¸ªç±»åªè½ç»§æ¿ä¸ä¸ªæ½è±¡ç±»ï¼ä½å¯ä»¥åæ¶å®ç°å¤ä¸ªæ¥å£ã
- å®ç°éå¶ï¼æ®éç±»å¯ä»¥è¢«å ¶ä»ç±»ç»§æ¿å使ç¨ï¼èæ½è±¡ç±»ä¸è¬ç¨äºä½ä¸ºåºç±»ï¼è¢«å ¶ä»ç±»ç»§æ¿åæ©å±ä½¿ç¨ã
# Javaæ½è±¡ç±»åæ¥å£çåºå«æ¯ä»ä¹ï¼
两è çç¹ç¹ï¼
- æ½è±¡ç±»ç¨äºæè¿°ç±»çå ±åç¹æ§åè¡ä¸ºï¼å¯ä»¥ææååéãæé æ¹æ³åå ·ä½æ¹æ³ãéç¨äºæææ¾ç»§æ¿å ³ç³»çåºæ¯ã
- æ¥å£ç¨äºå®ä¹è¡ä¸ºè§èï¼å¯ä»¥å¤å®ç°ï¼åªè½æå¸¸éåæ½è±¡æ¹æ³ï¼Java 8 以åå¯ä»¥æé»è®¤æ¹æ³åéææ¹æ³ï¼ãéç¨äºå®ä¹ç±»çè½åæåè½ã
两è çåºå«ï¼
- å®ç°æ¹å¼ï¼å®ç°æ¥å£çå ³é®å为implementsï¼ç»§æ¿æ½è±¡ç±»çå ³é®å为extendsãä¸ä¸ªç±»å¯ä»¥å®ç°å¤ä¸ªæ¥å£ï¼ä½ä¸ä¸ªç±»åªè½ç»§æ¿ä¸ä¸ªæ½è±¡ç±»ãæä»¥ï¼ä½¿ç¨æ¥å£å¯ä»¥é´æ¥å°å®ç°å¤éç»§æ¿ã
- æ¹æ³æ¹å¼ï¼æ¥å£åªæå®ä¹ï¼ä¸è½ææ¹æ³çå®ç°ï¼java 1.8ä¸å¯ä»¥å®ä¹defaultæ¹æ³ä½ï¼èæ½è±¡ç±»å¯ä»¥æå®ä¹ä¸å®ç°ï¼æ¹æ³å¯å¨æ½è±¡ç±»ä¸å®ç°ã
- 访é®ä¿®é¥°ç¬¦ï¼æ¥å£æååéé»è®¤ä¸ºpublic static finalï¼å¿ é¡»èµåå¼ï¼ä¸è½è¢«ä¿®æ¹ï¼å ¶ææçæåæ¹æ³é½æ¯publicãabstractçãæ½è±¡ç±»ä¸æååéé»è®¤defaultï¼å¯å¨åç±»ä¸è¢«éæ°å®ä¹ï¼ä¹å¯è¢«éæ°èµå¼ï¼æ½è±¡æ¹æ³è¢«abstract修饰ï¼ä¸è½è¢«privateãstaticãsynchronizedånativeç修饰ï¼å¿ 须以åå·ç»å°¾ï¼ä¸å¸¦è±æ¬å·ã
- åéï¼æ½è±¡ç±»å¯ä»¥å å«å®ä¾åéåéæåéï¼èæ¥å£åªè½å å«å¸¸éï¼å³éæå¸¸éï¼ã
# æ½è±¡ç±»è½å final修饰åï¼
ä¸è½ï¼Javaä¸çæ½è±¡ç±»æ¯ç¨æ¥è¢«ç»§æ¿çï¼èfinal修饰符ç¨äºç¦æ¢ç±»è¢«ç»§æ¿ææ¹æ³è¢«éåï¼å æ¤ï¼æ½è±¡ç±»åfinal修饰符æ¯äºæ¥çï¼ä¸è½åæ¶ä½¿ç¨ã
# æ¥å£éé¢å¯ä»¥å®ä¹åªäºæ¹æ³ï¼
- æ½è±¡æ¹æ³
æ½è±¡æ¹æ³æ¯æ¥å£çæ ¸å¿é¨åï¼ææå®ç°æ¥å£çç±»é½å¿ é¡»å®ç°è¿äºæ¹æ³ãæ½è±¡æ¹æ³é»è®¤æ¯ public å abstractï¼è¿äºä¿®é¥°ç¬¦å¯ä»¥çç¥ã
public interface Animal {
void makeSound();
}
- é»è®¤æ¹æ³
é»è®¤æ¹æ³æ¯å¨ Java 8 ä¸å¼å ¥çï¼å 许æ¥å£æä¾å ·ä½å®ç°ãå®ç°ç±»å¯ä»¥éæ©éåé»è®¤æ¹æ³ã
public interface Animal {
void makeSound();
default void sleep() {
System.out.println("Sleeping...");
}
}
- éææ¹æ³
éææ¹æ³ä¹æ¯å¨ Java 8 ä¸å¼å ¥çï¼å®ä»¬å±äºæ¥å£æ¬èº«ï¼å¯ä»¥éè¿æ¥å£åç´æ¥è°ç¨ï¼èä¸éè¦å®ç°ç±»ç对象ã
public interface Animal {
void makeSound();
static void staticMethod() {
System.out.println("Static method in interface");
}
}
- ç§ææ¹æ³
ç§ææ¹æ³æ¯å¨ Java 9 ä¸å¼å ¥çï¼ç¨äºå¨æ¥å£ä¸ä¸ºé»è®¤æ¹æ³æå ¶ä»ç§ææ¹æ³æä¾è¾ å©åè½ãè¿äºæ¹æ³ä¸è½è¢«å®ç°ç±»è®¿é®ï¼åªè½å¨æ¥å£å é¨ä½¿ç¨ã
public interface Animal {
void makeSound();
default void sleep() {
System.out.println("Sleeping...");
logSleep();
}
private void logSleep() {
System.out.println("Logging sleep");
}
}
public interface Animal {
void makeSound();
}
# æ½è±¡ç±»å¯ä»¥è¢«å®ä¾ååï¼
å¨Javaä¸ï¼æ½è±¡ç±»æ¬èº«ä¸è½è¢«å®ä¾åã
è¿æå³çä¸è½ä½¿ç¨newå
³é®åç´æ¥å建ä¸ä¸ªæ½è±¡ç±»çå¯¹è±¡ãæ½è±¡ç±»çåå¨ä¸»è¦æ¯ä¸ºäºè¢«ç»§æ¿ï¼å®é常å
å«ä¸ä¸ªæå¤ä¸ªæ½è±¡æ¹æ³ï¼ç±abstractå
³é®åä¿®é¥°ä¸æ æ¹æ³ä½çæ¹æ³ï¼ï¼è¿äºæ¹æ³éè¦å¨åç±»ä¸è¢«å®ç°ã
æ½è±¡ç±»å¯ä»¥ææé å¨ï¼è¿äºæé å¨å¨åç±»å®ä¾åæ¶ä¼è¢«è°ç¨ï¼ä»¥ä¾¿è¿è¡å¿ è¦çåå§åå·¥ä½ãç¶èï¼è¿ä¸ªè¿ç¨å¹¶ä¸æ¯ç´æ¥å®ä¾åæ½è±¡ç±»ï¼èæ¯å建äºåç±»çå®ä¾ï¼é´æ¥å°ä½¿ç¨äºæ½è±¡ç±»çæé å¨ã
ä¾å¦ï¼
public abstract class AbstractClass {
public AbstractClass() {
// æé å¨ä»£ç
}
public abstract void abstractMethod();
}
public class ConcreteClass extends AbstractClass {
public ConcreteClass() {
super(); // è°ç¨æ½è±¡ç±»çæé å¨
}
@Override
public void abstractMethod() {
// å®ç°æ½è±¡æ¹æ³
}
}
// ä¸é¢ç代ç å¯ä»¥è¿è¡
ConcreteClass obj = new ConcreteClass();
å¨è¿ä¸ªä¾åä¸ï¼ConcreteClassç»§æ¿äºAbstractClasså¹¶å®ç°äºæ½è±¡æ¹æ³abstractMethod()ã彿们å建ConcreteClassçå®ä¾æ¶ï¼AbstractClassçæé å¨è¢«è°ç¨ï¼ä½è¿å¹¶ä¸æå³çAbstractClass被å®ä¾åï¼å®é
ä¸ï¼æä»¬åå»ºçæ¯ConcreteClassçä¸ä¸ªå¯¹è±¡ã
ç®èè¨ä¹ï¼æ½è±¡ç±»ä¸è½ç´æ¥å®ä¾åï¼ä½éè¿ç»§æ¿æ½è±¡ç±»å¹¶å®ç°æææ½è±¡æ¹æ³çåç±»æ¯å¯ä»¥è¢«å®ä¾åçã
# æ¥å£å¯ä»¥å 嫿é 彿°åï¼
卿¥å£ä¸ï¼ä¸å¯ä»¥ææé æ¹æ³,卿¥å£éåå ¥æé æ¹æ³æ¶ï¼ç¼è¯å¨æç¤ºï¼Interfaces cannot have constructorsï¼å 为æ¥å£ä¸ä¼æèªå·±çå®ä¾çï¼æä»¥ä¸éè¦ææé 彿°ã
为ä»ä¹å¢ï¼æé 彿°å°±æ¯åå§åclassç屿§æè æ¹æ³ï¼å¨newçä¸ç¬é´èªå¨è°ç¨ï¼é£ä¹é®é¢æ¥äºJavaçæ¥å£ï¼é½ä¸è½new é£ä¹è¦æé 彿°å¹²åå¢ï¼æ ¹æ¬å°±æ²¡æ³è°ç¨
# è§£éJavaä¸çéæåéåéææ¹æ³
å¨Javaä¸ï¼éæåéåéææ¹æ³æ¯ä¸ç±»æ¬èº«å ³èçï¼è䏿¯ä¸ç±»çå®ä¾ï¼å¯¹è±¡ï¼å ³èãå®ä»¬å¨å åä¸åªåå¨ä¸ä»½ï¼å¯ä»¥è¢«ç±»çææå®ä¾å ±äº«ã
éæåé
éæåéï¼ä¹ç§°ä¸ºç±»åéï¼æ¯å¨ç±»ä¸ä½¿ç¨staticå
³é®å声æçåéãå®ä»¬å±äºç±»è䏿¯ä»»ä½å
·ä½ç对象ã主è¦çç¹ç¹ï¼
- å ±äº«æ§ï¼ææè¯¥ç±»çå®ä¾å ±äº«åä¸ä¸ªéæåéã妿ä¸ä¸ªå®ä¾ä¿®æ¹äºéæåéçå¼ï¼å ¶ä»å®ä¾ä¹ä¼çå°è¿ä¸ªæ´æ¹ã
- åå§åï¼éæåéå¨ç±»è¢«å è½½æ¶åå§åï¼åªä¼å¯¹å ¶è¿è¡ä¸æ¬¡åé å åã
- è®¿é®æ¹å¼ï¼éæåéå¯ä»¥ç´æ¥éè¿ç±»å访é®ï¼ä¹å¯ä»¥éè¿å®ä¾è®¿é®ï¼ä½æ¨è使ç¨ç±»åã
示ä¾ï¼
public class MyClass {
static int staticVar = 0; // éæåé
public MyClass() {
staticVar++; // æ¯å建ä¸ä¸ªå¯¹è±¡ï¼éæåéèªå¢
}
public static void printStaticVar() {
System.out.println("Static Var: " + staticVar);
}
}
// 使ç¨ç¤ºä¾
MyClass obj1 = new MyClass();
MyClass obj2 = new MyClass();
MyClass.printStaticVar(); // è¾åº Static Var: 2
éææ¹æ³
éææ¹æ³æ¯å¨ç±»ä¸ä½¿ç¨staticå
³é®å声æçæ¹æ³ã类似äºéæåéï¼éææ¹æ³ä¹å±äºç±»ï¼è䏿¯ä»»ä½å
·ä½ç对象ã主è¦çç¹ç¹ï¼
- æ å®ä¾ä¾èµï¼éææ¹æ³å¯ä»¥å¨æ²¡æå建类å®ä¾çæ åµä¸è°ç¨ã对äºéææ¹æ³æ¥è¯´ï¼ä¸è½ç´æ¥è®¿é®ééæçæååéææ¹æ³ï¼å ä¸ºéææ¹æ³æ²¡æä¸ä¸æçå®ä¾ã
- 访é®éææåï¼éææ¹æ³å¯ä»¥ç´æ¥è°ç¨å ¶ä»éæåéåéææ¹æ³ï¼ä½ä¸è½ç´æ¥è®¿é®ééææåã
- 夿æ§ï¼éææ¹æ³ä¸æ¯æéåï¼Overrideï¼ï¼ä½å¯ä»¥è¢«éèï¼Hideï¼ã
public class MyClass {
static int count = 0;
// éææ¹æ³
public static void incrementCount() {
count++;
}
public static void displayCount() {
System.out.println("Count: " + count);
}
}
// 使ç¨ç¤ºä¾
MyClass.incrementCount(); // è°ç¨éææ¹æ³
MyClass.displayCount(); // è¾åº Count: 1
使ç¨åºæ¯
- éæåéï¼å¸¸ç¨äºéè¦å¨ææå¯¹è±¡é´å ±äº«çæ°æ®ï¼å¦è®¡æ°å¨ã常éçã
- éææ¹æ³ï¼å¸¸ç¨äºå©ææ¹æ³ï¼utility methodsï¼ãè·å类级å«çä¿¡æ¯æè æ¯æ²¡æä¾èµäºå®ä¾çæ°æ®å¤çã
# ééæå é¨ç±»åéæå é¨ç±»çåºå«ï¼
åºå«å æ¬ï¼
- ééæå é¨ç±»ä¾èµäºå¤é¨ç±»çå®ä¾ï¼èéæå é¨ç±»ä¸ä¾èµäºå¤é¨ç±»çå®ä¾ã
- ééæå é¨ç±»å¯ä»¥è®¿é®å¤é¨ç±»çå®ä¾åéåæ¹æ³ï¼èéæå é¨ç±»åªè½è®¿é®å¤é¨ç±»çéææåã
- ééæå é¨ç±»ä¸è½å®ä¹éææåï¼èéæå é¨ç±»å¯ä»¥å®ä¹éææåã
- ééæå é¨ç±»å¨å¤é¨ç±»å®ä¾ååæè½å®ä¾åï¼èéæå é¨ç±»å¯ä»¥ç¬ç«å®ä¾åã
- ééæå é¨ç±»å¯ä»¥è®¿é®å¤é¨ç±»çç§ææåï¼èéæå é¨ç±»ä¸è½ç´æ¥è®¿é®å¤é¨ç±»çç§ææåï¼éè¦éè¿å®ä¾åå¤é¨ç±»æ¥è®¿é®ã
# ééæå é¨ç±»å¯ä»¥ç´æ¥è®¿é®å¤é¨æ¹æ³ï¼ç¼è¯å¨æ¯æä¹åå°çï¼
ééæå é¨ç±»å¯ä»¥ç´æ¥è®¿é®å¤é¨æ¹æ³æ¯å 为ç¼è¯å¨å¨çæåèç æ¶ä¼ä¸ºééæå é¨ç±»ç»´æ¤ä¸ä¸ªæåå¤é¨ç±»å®ä¾çå¼ç¨ã
è¿ä¸ªå¼ç¨ä½¿å¾ééæå é¨ç±»è½å¤è®¿é®å¤é¨ç±»çå®ä¾åéåæ¹æ³ãç¼è¯å¨ä¼å¨çæééæå é¨ç±»çæé æ¹æ³æ¶ï¼å°å¤é¨ç±»å®ä¾ä½ä¸ºåæ°ä¼ å ¥ï¼å¹¶å¨å é¨ç±»çå®ä¾åè¿ç¨ä¸å»ºç«å¤é¨ç±»å®ä¾ä¸å é¨ç±»å®ä¾ä¹é´çèç³»ï¼ä»èå®ç°ç´æ¥è®¿é®å¤é¨æ¹æ³çåè½ã
# å ³é®å
# Java ä¸ final ä½ç¨æ¯ä»ä¹ï¼
finalå
³é®åä¸»è¦æä»¥ä¸ä¸ä¸ªæ¹é¢çä½ç¨ï¼ç¨äºä¿®é¥°ç±»ãæ¹æ³ååéã
- 修饰类ï¼å½
final修饰ä¸ä¸ªç±»æ¶ï¼è¡¨ç¤ºè¿ä¸ªç±»ä¸è½è¢«ç»§æ¿ï¼æ¯ç±»ç»§æ¿ä½ç³»ä¸çæç»å½¢æãä¾å¦ï¼Java ä¸çString类就æ¯ç¨final修饰çï¼è¿ä¿è¯äºStringç±»çä¸å¯åæ§åå®å ¨æ§ï¼é²æ¢å ¶ä»ç±»éè¿ç»§æ¿æ¥æ¹åStringç±»çè¡ä¸ºåç¹æ§ã - ä¿®é¥°æ¹æ³ï¼ç¨
finalä¿®é¥°çæ¹æ³ä¸è½å¨åç±»ä¸è¢«éåãæ¯å¦ï¼java.lang.Objectç±»ä¸çgetClassæ¹æ³å°±æ¯finalçï¼å 为è¿ä¸ªæ¹æ³çè¡ä¸ºæ¯ç± Java èææºåºå±å®ç°æ¥ä¿è¯çï¼ä¸åºè¯¥è¢«å类修æ¹ã - 修饰åéï¼å½
finalä¿®é¥°åºæ¬æ°æ®ç±»åçåéæ¶ï¼è¯¥åé䏿¦è¢«èµå¼å°±ä¸è½åæ¹åãä¾å¦ï¼final int num = 10;ï¼è¿éçnumå°±æ¯ä¸ä¸ªå¸¸éï¼ä¸è½åå¯¹å ¶è¿è¡éæ°èµå¼æä½ï¼å¦åä¼å¯¼è´ç¼è¯é误ã对äºå¼ç¨æ°æ®ç±»åï¼final修饰æå³çè¿ä¸ªå¼ç¨åéä¸è½åæåå ¶ä»å¯¹è±¡ï¼ä½å¯¹è±¡æ¬èº«çå 容æ¯å¯ä»¥æ¹åçãä¾å¦ï¼final StringBuilder sb = new StringBuilder("Hello");ï¼ä¸è½è®©sbåæåå ¶ä»StringBuilder对象ï¼ä½å¯ä»¥éè¿sb.append(" World");æ¥ä¿®æ¹å符串çå 容ã
# Java ä¸ staticçä½ç¨æ¯ä»ä¹ï¼
static å
³é®å主è¦ç¨äºä¿®é¥°ç±»çæåï¼åéãæ¹æ³ã代ç åï¼åå
é¨ç±»ï¼å
¶æ ¸å¿ä½ç¨æ¯å°æåä¸ç±»æ¬èº«å
³èï¼èéä¸ç±»çå®ä¾ï¼å¯¹è±¡ï¼å
³èãå
·ä½ä½ç¨å¦ä¸ï¼
1ã修饰åé
被 static 修饰çåéå±äºç±»æ¬èº«ï¼èéç±»çæä¸ªå®ä¾ãææå¯¹è±¡å
±äº«åä¸ä»½éæåéï¼å
åä¸åªåå¨ä¸ä»½å¯æ¬ãå¯ä»¥éè¿ ç±»å.åéå ç´æ¥è®¿é®ï¼æ éå建对象ï¼ä¹å¯éè¿å¯¹è±¡è®¿é®ï¼ä½ä¸æ¨èï¼ã
é常ç¨äºå卿æå¯¹è±¡å ±äº«çæ°æ®ï¼å¦å¸¸éã计æ°å¨çã
public class Student {
// éæåéï¼ææå¦çå
±äº«åä¸ä¸ªå¦æ ¡åç§°ï¼
public static String schoolName = "é³å
ä¸å¦";
// å®ä¾åéï¼æ¯ä¸ªå¦çæèªå·±çå§åï¼
private String name;
}
// 访é®éæåé
public class Test {
public static void main(String[] args) {
System.out.println(Student.schoolName); // ç´æ¥éè¿ç±»å访é®
}
}
2ãä¿®é¥°æ¹æ³
éææ¹æ³å±äºç±»ï¼ä¸å±äºä»»ä½å®ä¾ï¼å æ¤ä¸è½ç´æ¥è®¿é®ç±»ä¸çééææåï¼åé / æ¹æ³ï¼ï¼å 为ééææåä¾èµäºå¯¹è±¡åå¨ï¼ï¼ä½å¯ä»¥è®¿é®éææåãéè¿ ç±»å.æ¹æ³å ç´æ¥è°ç¨ï¼æ éå建对象ã
é常ç¨äºå·¥å
·ç±»æ¹æ³ï¼å¦ Math.random()ï¼ã工忹æ³çï¼ä¸éè¦ä¾èµå¯¹è±¡ç¶æå³å¯å®ææä½ã
public class MathUtils {
// éææ¹æ³ï¼æ éå建对象å³å¯è°ç¨ï¼
public static int add(int a, int b) {
return a + b;
}
}
// è°ç¨éææ¹æ³
public class Test {
public static void main(String[] args) {
int result = MathUtils.add(2, 3); // ç´æ¥éè¿ç±»åè°ç¨
}
}
3ã修饰代ç å
éæä»£ç åå¨ç±»å è½½æ¶æ§è¡ï¼ä¸åªæ§è¡ä¸æ¬¡ï¼ä¼äºå¯¹è±¡æé æ¹æ³ï¼ï¼ç¨äºåå§åéæåéææ§è¡ç±»çº§å«çé¢å¤çæä½ã
å¤ä¸ªéæä»£ç åæå®ä¹é¡ºåºæ§è¡ï¼ä¸å äºééæä»£ç ååæé æ¹æ³ã
public class Database {
private static String url;
// éæä»£ç åï¼åå§åéæåé
static {
url = "jdbc:mysql://localhost:3306/test";
System.out.println("æ°æ®åºè¿æ¥å°ååå§å宿");
}
}
4ã修饰å é¨ç±»
éæå é¨ç±»ä¸ä¾èµäºå¤é¨ç±»çå®ä¾ï¼å¯ä»¥ç¬ç«åå¨ï¼ä¸è½ç´æ¥è®¿é®å¤é¨ç±»çééææåï¼ééè¿å¤é¨ç±»å®ä¾è®¿é®ï¼ã
å½å é¨ç±»ä¸å¤é¨ç±»çå®ä¾æ å ³æ¶ä½¿ç¨ï¼é¿å å é¨ç±»ææå¤é¨ç±»çå¼ç¨å¯¼è´çå åæ³æ¼ã
public class OuterClass {
private static int staticVar = 10;
private int instanceVar = 20;
// éæå
é¨ç±»
public static class StaticInnerClass {
public void print() {
System.out.println(staticVar); // å¯è®¿é®å¤é¨ç±»éæåé
// System.out.println(instanceVar); // é误ï¼ä¸è½ç´æ¥è®¿é®ééæåé
}
}
}
// 使ç¨éæå
é¨ç±»
public class Test {
public static void main(String[] args) {
OuterClass.StaticInnerClass inner = new OuterClass.StaticInnerClass();
inner.print();
}
}
# æ·±æ·è´åæµ æ·è´
# æ·±æ·è´åæµ æ·è´çåºå«ï¼

- æµ æ·è´æ¯æåªå¤å¶å¯¹è±¡æ¬èº«åå ¶å é¨çå¼ç±»ååæ®µï¼ä½ä¸ä¼å¤å¶å¯¹è±¡å é¨çå¼ç¨ç±»ååæ®µãæ¢å¥è¯è¯´ï¼æµ æ·è´åªæ¯å建ä¸ä¸ªæ°ç对象ï¼ç¶åå°å对象çåæ®µå¼å¤å¶å°æ°å¯¹è±¡ä¸ï¼ä½å¦æå对象å 鍿å¼ç¨ç±»åçåæ®µï¼åªæ¯å°å¼ç¨å¤å¶å°æ°å¯¹è±¡ä¸ï¼ä¸¤ä¸ªå¯¹è±¡æåçæ¯åä¸ä¸ªå¼ç¨å¯¹è±¡ã
- æ·±æ·è´æ¯æå¨å¤å¶å¯¹è±¡çåæ¶ï¼å°å¯¹è±¡å é¨çææå¼ç¨ç±»ååæ®µçå 容ä¹å¤å¶ä¸ä»½ï¼è䏿¯å ±äº«å¼ç¨ãæ¢å¥è¯è¯´ï¼æ·±æ·è´ä¼éå½å¤å¶å¯¹è±¡å 鍿æå¼ç¨ç±»åçåæ®µï¼çæä¸ä¸ªå ¨æ°ç对象以åå ¶å é¨çææå¯¹è±¡ã
# å®ç°æ·±æ·è´çä¸ç§æ¹æ³æ¯ä»ä¹ï¼
å¨ Java ä¸ï¼å®ç°å¯¹è±¡æ·±æ·è´çæ¹æ³æä»¥ä¸å ç§ä¸»è¦æ¹å¼ï¼
å®ç° Cloneable æ¥å£å¹¶éå clone() æ¹æ³
è¿ç§æ¹æ³è¦æ±å¯¹è±¡åå ¶ææå¼ç¨ç±»ååæ®µé½å®ç° Cloneable æ¥å£ï¼å¹¶ä¸éå clone() æ¹æ³ãå¨ clone() æ¹æ³ä¸ï¼éè¿éå½å éå¼ç¨ç±»ååæ®µæ¥å®ç°æ·±æ·è´ã
class MyClass implements Cloneable {
private String field1;
private NestedClass nestedObject;
@Override
protected Object clone() throws CloneNotSupportedException {
MyClass cloned = (MyClass) super.clone();
cloned.nestedObject = (NestedClass) nestedObject.clone(); // æ·±æ·è´å
é¨çå¼ç¨å¯¹è±¡
return cloned;
}
}
class NestedClass implements Cloneable {
private int nestedField;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
使ç¨åºåååååºåå
éè¿å°å¯¹è±¡åºåå为åèæµï¼åä»åèæµååºåå为对象æ¥å®ç°æ·±æ·è´ãè¦æ±å¯¹è±¡åå ¶ææå¼ç¨ç±»ååæ®µé½å®ç° Serializable æ¥å£ã
import java.io.*;
class MyClass implements Serializable {
private String field1;
private NestedClass nestedObject;
public MyClass deepCopy() {
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
oos.flush();
oos.close();
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return (MyClass) ois.readObject();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
return null;
}
}
}
class NestedClass implements Serializable {
private int nestedField;
}
æå¨éå½å¤å¶
é对ç¹å®å¯¹è±¡ç»æï¼æå¨éå½å¤å¶å¯¹è±¡åå ¶å¼ç¨ç±»ååæ®µãéç¨äºå¯¹è±¡ç»æå¤æåº¦ä¸é«çæ åµã
class MyClass {
private String field1;
private NestedClass nestedObject;
public MyClass deepCopy() {
MyClass copy = new MyClass();
copy.setField1(this.field1);
copy.setNestedObject(this.nestedObject.deepCopy());
return copy;
}
}
class NestedClass {
private int nestedField;
public NestedClass deepCopy() {
NestedClass copy = new NestedClass();
copy.setNestedField(this.nestedField);
return copy;
}
}
# æ³å
# ä»ä¹æ¯æ³åï¼
æ³åæ¯ Java ç¼ç¨è¯è¨ä¸çä¸ä¸ªéè¦ç¹æ§ï¼å®å è®¸ç±»ãæ¥å£åæ¹æ³å¨å®ä¹æ¶ä½¿ç¨ä¸ä¸ªæå¤ä¸ªç±»ååæ°ï¼è¿äºç±»ååæ°å¨ä½¿ç¨æ¶å¯ä»¥è¢«æå®ä¸ºå ·ä½çç±»åã
æ³åç主è¦ç®çæ¯å¨ç¼è¯æ¶æä¾æ´å¼ºçç±»åæ£æ¥ï¼å¹¶ä¸å¨ç¼è¯åè½å¤ä¿çç±»åä¿¡æ¯ï¼é¿å äºå¨è¿è¡æ¶åºç°ç±»å转æ¢å¼å¸¸ã
为ä»ä¹éè¦æ³åï¼
- éç¨äºå¤ç§æ°æ®ç±»åæ§è¡ç¸åç代ç
private static int add(int a, int b) {
System.out.println(a + "+" + b + "=" + (a + b));
return a + b;
}
private static float add(float a, float b) {
System.out.println(a + "+" + b + "=" + (a + b));
return a + b;
}
private static double add(double a, double b) {
System.out.println(a + "+" + b + "=" + (a + b));
return a + b;
}
å¦ææ²¡ææ³åï¼è¦å®ç°ä¸åç±»åçå æ³ï¼æ¯ç§ç±»åé½éè¦éè½½ä¸ä¸ªaddæ¹æ³ï¼éè¿æ³åï¼æä»¬å¯ä»¥å¤ç¨ä¸ºä¸ä¸ªæ¹æ³ï¼
private static <T extends Number> double add(T a, T b) {
System.out.println(a + "+" + b + "=" + (a.doubleValue() + b.doubleValue()));
return a.doubleValue() + b.doubleValue();
}
- æ³åä¸çç±»åå¨ä½¿ç¨æ¶æå®ï¼ä¸éè¦å¼ºå¶ç±»å转æ¢ï¼ç±»åå®å ¨ï¼ç¼è¯å¨ä¼æ£æ¥ç±»åï¼
çä¸è¿ä¸ªä¾åï¼
List list = new ArrayList();
list.add("xxString");
list.add(100d);
list.add(new Person());
æä»¬å¨ä½¿ç¨ä¸è¿°listä¸ï¼listä¸çå ç´ é½æ¯Objectç±»åï¼æ æ³çº¦æå ¶ä¸çç±»åï¼ï¼æä»¥å¨ååºéåå ç´ æ¶éè¦äººä¸ºç强å¶ç±»å转åå°å ·ä½çç®æ ç±»åï¼ä¸å¾å®¹æåºç°java.lang.ClassCastExceptionå¼å¸¸ã
å¼å ¥æ³åï¼å®å°æä¾ç±»åç约æï¼æä¾ç¼è¯åçæ£æ¥ï¼
List<String> list = new ArrayList<String>();
// listä¸åªè½æ¾String, ä¸è½æ¾å
¶å®ç±»åçå
ç´
# 对象
# javaå建对象æåªäºæ¹å¼ï¼
å¨Javaä¸ï¼åå»ºå¯¹è±¡çæ¹å¼æå¤ç§ï¼å¸¸è§çå æ¬ï¼
1ã使ç¨newå ³é®åï¼è¿æ¯æå¸¸è§ãæåºç¡çå建对象æ¹å¼ãéè¿è°ç¨ç±»çæé 卿¥å®ä¾å对象ã
// å®ä¹ä¸ä¸ªç±»
public class Person {
private String name;
public Person() {} // é»è®¤æé å¨
public Person(String name) { // 带åæé å¨
this.name = name;
}
public void sayHello() {
System.out.println("Hello, " + name);
}
}
// ä½¿ç¨ new å建对象
public class Main {
public static void main(String[] args) {
Person person1 = new Person(); // è°ç¨æ åæé
Person person2 = new Person("Alice"); // è°ç¨æåæé
person2.sayHello(); // è¾åº: Hello, Alice
}
}
ä¼ç¹æ¯ç®åãç´æ¥ãæç¡®ãç¼ºç¹æ¯ç´§å¯è¦åï¼å¿ é¡»ç¥éå ·ä½çç±»åã
2ã使ç¨Classç±»çnewInstance()æ¹æ³ï¼éè¿ Java çåå° APIï¼å¨è¿è¡æ¶å¨æå°å建对象ãè¿ç§æ¹å¼ä¸éè¦å¨ç¼è¯æ¶ç¥éå ·ä½çç±»ã
注æï¼Class.newInstance() å¨ JDK 9 å被æ è®°ä¸ºè¿æ¶ï¼å 为å®åªè½è°ç¨æ åå
¬ææé å¨ï¼ä¸ä¼æåºææå¼å¸¸ãConstructor.newInstance() æ´å¼ºå¤§ãæ´çµæ´»ãMyClass obj = (MyClass) Class.forName("com.example.MyClass").newInstance();
åºç¨åºæ¯ï¼æ¡æ¶è®¾è®¡ï¼å¦ Spring ç IOC 容å¨ï¼ã卿代ççã
注æï¼Class.newInstance() å¨ JDK 9 å被æ è®°ä¸ºè¿æ¶ï¼å 为å®åªè½è°ç¨æ åå
¬ææé å¨ï¼ä¸ä¼æåºææå¼å¸¸ãConstructor.newInstance() æ´å¼ºå¤§ãæ´çµæ´»ã
使ç¨Constructorç±»çnewInstance()æ¹æ³ï¼åæ ·æ¯éè¿åå°æºå¶ï¼å¯ä»¥ä½¿ç¨Constructorç±»çnewInstance()æ¹æ³å建对象ã
Constructor<MyClass> constructor = MyClass.class.getConstructor();
MyClass obj = constructor.newInstance();
3ã使ç¨clone()æ¹æ³ï¼éè¿å®ç° Cloneable æ¥å£å¹¶éå Object ç±»ç clone() æ¹æ³ï¼å¯ä»¥åºäºä¸ä¸ªç°æå¯¹è±¡ï¼ååï¼å建ä¸ä¸ªæ°ç坿¬å¯¹è±¡ã
// å®ç° Cloneable æ¥å£
public class Person implements Cloneable {
private String name;
// ... æé å¨åå
¶ä»æ¹æ³ ...
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone(); // æµ
æ·è´
}
}
public class Main {
public static void main(String[] args) {
Person original = new Person("Charlie");
try {
Person copy = (Person) original.clone(); // åå»ºå¯æ¬
copy.sayHello(); // è¾åº: Hello, Charlie
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
Object.clone() é»è®¤æ¯æµ
æ·è´ï¼å¯¹äºå¼ç¨ç±»åçåæ®µï¼å¤å¶çæ¯å¼ç¨å°åï¼è䏿¯å¼ç¨ç对象æ¬èº«ã妿éè¦æ·±æ·è´ï¼å¿
é¡»å¨ clone() æ¹æ³ä¸æå¨å¯¹å¼ç¨å¯¹è±¡è¿è¡å
éã
4ã使ç¨ååºååï¼éè¿ ObjectInputStream ä»ä¸ä¸ªåèæµï¼éå¸¸æ¯æä»¶æç½ç»ï¼ä¸é建ä¸ä¸ªå¯¹è±¡ã
import java.io.*;
// å¿
é¡»å®ç° Serializable æ¥å£
public class Person implements Serializable {
private String name;
// ... æé å¨åå
¶ä»æ¹æ³ ...
}
public class Main {
public static void main(String[] args) {
Person personToSave = new Person("David");
// åºååå¯¹è±¡å°æä»¶
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.dat"))) {
oos.writeObject(personToSave);
} catch (IOException e) {
e.printStackTrace();
}
// 仿件ååºåå对象
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.dat"))) {
Person restoredPerson = (Person) ois.readObject(); // å建æ°å¯¹è±¡
restoredPerson.sayHello(); // è¾åº: Hello, David
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
ç¹ç¹æ¯ä¸ä¼è°ç¨ç±»ç任使é å¨ï¼ç±»å¿
é¡»å®ç° java.io.Serializable æ¥å£ã
5ã使ç¨å·¥å模å¼ï¼è¿æ¯ä¸ç§è®¾è®¡æ¨¡å¼ï¼ä¸ç´æ¥ä½¿ç¨ newï¼èæ¯éè¿ä¸ä¸ªæ¹æ³æ¥è¿å对象å®ä¾ãgetInstance()ãvalueOf() ç齿¯å¸¸è§ç工忹æ³ã
public class Person {
private String name;
private Person(String name) { // æé å¨å¯ä»¥æ¯ç§æç
this.name = name;
}
// éæå·¥åæ¹æ³
public static Person createPerson(String name) {
// è¿éå¯ä»¥åä¸äºé¢å¤çé»è¾ï¼æ¯å¦ç¼åãæ¥å¿ãè¿ååç±»å®ä¾ç
return new Person(name);
}
}
public class Main {
public static void main(String[] args) {
// 䏿¯ç¨ newï¼èæ¯ç¨å·¥åæ¹æ³å建
Person person = Person.createPerson("Eva");
person.sayHello();
}
}
ä¼ç¹æ¯å°å¯¹è±¡çå建ä¸ä½¿ç¨å离ï¼éä½è¦åï¼è¿å¯ä»¥éèå建对象ç夿é»è¾ï¼å¦æ± åææ¯ãç¼åï¼ã
Java æ ååºä¸çä¾åï¼Integer.valueOf(int)ï¼Calendar.getInstance()ã
æåæ¥ä¸ªï¼æ»ç»å¯¹æ¯ï¼
| æ¹å¼ | æ ¸å¿åç | æ¯å¦è°ç¨æé å¨ï¼ | ç¹ç¹ä¸åºç¨åºæ¯ |
|---|---|---|---|
new å
³é®å | JVM æä»¤ | æ¯ | ææ åãæå¸¸ç¨ï¼ç´§å¯è¦å |
| åå° | è¿è¡æ¶ç±»ä¿¡æ¯ | æ¯ (Constructor) | çµæ´»ï¼è§£è¦ï¼ç¨äºæ¡æ¶ |
clone() | å¤å¶ç°æå¯¹è±¡ | å¦ | åºäºåååå»ºå¯æ¬ï¼éå®ç° Cloneable |
| ååºåå | ä»åèæµæ¢å¤ | å¦ | ç¨äºæä¹
ååç½ç»éä¿¡ï¼éå®ç° Serializable |
| 工忍¡å¼ | æ¹æ³å°è£
new | æ¯ (卿¹æ³å ) | è§£è¦ï¼éèå建é»è¾ï¼æ§å¶å®ä¾ |
# Javaå建对象é¤äºnewè¿æå«çä»ä¹æ¹å¼?
- éè¿åå°å建对象ï¼éè¿ Java çåå°æºå¶å¯ä»¥å¨è¿è¡æ¶å¨æå°å建对象ãå¯ä»¥ä½¿ç¨ Class ç±»ç newInstance() æ¹æ³æè éè¿ Constructor ç±»æ¥å建对象ã
public class MyClass {
public MyClass() {
// Constructor
}
}
public class Main {
public static void main(String[] args) throws Exception {
Class<?> clazz = MyClass.class;
MyClass obj = (MyClass) clazz.newInstance();
}
}
- éè¿ååºååå建对象ï¼éè¿å°å¯¹è±¡åºååï¼ä¿åå°æä»¶æç½ç»ä¼ è¾ï¼ç¶ååååºååï¼ä»æä»¶æç½ç»ä¼ è¾ä¸è¯»å对象ï¼çæ¹å¼æ¥å建对象ï¼å¯¹è±¡è½è¢«åºåååååºååçåææ¯ç±»å®ç°Serializableæ¥å£ã
import java.io.*;
public class MyClass implements Serializable {
// Class definition
}
public class Main {
public static void main(String[] args) throws Exception {
// Serialize object
MyClass obj = new MyClass();
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("object.ser"));
out.writeObject(obj);
out.close();
// Deserialize object
ObjectInputStream in = new ObjectInputStream(new FileInputStream("object.ser"));
MyClass newObj = (MyClass) in.readObject();
in.close();
}
}
- éè¿cloneåå»ºå¯¹è±¡ï¼ææ Java 对象é½ç»§æ¿èª Object ç±»ï¼Object ç±»ä¸æä¸ä¸ª clone() æ¹æ³ï¼å¯ä»¥ç¨æ¥å建对象ç坿¬ï¼è¦ä½¿ç¨ clone æ¹æ³ï¼æä»¬å¿ é¡»å å®ç° Cloneable æ¥å£å¹¶å®ç°å ¶å®ä¹ç clone æ¹æ³ã
public class MyClass implements Cloneable {
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
MyClass obj1 = new MyClass();
MyClass obj2 = (MyClass) obj1.clone();
}
}
# Newåºç对象ä»ä¹æ¶ååæ¶ï¼
éè¿è¿å
³é®ånewå建ç对象ï¼ç±Javaçåå¾åæ¶å¨ï¼Garbage Collectorï¼è´è´£åæ¶ãåå¾åæ¶å¨ç工使¯å¨ç¨åºè¿è¡è¿ç¨ä¸èªå¨è¿è¡çï¼å®ä¼å¨ææ§å°æ£æµä¸å被å¼ç¨ç对象ï¼å¹¶å°å
¶åæ¶éæ¾å
åã
å ·ä½æ¥è¯´ï¼Java对象çåæ¶æ¶æºæ¯ç±åå¾åæ¶å¨æ ¹æ®ä¸äºç®æ³æ¥å³å®çï¼ä¸»è¦æä»¥ä¸å ç§æ åµï¼
- å¼ç¨è®¡æ°æ³ï¼æä¸ªå¯¹è±¡çå¼ç¨è®¡æ°ä¸º0æ¶ï¼è¡¨ç¤ºè¯¥å¯¹è±¡ä¸å被å¼ç¨ï¼å¯ä»¥è¢«åæ¶ã
- å¯è¾¾æ§åæç®æ³ï¼ä»æ ¹å¯¹è±¡ï¼å¦æ¹æ³åºä¸çç±»éæå±æ§ãæ¹æ³ä¸çå±é¨åéçï¼åºåï¼éè¿å¯¹è±¡ä¹é´çå¼ç¨é¾è¿è¡éåï¼å¦æåå¨ä¸æ¡å¼ç¨é¾å°è¾¾æä¸ªå¯¹è±¡ï¼å说æè¯¥å¯¹è±¡æ¯å¯è¾¾çï¼åä¹ä¸å¯è¾¾ï¼ä¸å¯è¾¾ç对象å°è¢«åæ¶ã
- ç»ç»å¨ï¼Finalizerï¼ï¼å¦æå¯¹è±¡éåäº
finalize()æ¹æ³ï¼åå¾åæ¶å¨ä¼å¨åæ¶è¯¥å¯¹è±¡ä¹åè°ç¨finalize()æ¹æ³ï¼å¯¹è±¡å¯ä»¥å¨finalize()æ¹æ³ä¸è¿è¡ä¸äºæ¸ çæä½ãç¶èï¼ç»ç»å¨æºå¶ç使ç¨ä¸è¢«æ¨èï¼å 为å®çæ§è¡æ¶é´æ¯ä¸ç¡®å®çï¼å¯è½ä¼å¯¼è´ä¸å¯é¢æµçæ§è½é®é¢ã
# å¦ä½è·åç§æå¯¹è±¡ï¼
å¨ Java ä¸ï¼ç§æå¯¹è±¡é常æçæ¯ç±»ä¸è¢«å£°æä¸º private çæååéææ¹æ³ãç±äº private 访é®ä¿®é¥°ç¬¦çéå¶ï¼è¿äºæååªè½å¨å
¶æå¨çç±»å
é¨è¢«è®¿é®ã
ä¸è¿ï¼å¯ä»¥éè¿ä¸é¢ä¸¤ç§æ¹å¼æ¥é´æ¥è·åç§æå¯¹è±¡ã
- 使ç¨å
Œ
±è®¿é®å¨æ¹æ³ï¼getter æ¹æ³ï¼ï¼å¦æç±»ç设计è
éµå¾ªè¯å¥½çç¼ç¨è§èï¼é常ä¼ä¸ºç§ææååéæä¾å
Œ
±ç访é®å¨æ¹æ³ï¼å³
getteræ¹æ³ï¼ï¼éè¿è°ç¨è¿äºæ¹æ³å¯ä»¥å®å ¨å°è·åç§æå¯¹è±¡ã
class MyClass {
// ç§ææååé
private String privateField = "ç§æåæ®µçå¼";
// å
Œ
±ç getter æ¹æ³
public String getPrivateField() {
return privateField;
}
}
public class Main {
public static void main(String[] args) {
MyClass obj = new MyClass();
// éè¿è°ç¨ getter æ¹æ³è·åç§æå¯¹è±¡
String value = obj.getPrivateField();
System.out.println(value);
}
}
- åå°æºå¶ãåå°æºå¶å
许å¨è¿è¡æ¶æ£æ¥åä¿®æ¹ç±»ãæ¹æ³ãåæ®µçä¿¡æ¯ï¼éè¿åå°å¯ä»¥ç»è¿
private访é®ä¿®é¥°ç¬¦çéå¶æ¥è·åç§æå¯¹è±¡ã
import java.lang.reflect.Field;
class MyClass {
private String privateField = "ç§æåæ®µçå¼";
}
public class Main {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
MyClass obj = new MyClass();
// è·å Class 对象
Class<?> clazz = obj.getClass();
// è·åç§æåæ®µ
Field privateField = clazz.getDeclaredField("privateField");
// 设置å¯è®¿é®æ§
privateField.setAccessible(true);
// è·åç§æåæ®µçå¼
String value = (String) privateField.get(obj);
System.out.println(value);
}
}
# åå°
# ä»ä¹æ¯åå°ï¼
Java åå°æºå¶æ¯å¨è¿è¡ç¶æä¸ï¼å¯¹äºä»»æä¸ä¸ªç±»ï¼é½è½å¤ç¥éè¿ä¸ªç±»ä¸çææå±æ§åæ¹æ³ï¼å¯¹äºä»»æä¸ä¸ªå¯¹è±¡ï¼é½è½å¤è°ç¨å®çä»»æä¸ä¸ªæ¹æ³å屿§ï¼è¿ç§å¨æè·åçä¿¡æ¯ä»¥å卿è°ç¨å¯¹è±¡çæ¹æ³çåè½ç§°ä¸º Java è¯è¨çåå°æºå¶ã
åå°å ·æä»¥ä¸ç¹æ§ï¼
- è¿è¡æ¶ç±»ä¿¡æ¯è®¿é®ï¼åå°æºå¶å 许ç¨åºå¨è¿è¡æ¶è·åç±»ç宿´ç»æä¿¡æ¯ï¼å æ¬ç±»åãå åãç¶ç±»ãå®ç°çæ¥å£ãæé 彿°ãæ¹æ³ååæ®µçã
- å¨æå¯¹è±¡å建ï¼å¯ä»¥ä½¿ç¨åå°API卿å°å建对象å®ä¾ï¼å³ä½¿å¨ç¼è¯æ¶ä¸ç¥éå ·ä½çç±»åãè¿æ¯éè¿Classç±»çnewInstance()æ¹æ³æConstructor对象çnewInstance()æ¹æ³å®ç°çã
- å¨ææ¹æ³è°ç¨ï¼å¯ä»¥å¨è¿è¡æ¶å¨æå°è°ç¨å¯¹è±¡çæ¹æ³ï¼å æ¬ç§ææ¹æ³ãè¿éè¿Methodç±»çinvoke()æ¹æ³å®ç°ï¼å è®¸ä½ ä¼ å ¥å¯¹è±¡å®ä¾å忰弿¥æ§è¡æ¹æ³ã
- 访é®åä¿®æ¹å段å¼ï¼åå°è¿å 许ç¨åºå¨è¿è¡æ¶è®¿é®åä¿®æ¹å¯¹è±¡çåæ®µå¼ï¼å³ä½¿æ¯ç§æçãè¿æ¯éè¿Fieldç±»çget()åset()æ¹æ³å®æçã

# åå°å¨ä½ å¹³æ¶åä»£ç æè æ¡æ¶ä¸çåºç¨åºæ¯æåªäº?
å è½½æ°æ®åºé©±å¨
æä»¬ç项ç®åºå±æ°æ®åºææ¶æ¯ç¨mysqlï¼ææ¶ç¨oracleï¼éè¦å¨æå°æ ¹æ®å®é æ åµå 载驱å¨ç±»ï¼è¿ä¸ªæ¶ååå°å°±æç¨äºï¼å设 com.mikechen.java.myqlConnectionï¼com.mikechen.java.oracleConnectionè¿ä¸¤ä¸ªç±»æä»¬è¦ç¨ã
è¿æ¶åæä»¬å¨ä½¿ç¨ JDBC è¿æ¥æ°æ®åºæ¶ä½¿ç¨ Class.forName()éè¿åå°å è½½æ°æ®åºç驱å¨ç¨åºï¼å¦ææ¯mysqlåä¼ å ¥mysqlç驱å¨ç±»ï¼è妿æ¯oracleåä¼ å ¥çåæ°å°±åæå¦ä¸ä¸ªäºã
// DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
Class.forName("com.mysql.cj.jdbc.Driver");
é ç½®æä»¶å è½½
Spring æ¡æ¶ç IOCï¼å¨æå 载管ç Beanï¼ï¼Springéè¿é ç½®æä»¶é ç½®åç§åæ ·çbeanï¼ä½ éè¦ç¨å°åªäºbeanå°±é åªäºï¼spring容å¨å°±ä¼æ ¹æ®ä½ çéæ±å»å¨æå è½½ï¼ä½ çç¨åºå°±è½å¥å£®å°è¿è¡ã
Springéè¿XMLé 置模å¼è£ è½½Beançè¿ç¨ï¼
- å°ç¨åºä¸ææXMLæpropertiesé ç½®æä»¶å è½½å ¥å å
- Javaç±»éé¢è§£æxmlæè propertieséé¢çå 容ï¼å¾å°å¯¹åºå®ä½ç±»çåèç å符串以åç¸å ³ç屿§ä¿¡æ¯
- 使ç¨åå°æºå¶ï¼æ ¹æ®è¿ä¸ªå符串è·å¾æä¸ªç±»çClasså®ä¾
- 卿é ç½®å®ä¾ç屿§
é ç½®æä»¶
className=com.example.reflectdemo.TestInvoke
methodName=printlnState
å®ä½ç±»
public class TestInvoke {
private void printlnState(){
System.out.println("I am fine");
}
}
è§£æé ç½®æä»¶å 容
// è§£æxmlæpropertieséé¢çå
容ï¼å¾å°å¯¹åºå®ä½ç±»çåèç å符串以å屿§ä¿¡æ¯
public static String getName(String key) throws IOException {
Properties properties = new Properties();
FileInputStream in = new FileInputStream("D:\IdeaProjects\AllDemos\language-specification\src\main\resources\application.properties");
properties.load(in);
in.close();
return properties.getProperty(key);
}
å©ç¨åå°è·åå®ä½ç±»çClasså®ä¾ï¼å建å®ä½ç±»çå®ä¾å¯¹è±¡ï¼è°ç¨æ¹æ³
public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, IOException, ClassNotFoundException, InstantiationException {
// 使ç¨åå°æºå¶ï¼æ ¹æ®è¿ä¸ªå符串è·å¾Class对象
Class<?> c = Class.forName(getName("className"));
System.out.println(c.getSimpleName());
// è·åæ¹æ³
Method method = c.getDeclaredMethod(getName("methodName"));
// ç»è¿å®å
¨æ£æ¥
method.setAccessible(true);
// å建å®ä¾å¯¹è±¡
TestInvoke testInvoke = (TestInvoke)c.newInstance();
// è°ç¨æ¹æ³
method.invoke(testInvoke);
}
è¿è¡ç»æï¼

# 注解
# è½è®²ä¸è®²Java注解çåçåï¼
注解æ¬è´¨æ¯ä¸ä¸ªç»§æ¿äºAnnotationçç¹æ®æ¥å£ï¼å ¶å ·ä½å®ç°ç±»æ¯Javaè¿è¡æ¶çæç卿代çç±»ã
æä»¬éè¿åå°è·å注解æ¶ï¼è¿åçæ¯Javaè¿è¡æ¶çæç卿代ç对象ãéè¿ä»£ç对象è°ç¨èªå®ä¹æ³¨è§£çæ¹æ³ï¼ä¼æç»è°ç¨AnnotationInvocationHandlerçinvokeæ¹æ³ãè¯¥æ¹æ³ä¼ä»memberValuesè¿ä¸ªMapä¸ç´¢å¼åºå¯¹åºçå¼ãèmemberValuesçæ¥æºæ¯Java叏鿱 ã
# 对注解解æçåºå±å®ç°äºè§£åï¼
注解æ¬è´¨ä¸æ¯ä¸ç§ç¹æ®çæ¥å£ï¼å®ç»§æ¿èª java.lang.annotation.Annotation æ¥å£ï¼æä»¥æ³¨è§£ä¹å«å£°æå¼æ¥å£ï¼ä¾å¦ï¼å®ä¹ä¸ä¸ªç®åçæ³¨è§£ï¼
public @interface MyAnnotation {
String value();
}
ç¼è¯åï¼Java ç¼è¯å¨ä¼å°å
¶è½¬æ¢ä¸ºä¸ä¸ªç»§æ¿èª Annotation çæ¥å£ï¼å¹¶çæç¸åºçåèç æä»¶ã
æ ¹æ®æ³¨è§£çä½ç¨èå´ï¼Java 注解å¯ä»¥å为以ä¸å ç§ç±»åï¼
- æºç çº§å«æ³¨è§£ ï¼ä»
åå¨äºæºç ä¸ï¼ç¼è¯åä¸ä¼ä¿çï¼
@Retention(RetentionPolicy.SOURCE)ï¼ã - ç±»æä»¶çº§å«æ³¨è§£ ï¼ä¿çå¨
.classæä»¶ä¸ï¼ä½è¿è¡æ¶ä¸å¯è§ï¼@Retention(RetentionPolicy.CLASS)ï¼ã - è¿è¡æ¶æ³¨è§£ ï¼ä¿çå¨
.classæä»¶ä¸ï¼å¹¶ä¸å¯ä»¥éè¿åå°å¨è¿è¡æ¶è®¿é®ï¼@Retention(RetentionPolicy.RUNTIME)ï¼ã
åªæè¿è¡æ¶æ³¨è§£å¯ä»¥éè¿åå°æºå¶è¿è¡è§£æã
彿³¨è§£è¢«æ 记为 RUNTIME æ¶ï¼Java ç¼è¯å¨ä¼å¨çæç .class æä»¶ä¸ä¿å注解信æ¯ãè¿äºä¿¡æ¯åå¨å¨åèç ç屿§è¡¨ï¼Attribute Tableï¼ä¸ï¼å
·ä½å
æ¬ä»¥ä¸å
容ï¼
- RuntimeVisibleAnnotations ï¼åå¨è¿è¡æ¶å¯è§ç注解信æ¯ã
- RuntimeInvisibleAnnotations ï¼åå¨è¿è¡æ¶ä¸å¯è§ç注解信æ¯ã
- RuntimeVisibleParameterAnnotations å RuntimeInvisibleParameterAnnotations ï¼å卿¹æ³åæ°ä¸ç注解信æ¯ã
éè¿å·¥å
·ï¼å¦ javap -vï¼å¯ä»¥æ¥ç .class æä»¶ä¸ç注解信æ¯ã
注解çè§£æä¸»è¦ä¾èµäº Java çåå°æºå¶ã以䏿¯è§£ææ³¨è§£çåºæ¬æµç¨ï¼
1ãè·å注åä¿¡æ¯ï¼éè¿åå° API å¯ä»¥è·åç±»ãæ¹æ³ãåæ®µçå ç´ ä¸ç注解ãä¾å¦ï¼
Class<?> clazz = MyClass.class;
MyAnnotation annotation = clazz.getAnnotation(MyAnnotation.class);
if (annotation != null) {
System.out.println(annotation.value());
}
2ãåºå±åçï¼åå°æºå¶çæ ¸å¿ç±»æ¯ java.lang.reflect.AnnotatedElementï¼å®æ¯ææå¯ä»¥è¢«æ³¨è§£ä¿®é¥°çå
ç´ ï¼å¦ ClassãMethodãField çï¼çç¶æ¥å£ã该æ¥å£æä¾äºä»¥ä¸æ¹æ³ï¼
getAnnotation(Class<T> annotationClass)ï¼è·åæå®ç±»åçæ³¨è§£ãgetAnnotations()ï¼è·åæææ³¨è§£ãisAnnotationPresent(Class<? extends Annotation> annotationClass)ï¼å¤ææ¯å¦å 嫿宿³¨è§£ã
è¿äºæ¹æ³çåºå±å®ç°ä¾èµäº JVM æä¾çæ¬å°æ¹æ³ï¼Native Methodï¼ï¼ä¾å¦ï¼
native Annotation[] getDeclaredAnnotations0(boolean publicOnly);native <A extends Annotation> A getAnnotation(Class<A> annotationClass);
JVM å¨å 载类æ¶ä¼è§£æ .class æä»¶ä¸ç注解信æ¯ï¼å¹¶å°å
¶åå¨å¨å
åä¸ï¼ä¾åå°æºå¶ä½¿ç¨ã
å æ¤ï¼æ³¨è§£è§£æçåºå±å®ç°ä¸»è¦ä¾èµäº Java çåå°æºå¶ååèç æä»¶çåå¨ãéè¿ @Retention å
注解å¯ä»¥æ§å¶æ³¨è§£çä¿ççç¥ï¼å½ä½¿ç¨ RetentionPolicy.RUNTIME æ¶ï¼å¯ä»¥å¨è¿è¡æ¶éè¿åå° API æ¥è§£ææ³¨è§£ä¿¡æ¯ãå¨ JVM å±é¢ï¼ä¼ä»åèç æä»¶ä¸è¯»å注解信æ¯ï¼å¹¶å建注解ç代ç对象æ¥è·å注解ç屿§å¼ã
# Java注解çä½ç¨åå¢ï¼
注解çä½ç¨åï¼Scopeï¼æçæ¯æ³¨è§£å¯ä»¥åºç¨å¨åªäºç¨åºå ç´ ä¸ï¼ä¾å¦ç±»ãæ¹æ³ãåæ®µçãJava注解çä½ç¨åå¯ä»¥å为ä¸ç§ï¼
- 类级å«ä½ç¨åï¼ç¨äºæè¿°ç±»ç注解ï¼é常æ¾ç½®å¨ç±»å®ä¹çä¸é¢ï¼å¯ä»¥ç¨æ¥æå®ç±»çä¸äºå±æ§ï¼å¦ç±»ç访é®çº§å«ãç»§æ¿å ³ç³»ã注éçã
- æ¹æ³çº§å«ä½ç¨åï¼ç¨äºæè¿°æ¹æ³ç注解ï¼é常æ¾ç½®å¨æ¹æ³å®ä¹çä¸é¢ï¼å¯ä»¥ç¨æ¥æå®æ¹æ³çä¸äºå±æ§ï¼å¦æ¹æ³ç访é®çº§å«ãè¿åå¼ç±»åãå¼å¸¸ç±»åãæ³¨éçã
- åæ®µçº§å«ä½ç¨åï¼ç¨äºæè¿°åæ®µçæ³¨è§£ï¼é常æ¾ç½®å¨å段å®ä¹çä¸é¢ï¼å¯ä»¥ç¨æ¥æå®å段çä¸äºå±æ§ï¼å¦å段ç访é®çº§å«ãé»è®¤å¼ã注éçã
é¤äºè¿ä¸ç§ä½ç¨åï¼Javaè¿æä¾äºå ¶ä»ä¸äºæ³¨è§£ä½ç¨åï¼ä¾å¦æé 彿°ä½ç¨ååå±é¨åéä½ç¨åãè¿äºæ³¨è§£ä½ç¨åå¯ä»¥ç¨æ¥å¯¹æé 彿°åå±é¨åéè¿è¡æè¿°å注éã
# å¼å¸¸
# ä»ç»ä¸ä¸Javaå¼å¸¸
Javaå¼å¸¸ç±»å±æ¬¡ç»æå¾ï¼

Java çå¼å¸¸ä½ç³»ä¸»è¦åºäº Throwable åå
¶åç±»ãThrowable æä¸¤ä¸ªéè¦çåç±»ï¼Error å Exceptionï¼å®ä»¬åå«ä»£è¡¨äºä¸åç±»åçå¼å¸¸æ
åµã
Error(é误)ï¼ è¡¨ç¤ºè¿è¡ç¯å¢çé误ï¼é误æ¯ç¨åºæ æ³å¤çç严éé®é¢ï¼å¦èææºé误ã卿龿¥åºå¤±æçãç¨åºä¸åºè¯¥å°è¯æè·è¿ç±»é误ãä¾å¦ï¼OutOfMemoryErrorãStackOverflowErrorçãException(å¼å¸¸)ï¼ è¡¨ç¤ºç¨åºæ¬èº«å¯ä»¥å¤ççå¼å¸¸æ åµãå¼å¸¸å为两大类ï¼- éè¿è¡æ¶å¼å¸¸ï¼åæ£å¼å¸¸ï¼Checked Exceptionï¼ï¼ è¿ç±»å¼å¸¸å¨ç¼è¯æ¶å°±å¿
须被æè·æè
声ææåºãå®ä»¬é常æ¯å¤é¨é误ï¼å¦æä»¶ä¸åå¨ (
FileNotFoundException)ãç±»æªæ¾å° (ClassNotFoundException) çãéè¿è¡æ¶å¼å¸¸å¼ºå¶ç¨åºåå¤çè¿äºå¯è½åºç°çé®é¢ï¼å¢å¼ºäºç¨åºçå¥å£®æ§ã - è¿è¡æ¶å¼å¸¸ï¼é忣å¼å¸¸ï¼Unchecked Exception æ RuntimeExceptionï¼ï¼ è¿ç±»å¼å¸¸ç¹æ
RuntimeExceptionåå ¶åç±»ãå®ä¸Errorä¸èµ·ææäº Java ä¸çé忣å¼å¸¸å®¶æãè¿è¡æ¶å¼å¸¸ç±ç¨åºé»è¾é误导è´ï¼å¦ç©ºæéè®¿é® (NullPointerException)ãæ°ç»è¶ç (ArrayIndexOutOfBoundsException) çãè¿è¡æ¶å¼å¸¸æ¯ä¸éè¦å¨ç¼è¯æ¶å¼ºå¶æè·æå£°æçã
- éè¿è¡æ¶å¼å¸¸ï¼åæ£å¼å¸¸ï¼Checked Exceptionï¼ï¼ è¿ç±»å¼å¸¸å¨ç¼è¯æ¶å°±å¿
须被æè·æè
声ææåºãå®ä»¬é常æ¯å¤é¨é误ï¼å¦æä»¶ä¸åå¨ (
# Javaå¼å¸¸å¤çæåªäºï¼
å¼å¸¸å¤çæ¯éè¿ä½¿ç¨try-catchè¯å¥åæ¥æè·åå¤çå¼å¸¸ã以䏿¯Javaä¸å¸¸ç¨çå¼å¸¸å¤çæ¹å¼ï¼
- try-catchè¯å¥åï¼ç¨äºæè·å¹¶å¤çå¯è½æåºçå¼å¸¸ãtryåä¸å å«å¯è½æåºå¼å¸¸ç代ç ï¼catchåç¨äºæè·å¹¶å¤çç¹å®ç±»åçå¼å¸¸ãå¯ä»¥æå¤ä¸ªcatch忥å¤çä¸åç±»åçå¼å¸¸ã
try {
// å¯è½æåºå¼å¸¸ç代ç
} catch (ExceptionType1 e1) {
// å¤çå¼å¸¸ç±»å1çé»è¾
} catch (ExceptionType2 e2) {
// å¤çå¼å¸¸ç±»å2çé»è¾
} catch (ExceptionType3 e3) {
// å¤çå¼å¸¸ç±»å3çé»è¾
} finally {
// å¯éçfinallyåï¼ç¨äºå®ä¹æ 论æ¯å¦åçå¼å¸¸é½ä¼æ§è¡ç代ç
}
- throwè¯å¥ï¼ç¨äºæå¨æåºå¼å¸¸ãå¯ä»¥æ ¹æ®éè¦å¨ä»£ç ä¸ä½¿ç¨throwè¯å¥ä¸»å¨æåºç¹å®ç±»åçå¼å¸¸ã
throw new ExceptionType("Exception message");
- throwså ³é®åï¼ç¨äºå¨æ¹æ³å£°æä¸å£°æå¯è½æåºçå¼å¸¸ç±»åã妿ä¸ä¸ªæ¹æ³å¯è½æåºå¼å¸¸ï¼ä½ä¸æ³å¨æ¹æ³å é¨è¿è¡å¤çï¼å¯ä»¥ä½¿ç¨throwså ³é®åå°å¼å¸¸ä¼ éç»è°ç¨è æ¥å¤çã
public void methodName() throws ExceptionType {
// æ¹æ³ä½
}
- finallyåï¼ç¨äºå®ä¹æ 论æ¯å¦åçå¼å¸¸é½ä¼æ§è¡ç代ç åãé常ç¨äºéæ¾èµæºï¼ç¡®ä¿èµæºçæ£ç¡®å ³éã
try {
// å¯è½æåºå¼å¸¸ç代ç
} catch (ExceptionType e) {
// å¤çå¼å¸¸çé»è¾
} finally {
// æ 论æ¯å¦åçå¼å¸¸ï¼é½ä¼æ§è¡ç代ç
}
# æåºå¼å¸¸ä¸ºä»ä¹ä¸ç¨throwsï¼
妿å¼å¸¸æ¯æªæ£æ¥å¼å¸¸æè 卿¹æ³å é¨è¢«æè·åå¤çäºï¼é£ä¹å°±ä¸éè¦ä½¿ç¨throwsã
- Unchecked Exceptionsï¼æªæ£æ¥å¼å¸¸ï¼unchecked exceptionsï¼æ¯ç»§æ¿èªRuntimeExceptionç±»æErrorç±»çå¼å¸¸ï¼ç¼è¯å¨ä¸å¼ºå¶è¦æ±è¿è¡å¼å¸¸å¤çãå æ¤ï¼å¯¹äºè¿äºå¼å¸¸ï¼ä¸éè¦å¨æ¹æ³ç¾åä¸ä½¿ç¨throwsæ¥å£°æã示ä¾å æ¬NullPointerExceptionãArrayIndexOutOfBoundsExceptionçã
- æè·åå¤çå¼å¸¸ï¼å¦ä¸ç§å¸¸è§æ 嵿¯ï¼å¨æ¹æ³å 鍿è·äºå¯è½æåºçå¼å¸¸ï¼å¹¶å¨æ¹æ³å é¨å¤çå®ä»¬ï¼è䏿¯éè¿throwsåå¥å°å®ä»¬ä¼ éå°è°ç¨è ãè¿ç§æ åµä¸ï¼æ¹æ³å¯ä»¥å¤çå¼å¸¸èæ é卿¹æ³ç¾åä¸ä½¿ç¨throwsã
# try catchä¸çè¯å¥è¿è¡æ åµ
tryåä¸ç代ç å°æé¡ºåºæ§è¡ï¼å¦ææåºå¼å¸¸ï¼å°å¨catchåä¸è¿è¡å¹é åå¤çï¼ç¶åç¨åºå°ç»§ç»æ§è¡catchåä¹åç代ç ãå¦ææ²¡æå¹é çcatchåï¼å¼å¸¸å°è¢«ä¼ éç»ä¸ä¸å±è°ç¨çæ¹æ³ã
# try{return âaâ} finally{return âbâ}è¿æ¡è¯å¥è¿åå¥
finallyåä¸çreturnè¯å¥ä¼è¦çtryåä¸çreturnè¿åï¼å æ¤ï¼è¯¥è¯å¥å°è¿å"b"ã
# object
# Objectç±»æåªäºæ¹æ³ï¼
Java Object ç±»æ¯ææç±»çè¶ ç±»ï¼é»è®¤æä¾ 11 ä¸ªæ ¸å¿æ¹æ³ï¼æ ¸å¿ç¨äºå¯¹è±¡æ¯è¾ãåå¸ãå符串表示ã线ç¨åæ¥çã
é¦å æå¸¸ç¨çæ¯ equals æ¹æ³ï¼å®çé»è®¤å®ç°æ¯æ¯è¾ä¸¤ä¸ªå¯¹è±¡çå åå°åï¼ä¹å°±æ¯å == çææä¸æ ·ï¼ä½å®é å¼å䏿们叏éè¦æå¯¹è±¡çå 容æ¯è¾ï¼æ¯å¦ä¸¤ä¸ªç¨æ·å¯¹è±¡åªè¦ id ç¸å就认为ç¸çï¼è¿æ¶åå°±éè¦éå equalsãæ¯å¦ï¼
class User {
private int id;
private String name;
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
User user = (User) obj;
return id == user.id;
}
}
å equals é å¥çå¿ é¡»éå hashCode æ¹æ³ï¼å 为 Java ççº¦å®æ¯å¦æä¸¤ä¸ªå¯¹è±¡ equals è¿å trueï¼å®ä»¬ç hashCode å¿ é¡»ç¸çï¼å¦æ hashCode ä¸ç¸çï¼equals ä¸å®è¿å falseã妿åªéå equals ä¸éå hashCodeï¼ä¼å¯¼è´å¯¹è±¡å¨ HashMap HashSet çéå䏿 æ³æ£ç¡®åå¨ï¼æ¯å¦ä¸¤ä¸ª id ç¸åç User 对象ï¼equals è¿å trueï¼ä½ hashCode ä¸åï¼ä¼è¢«å½æä¸¤ä¸ªä¸åå ç´ åå ¥éåãéå示ä¾ï¼
@Override
public int hashCode() {
return Integer.hashCode(id);
}
ç¶åæ¯ toString æ¹æ³ï¼é»è®¤è¿åç±»åå @å 对象çåå¸ç åå è¿å¶è¡¨ç¤ºï¼æ¯å¦ User@1b6d3586ï¼å¯è¯»æ§å¾å·®ãå®é å¼åä¸éå宿¯ä¸ºäºè¿å对象çå ·ä½ä¿¡æ¯ï¼æ¹ä¾¿æ¥å¿æå°åè°è¯ï¼æ¯å¦ï¼
@Override
public String toString() {
return User id: + id + name: + name;
}
æ¥ä¸æ¥æ¯ getClass æ¹æ³ï¼å®è¿å对象è¿è¡æ¶çå®é 类对象ï¼åç¼è¯æ¶ç±»åå¯è½ä¸åï¼èä¸è¿ä¸ªæ¹æ³ä¸è½éåãæ¯å¦ç¶ç±» Animal çåç±» Dogï¼Animal animal = new Dogï¼animal.getClass è¿åçæ¯ Dog ç类对象ï¼å¸¸ç¨äºåå°åºæ¯ï¼æ¯å¦éè¿ getClass è·åç±»ç屿§åæ¹æ³ï¼
Animal animal = new Dog();
Class<?> clazz = animal.getClass();
System.out.println(clazz.getName()); // è¾åºDog
ç¶åæ¯ clone æ¹æ³ï¼ç¨äºåå»ºå¯¹è±¡çæµ æ·è´ï¼é»è®¤æ¯æµ æ·è´æå³çå¦æå¯¹è±¡æå¼ç¨ç±»å屿§ï¼æ·è´åç对象åå对象ä¼å ±äº«è¯¥å¼ç¨å±æ§ãä½¿ç¨ clone éè¦è®©ç±»å®ç° Cloneable æ¥å£ï¼å¦åä¼æåº CloneNotSupportedExceptionï¼æ¯å¦ï¼
class Product implements Cloneable {
private String name;
private double price;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
è¿æ notify å notifyAll æ¹æ³ï¼å®ä»¬é½æ¯ç¨äºå¤çº¿ç¨åæ¥çï¼å synchronized é å使ç¨ï¼ä½ç¨æ¯å¤éçå¾ å½å对象éç线ç¨ãnotify æ¯éæºå¤éä¸ä¸ªçå¾ çº¿ç¨ï¼notifyAll æ¯å¤éææçå¾ çº¿ç¨ï¼æ¯å¦çäº§è æ¶è´¹è 模å¼ä¸ï¼ç产è çäº§å®æ°æ®åè°ç¨ notifyAllï¼å¤éçå¾ çæ¶è´¹è 线ç¨ã
wait æ¹æ³æä¸ä¸ªéè½½ï¼ä½ç¨æ¯è®©å½åææå¯¹è±¡éç线ç¨éæ¾éå¹¶è¿å ¥çå¾ ç¶æï¼ç´å°è¢« notify notifyAll å¤éæè çå¾ æ¶é´å°æãåæ ·éè¦å¨ synchronized 忥忿¹æ³ä¸ä½¿ç¨ï¼å¦å伿 IllegalMonitorStateExceptionï¼æ¯å¦ï¼
synchronized (lockObj) {
while (æ¡ä»¶ä¸æ»¡è¶³) {
lockObj.wait(1000); // çå¾
1ç§ï¼è¶
æ¶èªå¨å¤é
}
// æ§è¡ä¸å¡é»è¾
}
æåæ¯ finalize æ¹æ³ï¼å®æ¯å¯¹è±¡è¢«åå¾åæ¶å¨åæ¶åä¼è°ç¨çæ¹æ³ï¼é»è®¤æ¯ç©ºå®ç°ãä½ç°å¨åºæ¬ä¸æ¨è使ç¨ï¼å 为å®çæ§è¡æ¶æºä¸ç¡®å®ï¼å¯è½å¾ä¹ ææ§è¡çè³ä¸æ§è¡ï¼èä¸å¯è½å¯¼è´å¯¹è±¡å¤æ´»ï¼å½±ååå¾åæ¶æçï¼Java9 ä¹åå·²ç»æ è®°ä¸ºè¿æ¶ï¼æ¿ä»£æ¹æ¡æ¯ä½¿ç¨ try with resources æè PhantomReference æ¥å¤çèµæºéæ¾ã
# == ä¸ equals æä»ä¹åºå«ï¼
ç®åæ¥è¯´ï¼== æ¯è¾çæ¯"å°å"ï¼è equals æ¯è¾çæ¯"å
容"ãä½è¿å¥è¯å¦æä¸å±å¼è®²ï¼å
¶å®å¾å®¹æè®©äººæµï¼æç»ä½ 详ç»è¯´ä¸ä¸ã
å
说 == è¿ä¸ªè¿ç®ç¬¦ã
== å¨ Java éå
¶å®æ¯ä¸ªé常ç®åç²æ´çæ¯è¾æ¹å¼ãå¦æä½ æ¯è¾çæ¯åºæ¬æ°æ®ç±»åï¼æ¯å¦ intãdoubleï¼ï¼é£å®å°±ç´æ¥æ¯æ°å¼æ¯ä¸æ¯ç¸çï¼è¿ä¸ªæ²¡å¥é®é¢ã
ä½å¦æä½ æ¯è¾çæ¯å¯¹è±¡ï¼å¼ç¨ç±»åï¼ï¼é£ == æ¯è¾ç就䏿¯å¯¹è±¡éé¢è£
çå
容äºï¼èæ¯æ¯è¾è¿ä¸¤ä¸ªå鿝䏿¯æåå
åä¸åä¸ä¸ªå¯¹è±¡ï¼ä¹å°±æ¯å°åæ¯å¦ç¸åã
æä¸¾ä¸ªä¾åä½ å°±æç½äºï¼
String a = new String("hello");
String b = new String("hello");
System.out.println(a == b); // è¾åº false
è½ç¶ a å b éé¢è£
çå
容齿¯ "hello"ï¼ä½å 为æç¨äºä¸¤æ¬¡ newï¼æä»¥å¨å å
åéå建äºä¸¤ä¸ªå®å
¨ç¬ç«ç String 对象ãa å b è¿ä¸¤ä¸ªåéå嫿åäºä¸åçå¯¹è±¡ï¼æä»¥ == 䏿¯è¾ï¼åç°å°åä¸ä¸æ ·ï¼å°±è¿å false äºã
å说 equals æ¹æ³ã
equals æ¯ Object ç±»éå®ä¹çä¸ä¸ªæ¹æ³ï¼ææç Java 对象é½ç»§æ¿äºå®ãå®çé»è®¤è¡ä¸ºå
¶å®å == 䏿¨¡ä¸æ ·ï¼ä¹æ¯æ¯å°åã
ä½å
³é®å¨äºï¼å¾å¤å¸¸ç¨çç±»ï¼æ¯å¦ StringãIntegerï¼é½æè¿ä¸ªæ¹æ³ç»éåäºãéåä¹åï¼equals å°±ä¸åæ¯å°åäºï¼èæ¯å»æ¯è¾å¯¹è±¡éé¢å®é
åå¨çå
容æ¯å¦ç¸çã
è¿æ¯åæé£ä¸ªä¾åï¼
String a = new String("hello");
String b = new String("hello");
System.out.println(a.equals(b)); // è¾åº true
è½ç¶ a å b æ¯ä¸¤ä¸ªä¸åç对象ï¼ä½ String ç±»éåäº equals æ¹æ³ï¼ä¼é个åç¬¦å»æ¯è¾å
容ãåç°é½æ¯ "hello"ï¼æä»¥è¿å trueã
è¿éæä¸ªç»å ¸çé¢è¯é·é±ï¼å°±æ¯åç¬¦ä¸²å¸¸éæ± çé®é¢ã
String c = "hello";
String d = "hello";
System.out.println(c == d); // è¾åº true
è¿é为ä»ä¹ == æ¯è¾ä¹æ¯ true å¢ï¼å 为å½ä½ ç´æ¥ç¨åå¼å·å建åç¬¦ä¸²çæ¶åï¼JVM 伿宿å°ä¸ä¸ªå«"åç¬¦ä¸²å¸¸éæ± "çå°æ¹ãå¦ææ± åéå·²ç»æäº "hello"ï¼é£ d å°±ç´æ¥å¤ç¨ c æåçé£ä¸ªå¯¹è±¡ï¼æä»¥å®ä¿©å°åæ¯ä¸æ ·çï¼== èªç¶å°±è¿å true äºã
æ»ç»ä¸ä¸ï¼
==æ¯æ¯è¾å¼ç¨å°åï¼éåç¨æ¥å¤æä¸¤ä¸ªå鿝䏿¯æååä¸ä¸ªå¯¹è±¡ï¼equalsæ¯æ¯è¾å¯¹è±¡å 容ï¼ä½åææ¯è¿ä¸ªç±»éåäº equals æ¹æ³ï¼æ¯å¦ Stringï¼ï¼å¦ææ²¡éåï¼é£å®ä¿©æææ¯ä¸æ ·çã
æä»¥å¨å®é
å¼åä¸ï¼å¦ææä»¬è¦æ¯è¾ä¸¤ä¸ªå符串æè
对象çå
容æ¯å¦ç¸çï¼ä¸å®è¦ç¨ equalsï¼è䏿¯ ==ãè¿ä¹æ¯ä¸ºä»ä¹é¿éå·´å·´å¼åè§èéæç¡®è¦æ±ï¼å¤æå符串ç¸çå¿
é¡»ç¨ equals çåå ã
# hashcodeåequalsæ¹æ³æä»ä¹å ³ç³»ï¼
å¨ Java ä¸ï¼å¯¹äºéå equals æ¹æ³çç±»ï¼é常ä¹éè¦éå hashCode æ¹æ³ï¼å¹¶ä¸éè¦éµå¾ªä»¥ä¸è§å®ï¼
- ä¸è´æ§ï¼å¦æä¸¤ä¸ªå¯¹è±¡ä½¿ç¨
equalsæ¹æ³æ¯è¾ç»æä¸ºtrueï¼é£ä¹å®ä»¬çhashCodeå¼å¿ é¡»ç¸åãä¹å°±æ¯è¯´ï¼å¦æobj1.equals(obj2)è¿åtrueï¼é£ä¹obj1.hashCode()å¿ é¡»çäºobj2.hashCode()ã - éä¸è´æ§ï¼å¦æä¸¤ä¸ªå¯¹è±¡ç
hashCodeå¼ç¸åï¼å®ä»¬ä½¿ç¨equalsæ¹æ³æ¯è¾çç»æä¸ä¸å®ä¸ºtrueãå³obj1.hashCode() == obj2.hashCode()æ¶ï¼obj1.equals(obj2)å¯è½ä¸ºfalseï¼è¿ç§æ åµç§°ä¸ºåå¸å²çªã
hashCode å equals æ¹æ³æ¯ç´§å¯ç¸å
³çï¼éå equals æ¹æ³æ¶å¿
é¡»éå hashCode æ¹æ³ï¼ä»¥ä¿è¯å¨ä½¿ç¨åå¸è¡¨çæ°æ®ç»ææ¶ï¼å¯¹è±¡çç¸çæ§å¤æåå卿¥æ¾æä½è½å¤æ£å¸¸å·¥ä½ãèéå hashCode æ¹æ³æ¶ï¼éè¦ç¡®ä¿ç¸çç对象å
·æç¸åçåå¸ç ï¼ä½ç¸ååå¸ç ç对象ä¸ä¸å®ç¸çã
# java é stringçå¸¸ç¨æ¹æ³æåªäºï¼
æå¸¸ç¨ç String å¸¸ç¨æ¹æ³æè¿äºï¼
- è·åé¿åº¦ï¼
int length()ï¼è¿åå符串çé¿åº¦ï¼å符个æ°ï¼ãä¾ï¼"abc".length()â 3 - 夿å
容ï¼
boolean equals(Object obj)ï¼æ¯è¾ä¸¤ä¸ªå符串çå 容æ¯å¦å®å ¨ç¸åï¼åºå大å°åï¼ãä¾ï¼"abc".equals("ABC")â false - æªåå串ï¼
String substring(int beginIndex)ï¼ä»æå®ç´¢å¼å¼å§æªåå°æ«å°¾ãä¾ï¼"hello".substring(2)â "llo" - å»é¤ç©ºæ ¼ï¼
String trim()ï¼å»é¤å符串é¦å°¾ç空ç½å符ï¼ç©ºæ ¼ãå¶è¡¨ç¬¦çï¼ãä¾ï¼" abc ".trim()â "abc" - æ¿æ¢å
容ï¼
String replace(char oldChar, char newChar)ï¼æ¿æ¢æææå®å符ãä¾ï¼"aaa".replace('a', 'b')â "bbb" - å¤æç©ºå符串ï¼
boolean isEmpty()ï¼å¤æå符串é¿åº¦æ¯å¦ä¸º 0ï¼æ³¨æï¼nullè°ç¨ä¼æ¥éï¼éå å¤ç©ºï¼ã
# StringãStringBufferãStringBuilderçåºå«åèç³»
1ãå¯åæ§ ï¼String æ¯ä¸å¯åçï¼Immutableï¼ï¼ä¸æ¦å建ï¼å
å®¹æ æ³ä¿®æ¹ï¼æ¯æ¬¡ä¿®æ¹é½ä¼çæä¸ä¸ªæ°ç对象ãStringBuilder å StringBuffer æ¯å¯åçï¼Mutableï¼ï¼å¯ä»¥ç´æ¥å¯¹å符串å
容è¿è¡ä¿®æ¹èä¸ä¼å建æ°å¯¹è±¡ã
2ã线ç¨å®å
¨æ§ ï¼String å 为ä¸å¯åï¼å¤©ç¶çº¿ç¨å®å
¨ãStringBuilder 䏿¯çº¿ç¨å®å
¨çï¼éç¨äºå线ç¨ç¯å¢ãStringBuffer æ¯çº¿ç¨å®å
¨çï¼å
¶æ¹æ³éè¿ synchronized å
³é®åå®ç°åæ¥ï¼éç¨äºå¤çº¿ç¨ç¯å¢ã
3ãæ§è½ ï¼String æ§è½æä½ï¼å°¤å
¶æ¯å¨é¢ç¹ä¿®æ¹å符串æ¶ä¼çæå¤§é临æ¶å¯¹è±¡ï¼å¢å å
åå¼éååå¾åæ¶ååãStringBuilder æ§è½æé«ï¼å ä¸ºå®æ²¡æçº¿ç¨å®å
¨çå¼éï¼éåå线ç¨ä¸çå符串æä½ãStringBuffer æ§è½ç¥ä½äº StringBuilderï¼å 为å®ç线ç¨å®å
¨æºå¶å¼å
¥äºåæ¥å¼éã
4ã使ç¨åºæ¯ ï¼å¦æå符串å
容åºå®æä¸å¸¸ååï¼ä¼å
ä½¿ç¨ Stringã妿éè¦é¢ç¹ä¿®æ¹å符串ä¸å¨å线ç¨ç¯å¢ä¸ï¼ä½¿ç¨ StringBuilderã妿éè¦é¢ç¹ä¿®æ¹å符串ä¸å¨å¤çº¿ç¨ç¯å¢ä¸ï¼ä½¿ç¨ StringBufferã
å¯¹æ¯æ»ç»å¦ä¸ï¼
| ç¹æ§ | String | StringBuilder | StringBuffer |
|---|---|---|---|
| ä¸å¯åæ§ | ä¸å¯å | å¯å | å¯å |
| 线ç¨å®å ¨ | æ¯ï¼å ä¸å¯åï¼ | å¦ | æ¯ï¼åæ¥æ¹æ³ï¼ |
| æ§è½ | ä½ï¼é¢ç¹ä¿®æ¹æ¶ï¼ | é«ï¼å线ç¨ï¼ | ä¸ï¼å¤çº¿ç¨å®å ¨ï¼ |
| éç¨åºæ¯ | éæå符串 | å线ç¨å¨æå符串 | å¤çº¿ç¨å¨æå符串 |
ä¾å代ç å¦ä¸ï¼
// Stringçä¸å¯åæ§
String str = "abc";
str = str + "def"; // æ°å»ºå¯¹è±¡ï¼stræåæ°å¯¹è±¡
// StringBuilderï¼å线ç¨é«æï¼
StringBuilder sb = new StringBuilder();
sb.append("abc").append("def"); // ç´æ¥ä¿®æ¹å
鍿°ç»
// StringBufferï¼å¤çº¿ç¨å®å
¨ï¼
StringBuffer sbf = new StringBuffer();
sbf.append("abc").append("def"); // åæ¥æ¹æ³ä¿è¯çº¿ç¨å®å
¨
# Java æ°ç¹æ§
# Java 8 ä½ ç¥éæä»ä¹æ°ç¹æ§ï¼
ä¸é¢æ¯ Java 8 ä¸»è¦æ°ç¹æ§çæ´çè¡¨æ ¼ï¼å å«å ³é®æ¹è¿å示ä¾è¯´æï¼
| ç¹æ§åç§° | æè¿° | ç¤ºä¾æè¯´æ |
|---|---|---|
| Lambda è¡¨è¾¾å¼ | ç®åå¿åå é¨ç±»ï¼æ¯æå½æ°å¼ç¼ç¨ | (a, b) -> a + b 代æ¿å¿åç±»å®ç°æ¥å£ |
| 彿°å¼æ¥å£ | ä»
å«ä¸ä¸ªæ½è±¡æ¹æ³çæ¥å£ï¼å¯ç¨ @FunctionalInterface 注解æ è®° | Runnable, Comparator, æèªå®ä¹æ¥å£ @FunctionalInterface interface MyFunc { void run(); } |
| Stream API | æä¾é¾å¼æä½å¤çéåæ°æ®ï¼æ¯æå¹¶è¡å¤ç | list.stream().filter(x -> x > 0).collect(Collectors.toList()) |
| Optional ç±» | å°è£
å¯è½ä¸º null ç对象ï¼åå°ç©ºæéå¼å¸¸ | Optional.ofNullable(value).orElse("default") |
| æ¹æ³å¼ç¨ | ç®å Lambda 表达å¼ï¼ç´æ¥å¼ç¨ç°ææ¹æ³ | System.out::println çä»·äº x -> System.out.println(x) |
| æ¥å£çé»è®¤æ¹æ³ä¸éææ¹æ³ | æ¥å£å¯å®ä¹é»è®¤å®ç°åéææ¹æ³ï¼å¢å¼ºæ©å±æ§ | interface A { default void print() { System.out.println("é»è®¤æ¹æ³"); } } |
| å¹¶è¡æ°ç»æåº | 使ç¨å¤çº¿ç¨å éæ°ç»æåº | Arrays.parallelSort(array) |
| é夿³¨è§£ | å 许åä¸ä½ç½®å¤æ¬¡ä½¿ç¨ç¸å注解 | @Repeatable 注解é
å容卿³¨è§£ä½¿ç¨ |
| ç±»åæ³¨è§£ | 注解å¯åºç¨äºæ´å¤ä½ç½®ï¼å¦æ³åãå¼å¸¸çï¼ | List<@NonNull String> list |
| CompletableFuture | å¢å¼ºå¼æ¥ç¼ç¨è½åï¼æ¯æé¾å¼è°ç¨åç»åæä½ | CompletableFuture.supplyAsync(() -> "result").thenAccept(System.out::println) |
# Lambda 表达å¼äºè§£åï¼
Lambda 表达å¼å®æ¯ä¸ç§ç®æ´çè¯æ³ï¼ç¨äºå建å¿å彿°ï¼ä¸»è¦ç¨äºç®å彿°å¼æ¥å£ï¼åªæä¸ä¸ªæ½è±¡æ¹æ³çæ¥å£ï¼ç使ç¨ãå ¶åºæ¬è¯æ³æä»¥ä¸ä¸¤ç§å½¢å¼ï¼
(parameters) -> expressionï¼å½ Lambda ä½åªæä¸ä¸ªè¡¨è¾¾å¼æ¶ä½¿ç¨ï¼è¡¨è¾¾å¼çç»æä¼ä½ä¸ºè¿åå¼ã(parameters) -> { statements; }ï¼å½ Lambda ä½å å«å¤æ¡è¯å¥æ¶ï¼éè¦ä½¿ç¨å¤§æ¬å·å°è¯å¥æ¬èµ·æ¥ï¼è¥æè¿åå¼åéè¦ä½¿ç¨returnè¯å¥ã
ä¼ ç»çå¿åå
é¨ç±»å®ç°æ¹å¼ä»£ç è¾ä¸ºåé¿ï¼è Lambda 表达å¼å¯ä»¥ç¨æ´ç®æ´çè¯æ³å®ç°ç¸åçåè½ãæ¯å¦ï¼ä½¿ç¨å¿åå
é¨ç±»å®ç° Runnable æ¥å£
public class AnonymousClassExample {
public static void main(String[] args) {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Running using anonymous class");
}
});
t1.start();
}
}
ä½¿ç¨ Lambda 表达å¼å®ç°ç¸ååè½ï¼
public class LambdaExample {
public static void main(String[] args) {
Thread t1 = new Thread(() -> System.out.println("Running using lambda expression"));
t1.start();
}
}
å¯ä»¥çå°ï¼Lambda 表达å¼çä»£ç æ´å ç®æ´æäºã
è¿æï¼Lambda 表达å¼è½å¤æ´æ¸ æ°å°è¡¨è¾¾ä»£ç çæå¾ï¼å°¤å ¶æ¯å¨å¤çéåæä½æ¶ï¼å¦è¿æ»¤ãæ å°çãæ¯å¦ï¼è¿æ»¤åºåè¡¨ä¸ææå¶æ°
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class ReadabilityExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
// ä½¿ç¨ Lambda 表达å¼ç»å Stream API è¿æ»¤å¶æ°
List<Integer> evenNumbers = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
System.out.println(evenNumbers);
}
}
éè¿ Lambda 表达å¼ï¼ä»£ç çé»è¾æ´å ç´è§ï¼æäºçè§£ã
è¿æï¼Lambda 表达å¼ä½¿å¾ Java æ¯æå½æ°å¼ç¼ç¨èå¼ï¼å 许å°å½æ°ä½ä¸ºåæ°ä¼ éï¼ä»èå¯ä»¥ç¼åæ´çµæ´»ãå¯å¤ç¨ç代ç ãæ¯å¦å®ä¹ä¸ä¸ªéç¨ç计ç®å½æ°ã
interface Calculator {
int calculate(int a, int b);
}
public class FunctionalProgrammingExample {
public static int operate(int a, int b, Calculator calculator) {
return calculator.calculate(a, b);
}
public static void main(String[] args) {
// ä½¿ç¨ Lambda 表达å¼ä¼ éå æ³å½æ°
int sum = operate(3, 5, (x, y) -> x + y);
System.out.println("Sum: " + sum);
// ä½¿ç¨ Lambda 表达å¼ä¼ é乿³å½æ°
int product = operate(3, 5, (x, y) -> x * y);
System.out.println("Product: " + product);
}
}
è½ç¶ Lambda 表达å¼ä¼ç¹è®å¤çï¼ä¸è¿ä¹æä¸äºç¼ºç¹ï¼æ¯å¦ä¼å¢å è°è¯å°é¾ï¼å 为 Lambda è¡¨è¾¾å¼æ¯å¿åçï¼å¨è°è¯æ¶å¾é¾å®ä½å ·ä½æ¯åªä¸ª Lambda 表达å¼åºç°äºé®é¢ãå°¤å ¶æ¯å½ Lambda 表达å¼åµå¥ä½¿ç¨æè æ¯è¾å¤ææ¶ï¼è°è¯é¾åº¦ä¼è¿ä¸æ¥å¢å ã
# Javaä¸streamçAPIä»ç»ä¸ä¸
Java 8å¼å ¥äºStream APIï¼å®æä¾äºä¸ç§é«æä¸æäºä½¿ç¨çæ°æ®å¤çæ¹å¼ï¼ç¹å«éåéå对象çæä½ï¼å¦è¿æ»¤ãæ å°ãæåºçãStream APIä¸ä» å¯ä»¥æé«ä»£ç çå¯è¯»æ§åç®æ´æ§ï¼è¿è½å©ç¨å¤æ ¸å¤çå¨çä¼å¿è¿è¡å¹¶è¡å¤çã让æä»¬éè¿ä¸¤ä¸ªå ·ä½çä¾åæ¥æåä¸Java Stream API带æ¥ç便å©ï¼å¯¹æ¯å¨Stream APIå¼å ¥ä¹åçä¼ ç»åæ³ã
æ¡ä¾1ï¼è¿æ»¤å¹¶æ¶é满足æ¡ä»¶çå ç´
é®é¢åºæ¯ï¼ä»ä¸ä¸ªå表ä¸çéåºææé¿åº¦å¤§äº3çå符串ï¼å¹¶æ¶éå°ä¸ä¸ªæ°çå表ä¸ã
没æStream APIçåæ³ï¼
List<String> originalList = Arrays.asList("apple", "fig", "banana", "kiwi");
List<String> filteredList = new ArrayList<>();
for (String item : originalList) {
if (item.length() > 3) {
filteredList.add(item);
}
}
è¿æ®µä»£ç éè¦æ¾å¼å°å建ä¸ä¸ªæ°çArrayListï¼å¹¶éè¿å¾ªç¯éåååè¡¨ï¼æå¨æ£æ¥æ¯ä¸ªå ç´ æ¯å¦æ»¡è¶³æ¡ä»¶ï¼ç¶åæ·»å å°æ°å表ä¸ã
使ç¨Stream APIçåæ³ï¼
List<String> originalList = Arrays.asList("apple", "fig", "banana", "kiwi");
List<String> filteredList = originalList.stream()
.filter(s -> s.length() > 3)
.collect(Collectors.toList());
è¿éï¼æä»¬ç´æ¥å¨åå§å表ä¸è°ç¨.stream()æ¹æ³å建äºä¸ä¸ªæµï¼ä½¿ç¨.filter()ä¸é´æä½çéåºé¿åº¦å¤§äº3çåç¬¦ä¸²ï¼æå使ç¨.collect(Collectors.toList())ç»ç«¯æä½å°ç»ææ¶éå°ä¸ä¸ªæ°çå表ä¸ãä»£ç æ´å ç®æ´æäºï¼é»è¾ä¸ç®äºç¶ã
æ¡ä¾2ï¼è®¡ç®åè¡¨ä¸æææ°åçæ»å
é®é¢åºæ¯ï¼è®¡ç®ä¸ä¸ªæ°ååè¡¨ä¸ææå ç´ çæ»åã
没æStream APIçåæ³ï¼
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = 0;
for (Integer number : numbers) {
sum += number;
}
è¿ä¸ªä¼ ç»çfor-each循ç¯éåå表ä¸çæ¯ä¸ä¸ªå ç´ ï¼ç´¯å å®ä»¬ç弿¥è®¡ç®æ»åã
使ç¨Stream APIçåæ³ï¼
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream()
.mapToInt(Integer::intValue)
.sum();
éè¿Stream APIï¼æä»¬å¯ä»¥å
使ç¨.mapToInt()å°Integeræµè½¬æ¢ä¸ºIntStreamï¼è¿æ¯ä¸ºäºé«æå¤çåºæ¬ç±»åï¼ï¼ç¶åç´æ¥è°ç¨.sum()æ¹æ³æ¥è®¡ç®æ»åï¼æå¤§å°ç®åäºä»£ç ã
# Streamæµçå¹¶è¡APIæ¯ä»ä¹ï¼
æ¯ ParallelStreamã
å¹¶è¡æµï¼ParallelStreamï¼å°±æ¯å°æºæ°æ®å为å¤ä¸ªåæµå¯¹è±¡è¿è¡å¤çº¿ç¨æä½ï¼ç¶åå°å¤ççç»æåæ±æ»ä¸ºä¸ä¸ªæµå¯¹è±¡ï¼åºå±æ¯ä½¿ç¨éç¨ç fork/join æ± æ¥å®ç°ï¼å³å°ä¸ä¸ªä»»å¡æåæå¤ä¸ªâå°ä»»å¡âå¹¶è¡è®¡ç®ï¼åæå¤ä¸ªâå°ä»»å¡âçç»æåå¹¶ææ»ç计ç®ç»æ
Streamä¸²è¡æµä¸å¹¶è¡æµç主è¦åºå«ï¼

对CPUå¯éåç任塿¥è¯´ï¼å¹¶è¡æµä½¿ç¨ForkJoinPoolçº¿ç¨æ± ï¼ä¸ºæ¯ä¸ªCPUåé ä¸ä¸ªä»»å¡ï¼è¿æ¯é常ææççï¼ä½æ¯å¦æä»»å¡ä¸æ¯CPUå¯éçï¼èæ¯I/Oå¯éçï¼å¹¶ä¸ä»»å¡æ°ç¸å¯¹çº¿ç¨æ°æ¯è¾å¤§ï¼é£ä¹ç´æ¥ç¨ParallelStream并䏿¯å¾å¥½çéæ©ã
# completableFutureæä¹ç¨çï¼
CompletableFutureæ¯ç±Java 8å¼å ¥çï¼å¨Java8ä¹åæä»¬ä¸è¬éè¿Futureå®ç°å¼æ¥ã
- Futureç¨äºè¡¨ç¤ºå¼æ¥è®¡ç®çç»æï¼åªè½éè¿é»å¡æè è½®è¯¢çæ¹å¼è·åç»æï¼èä¸ä¸æ¯æè®¾ç½®åè°æ¹æ³ï¼Java 8ä¹åè¥è¦è®¾ç½®åè°ä¸è¬ä¼ä½¿ç¨guavaçListenableFutureï¼åè°çå¼å ¥åä¼å¯¼è´èåæèçåè°å°ç±ï¼ä¸é¢çä¾åä¼éè¿ListenableFutureçä½¿ç¨æ¥å ·ä½è¿è¡å±ç¤ºï¼ã
- CompletableFuture对Futureè¿è¡äºæ©å±ï¼å¯ä»¥éè¿è®¾ç½®åè°çæ¹å¼å¤ç计ç®ç»æï¼åæ¶ä¹æ¯æç»åæä½ï¼æ¯æè¿ä¸æ¥çç¼æï¼åæ¶ä¸å®ç¨åº¦è§£å³äºåè°å°ç±çé®é¢ã
ä¸é¢å°ä¸¾ä¾æ¥è¯´æï¼æä»¬éè¿ListenableFutureãCompletableFutureæ¥å®ç°å¼æ¥çå·®å¼ãå设æä¸ä¸ªæä½step1ãstep2ãstep3åå¨ä¾èµå ³ç³»ï¼å ¶ä¸step3çæ§è¡ä¾èµstep1åstep2çç»æã
Future(ListenableFuture)çå®ç°ï¼åè°å°ç±ï¼å¦ä¸ï¼
ExecutorService executor = Executors.newFixedThreadPool(5);
ListeningExecutorService guavaExecutor = MoreExecutors.listeningDecorator(executor);
ListenableFuture<String> future1 = guavaExecutor.submit(() -> {
//step 1
System.out.println("æ§è¡step 1");
return "step1 result";
});
ListenableFuture<String> future2 = guavaExecutor.submit(() -> {
//step 2
System.out.println("æ§è¡step 2");
return "step2 result";
});
ListenableFuture<List<String>> future1And2 = Futures.allAsList(future1, future2);
Futures.addCallback(future1And2, new FutureCallback<List<String>>() {
@Override
public void onSuccess(List<String> result) {
System.out.println(result);
ListenableFuture<String> future3 = guavaExecutor.submit(() -> {
System.out.println("æ§è¡step 3");
return "step3 result";
});
Futures.addCallback(future3, new FutureCallback<String>() {
@Override
public void onSuccess(String result) {
System.out.println(result);
}
@Override
public void onFailure(Throwable t) {
}
}, guavaExecutor);
}
@Override
public void onFailure(Throwable t) {
}}, guavaExecutor);
CompletableFutureçå®ç°å¦ä¸ï¼
ExecutorService executor = Executors.newFixedThreadPool(5);
CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> {
System.out.println("æ§è¡step 1");
return "step1 result";
}, executor);
CompletableFuture<String> cf2 = CompletableFuture.supplyAsync(() -> {
System.out.println("æ§è¡step 2");
return "step2 result";
});
cf1.thenCombine(cf2, (result1, result2) -> {
System.out.println(result1 + " , " + result2);
System.out.println("æ§è¡step 3");
return "step3 result";
}).thenAccept(result3 -> System.out.println(result3));
æ¾ç¶ï¼CompletableFutureçå®ç°æ´ä¸ºç®æ´ï¼å¯è¯»æ§æ´å¥½ã
CompletableFutureå®ç°äºä¸¤ä¸ªæ¥å£ï¼å¦ä¸å¾æç¤º)ï¼FutureãCompletionStageã
- Futureè¡¨ç¤ºå¼æ¥è®¡ç®çç»æï¼CompletionStageç¨äºè¡¨ç¤ºå¼æ¥æ§è¡è¿ç¨ä¸çä¸ä¸ªæ¥éª¤ï¼Stageï¼ï¼è¿ä¸ªæ¥éª¤å¯è½æ¯ç±å¦å¤ä¸ä¸ªCompletionStage触åçï¼éçå½åæ¥éª¤ç宿ï¼ä¹å¯è½ä¼è§¦åå ¶ä»ä¸ç³»åCompletionStageçæ§è¡ã
- ä»èæä»¬å¯ä»¥æ ¹æ®å®é ä¸å¡å¯¹è¿äºæ¥éª¤è¿è¡å¤æ ·åçç¼æç»åï¼CompletionStageæ¥å£æ£æ¯å®ä¹äºè¿æ ·çè½åï¼æä»¬å¯ä»¥éè¿å ¶æä¾çthenAppyãthenComposeç彿°å¼ç¼ç¨æ¹æ³æ¥ç»åç¼æè¿äºæ¥éª¤ã
# Java 21 æ°ç¹æ§ç¥éåªäºï¼
æ°æ°è¯è¨ç¹æ§ï¼
- Switch è¯å¥ç模å¼å¹é
ï¼è¯¥åè½å¨ Java 21 ä¸ä¹å¾å°äºå¢å¼ºãå®å
许å¨
switchçcaseæ ç¾ä¸ä½¿ç¨æ¨¡å¼å¹é ï¼ä½¿æä½æ´å çµæ´»åç±»åå®å ¨ï¼åå°äºæ ·æ¿ä»£ç åæ½å¨é误ãä¾å¦ï¼å¯¹äºä¸åç±»åçè´¦æ·ç±»ï¼å¯ä»¥å¨switchè¯å¥ä¸ç´æ¥æ ¹æ®è´¦æ·ç±»åçæ¨¡å¼æ¥è·åç¸åºçä½é¢ï¼å¦case savingsAccount sa -> result = sa.getSavings(); - æ°ç»æ¨¡å¼ï¼å°æ¨¡å¼å¹é
æ©å±å°æ°ç»ä¸ï¼ä½¿å¼åè
è½å¤å¨æ¡ä»¶è¯å¥ä¸æ´é«æå°è§£æåæ£æ¥æ°ç»å
容ãä¾å¦ï¼
if (arr instanceof int[] {1, 2, 3})ï¼å¯ä»¥ç´æ¥å¤ææ°ç»arræ¯å¦å¹é æå®ç模å¼ã - å符串模æ¿ï¼é¢è§çï¼ï¼æä¾äºä¸ç§æ´å¯è¯»ãæ´æç»´æ¤çæ¹å¼æ¥æå»ºå¤æåç¬¦ä¸²ï¼æ¯æå¨å符串åé¢éä¸ç´æ¥åµå
¥è¡¨è¾¾å¼ãä¾å¦ï¼ä»¥åå¯è½éè¦ä½¿ç¨
"hello " + name + ", welcome to the geeksforgeeks!"è¿æ ·çæ¹å¼æ¥æ¼æ¥å符串ï¼å¨ Java 21 ä¸å¯ä»¥ä½¿ç¨hello {name}, welcome to the geeksforgeeks!è¿ç§æ´ç®æ´çåæ³
æ°å¹¶åç¹æ§æ¹é¢ï¼
- èæçº¿ç¨ï¼è¿æ¯ Java 21 å¼å
¥çä¸ç§è½»é级并åçæ°éæ©ãå®éè¿å
±äº«å æ çæ¹å¼ï¼å¤§å¤§éä½äºå
åæ¶èï¼åæ¶æé«äºåºç¨ç¨åºçååéåååºé度ãå¯ä»¥ä½¿ç¨éææå»ºæ¹æ³ãæå»ºå¨æ
ExecutorServiceæ¥å建å使ç¨èæçº¿ç¨ã - Scoped Valuesï¼èå´å¼ï¼ï¼æä¾äºä¸ç§å¨çº¿ç¨é´å ±äº«ä¸å¯åæ°æ®çæ°æ¹å¼ï¼é¿å 使ç¨ä¼ ç»ç线ç¨å±é¨åå¨ï¼ä¿è¿äºæ´å¥½çå°è£ æ§å线ç¨å®å ¨ï¼å¯ç¨äºå¨ä¸éè¿æ¹æ³åæ°ä¼ éçæ åµä¸ï¼ä¼ éä¸ä¸æä¿¡æ¯ï¼å¦ç¨æ·ä¼è¯æé 置设置ã
# åºåå
# æä¹æä¸ä¸ªå¯¹è±¡ä»ä¸ä¸ªjvm转移å°å¦ä¸ä¸ªjvm?
- 使ç¨åºåååååºååï¼å°å¯¹è±¡åºåå为åèæµï¼å¹¶å°å ¶åéå°å¦ä¸ä¸ª JVMï¼ç¶åå¨å¦ä¸ä¸ª JVM ä¸ååºåååèæµæ¢å¤å¯¹è±¡ãè¿å¯ä»¥éè¿ Java ç ObjectOutputStream å ObjectInputStream æ¥å®ç°ã
- ä½¿ç¨æ¶æ¯ä¼ éæºå¶ï¼å©ç¨æ¶æ¯ä¼ éæºå¶ï¼æ¯å¦ä½¿ç¨æ¶æ¯éåï¼å¦ RabbitMQãKafkaï¼æè éè¿ç½ç»å¥æ¥åè¿è¡éä¿¡ï¼å°å¯¹è±¡ä»ä¸ä¸ª JVM åéå°å¦ä¸ä¸ªãè¿éè¦èªå®ä¹åè®®æ¥åºåå对象并å¨å¦ä¸ä¸ª JVM ä¸ååºååã
- 使ç¨è¿ç¨æ¹æ³è°ç¨ï¼RPCï¼ï¼å¯ä»¥ä½¿ç¨è¿ç¨æ¹æ³è°ç¨æ¡æ¶ï¼å¦ gRPCï¼æ¥å®ç°å¯¹è±¡å¨ä¸å JVM ä¹é´çä¼ è¾ãè¿ç¨æ¹æ³è°ç¨å¯ä»¥è®©ä½ å¨åå¸å¼ç³»ç»ä¸è°ç¨è¿ç¨ JVM ä¸çå¯¹è±¡çæ¹æ³ã
- 使ç¨å ±äº«æ°æ®åºæç¼åï¼å°å¯¹è±¡åå¨å¨å ±äº«æ°æ®åºï¼å¦ MySQLãPostgreSQLï¼æå ±äº«ç¼åï¼å¦ Redisï¼ä¸ï¼è®©ä¸åç JVM å¯ä»¥è®¿é®è¿äºå ±äº«æ°æ®ãè¿ç§æ¹æ³éç¨äºéè¦å ±äº«æ°æ®ä½ä¸éè¦ç´æ¥ä¼ è¾å¯¹è±¡çåºæ¯ã
# åºåååååºååè®©ä½ èªå·±å®ç°ä½ 伿ä¹å?
Java é»è®¤çåºååè½ç¶å®ç°æ¹ä¾¿ï¼ä½å´åå¨å®å ¨æ¼æ´ãä¸è·¨è¯è¨ä»¥åæ§è½å·®ç缺é·ã
- æ æ³è·¨è¯è¨ï¼ Java åºååç®ååªéç¨åºäº Java è¯è¨å®ç°çæ¡æ¶ï¼å ¶å®è¯è¨å¤§é¨å齿²¡æä½¿ç¨ Java çåºååæ¡æ¶ï¼ä¹æ²¡æå®ç° Java åºååè¿å¥åè®®ãå æ¤ï¼å¦ææ¯ä¸¤ä¸ªåºäºä¸åè¯è¨ç¼åçåºç¨ç¨åºç¸äºéä¿¡ï¼åæ æ³å®ç°ä¸¤ä¸ªåºç¨æå¡ä¹é´ä¼ è¾å¯¹è±¡çåºååä¸ååºååã
- 容æè¢«æ»å»ï¼Java åºå忝ä¸å®å ¨çï¼æä»¬ç¥é对象æ¯éè¿å¨ ObjectInputStream ä¸è°ç¨ readObject() æ¹æ³è¿è¡ååºååçï¼è¿ä¸ªæ¹æ³å ¶å®æ¯ä¸ä¸ªç¥å¥çæé å¨ï¼å®å¯ä»¥å°ç±»è·¯å¾ä¸å 乿æå®ç°äº Serializable æ¥å£ç对象é½å®ä¾åãè¿ä¹å°±æå³çï¼å¨ååºåååèæµçè¿ç¨ä¸ï¼è¯¥æ¹æ³å¯ä»¥æ§è¡ä»»æç±»åç代ç ï¼è¿æ¯é常å±é©çã
- åºåååçæµå¤ªå¤§ï¼åºåååçäºè¿å¶æµå¤§å°è½ä½ç°åºååçæ§è½ãåºåååçäºè¿å¶æ°ç»è¶å¤§ï¼å ç¨çåå¨ç©ºé´å°±è¶å¤ï¼åå¨ç¡¬ä»¶çææ¬å°±è¶é«ã妿æä»¬æ¯è¿è¡ç½ç»ä¼ è¾ï¼åå ç¨ç带宽就æ´å¤ï¼è¿æ¶å°±ä¼å½±åå°ç³»ç»çååéã
æä¼èèç¨ä¸»æµåºååæ¡æ¶ï¼æ¯å¦FastJsonãProtobufæ¥æ¿ä»£Java åºååã
å¦æè¿½æ±æ§è½çè¯ï¼Protobuf åºååæ¡æ¶ä¼æ¯è¾åéï¼Protobuf çè¿ç§æ°æ®å卿 ¼å¼ï¼ä¸ä» å缩å卿°æ®çææå¥½ï¼ å¨ç¼ç åè§£ç çæ§è½æ¹é¢ä¹å¾é«æãProtobuf çç¼ç åè§£ç è¿ç¨ç»å.proto æä»¶æ ¼å¼ï¼å ä¸ Protocol Buffer ç¬ç¹çç¼ç æ ¼å¼ï¼åªéè¦ç®åçæ°æ®è¿ç®ä»¥åä½ç§»çæä½å°±å¯ä»¥å®æç¼ç ä¸è§£ç ãå¯ä»¥è¯´ Protobuf çæ´ä½æ§è½é常ä¼ç§ã
# å°å¯¹è±¡è½¬ä¸ºäºè¿å¶åèæµå ·ä½æä¹å®ç°?
å ¶å®ï¼ååºåååååºååï¼æ 论è¿äºå¯éæä½æ¯ä»ä¹æºå¶ï¼é½ä¼æå¯¹åºçå¤çåè§£æåè®®ï¼ä¾å¦å å¯åè§£å¯ï¼TCPçç²å åæå ï¼åºååæºå¶æ¯éè¿åºåååè®®æ¥è¿è¡å¤ççï¼å class æä»¶ç±»ä¼¼ï¼å®å ¶å®æ¯å®ä¹äºåºåååçåèæµæ ¼å¼ï¼ç¶åå¯¹æ¤æ ¼å¼è¿è¡æä½ï¼çæç¬¦åæ ¼å¼çåèæµæè å°åèæµè§£ææå¯¹è±¡ã
å¨Javaä¸éè¿åºååå¯¹è±¡æµæ¥å®æåºåååååºååï¼
- ObjectOutputStreamï¼éè¿writeObject(ï¼æ¹æ³ååºååæä½ã
- ObjectInputStreanï¼éè¿readObject()æ¹æ³åååºååæä½ã
åªæå®ç°äºSerializableæExternalizableæ¥å£çç±»ç对象æè½è¢«åºååï¼å¦åæåºå¼å¸¸ï¼
å®ç°å¯¹è±¡åºååï¼
- 让类å®ç°Serializableæ¥å£ï¼
import java.io.Serializable;
public class MyClass implements Serializable {
// class code
}
- å建è¾åºæµå¹¶åå ¥å¯¹è±¡ï¼
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
MyClass obj = new MyClass();
try {
FileOutputStream fileOut = new FileOutputStream("object.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(obj);
out.close();
fileOut.close();
} catch (IOException e) {
e.printStackTrace();
}
å®ç°å¯¹è±¡ååºååï¼
- å建è¾å ¥æµå¹¶è¯»å对象ï¼
import java.io.FileInputStream;
import java.io.ObjectInputStream;
MyClass newObj = null;
try {
FileInputStream fileIn = new FileInputStream("object.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
newObj = (MyClass) in.readObject();
in.close();
fileIn.close();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
éè¿ä»¥ä¸æ¥éª¤ï¼å¯¹è±¡objä¼è¢«åºååå¹¶åå ¥å°æä»¶"object.ser"ä¸ï¼ç¶åéè¿ååºååæä½ï¼ä»æä»¶ä¸è¯»ååèæµå¹¶æ¢å¤ä¸ºå¯¹è±¡newObjãè¿ç§æ¹å¼å¯ä»¥æ¹ä¾¿å°å°å¯¹è±¡è½¬æ¢ä¸ºåèæµç¨äºæä¹ ååå¨ãç½ç»ä¼ è¾çæä½ãéè¦æ³¨æçæ¯ï¼è¦ç¡®ä¿ç±»å®ç°äºSerializableæ¥å£ï¼å¹¶ä¸æææååé齿¯Serializableçæè½è¢«æ£ç¡®åºååã
# 设计模å¼
# volatileåsychronizedå¦ä½å®ç°å便¨¡å¼
public class SingleTon {
// volatile å
³é®å修饰åé 鲿¢æä»¤éæåº
private static volatile SingleTon instance = null;
private SingleTon(){}
public static SingleTon getInstance(){
if(instance == null){
//忥代ç å åªæå¨ç¬¬ä¸æ¬¡è·åå¯¹è±¡çæ¶å伿§è¡å° ï¼ç¬¬äºæ¬¡å以åè®¿é®æ¶ instanceåéåénullæ
ä¸ä¼å¾ä¸æ§è¡äº ç´æ¥è¿åå¦
synchronized(SingleTon.class){
if(instance == null){
instance = new SingleTon();
}
}
}
return instance;
}
}
æ£ç¡®çå鿣æ¥é宿¨¡å¼éè¦éè¦ä½¿ç¨ volatileãvolatile主è¦å å«ä¸¤ä¸ªåè½ã
- ä¿è¯å¯è§æ§ãä½¿ç¨ volatile å®ä¹çåéï¼å°ä¼ä¿è¯å¯¹ææçº¿ç¨çå¯è§æ§ã
- ç¦æ¢æä»¤éæåºä¼åã
ç±äº volatile ç¦æ¢å¯¹è±¡åå»ºæ¶æä»¤ä¹é´éæåºï¼æä»¥å ¶ä»çº¿ç¨ä¸ä¼è®¿é®å°ä¸ä¸ªæªåå§åç对象ï¼ä»èä¿è¯å®å ¨æ§ã
# ä»£çæ¨¡å¼åéé 卿¨¡å¼æä»ä¹åºå«ï¼
- ç®çä¸åï¼ä»£ç模å¼ä¸»è¦å ³æ³¨æ§å¶å¯¹å¯¹è±¡ç访é®ï¼èéé 卿¨¡å¼åç¨äºæ¥å£è½¬æ¢ï¼ä½¿ä¸å ¼å®¹çç±»è½å¤ä¸èµ·å·¥ä½ã
- ç»æä¸åï¼ä»£ç模å¼ä¸è¬å 嫿½è±¡ä¸»é¢ãçå®ä¸»é¢å代çä¸ä¸ªè§è²ï¼éé 卿¨¡å¼å å«ç®æ æ¥å£ãéé å¨å被éé è ä¸ä¸ªè§è²ã
- åºç¨åºæ¯ä¸åï¼ä»£ç模å¼å¸¸ç¨äºæ·»å é¢å¤åè½ææ§å¶å¯¹å¯¹è±¡ç访é®ï¼éé 卿¨¡å¼å¸¸ç¨äºè®©ä¸å ¼å®¹çæ¥å£ååå·¥ä½ã
# è´£ä»»é¾æ¨¡å¼ä½¿ç¨åºæ¯æ¯ä»ä¹ï¼
è´£ä»»é¾æ¨¡å¼ç使ç¨åºæ¯æ ¸å¿å¾æç¡®ï¼å°±æ¯ä¸ä¸ªè¯·æ±éè¦å¤ä¸ªç¬ç«çå¤çé»è¾æ¥æ¿æ¥ï¼åæ¶ä¸æ³è®©è¯·æ±åèµ·æ¹åææå¤çè 产çå¼ºå ³èï¼è¿å¾è®©å¤çæµç¨è½çµæ´»è°æ´ï¼ç®å说就æ¯è°è½å¤çå°±è°æ¥æ¥æï¼æ´ä¸ªå¤ç顺åºååä¸èç¹è½æéæ¹å¨ã
æ¯å¦å®é å¼åéæå¸¸éå°çæ¥å£è¯·æ±æ ¡éªï¼ç¨æ·è°ç¨æä»¬çæ¥å£æ¶ï¼å¯è½å¾å æ£æ¥ç»å½ç¶æï¼åéªè¯ token æ¯å¦ææï¼æ¥ç确认æ¥å£è®¿é®æéï¼æåè¿è¦éå¶è¯·æ±é¢çï¼è¿äºæ ¡éªé»è¾åèªç¬ç«ï¼èä¸ä¸åæ¥å£éè¦çæ ¡éªæ¥éª¤ä¸ä¸æ ·ï¼æ¯å¦ç»å½æ¥å£åªéè¦éªè¯éªè¯ç ï¼æ¥è¯¢ç¨æ·ä¿¡æ¯çæ¥å£å¾åæ¶è¿ç»å½åæéæ ¡éªãè¦æ¯ä¸ç¨è´£ä»»é¾ï¼å°±å¾å¨æ¯ä¸ªæ¥å£éåä¸å if-else æè¿äºæ ¡éªä¸²èµ·æ¥ï¼åç»æ³æ¹æä¸ªæ ¡éªè§åï¼ææç¸å ³æ¥å£é½å¾å¨ï¼ç»´æ¤èµ·æ¥ç¹å«éº»ç¦ã
è¿æ¶åç¨è´£ä»»é¾å°±å¾åéï¼æä»¬å¯ä»¥ææ¯ä¸ªæ ¡éªé»è¾å°è£ æä¸ä¸ªå¤çèç¹ï¼å å®ä¹ä¸ä¸ªæ½è±¡çå¤çè ç±»ï¼
// æ½è±¡å¤çè
abstract class Handler {
protected Handler next;
// 设置ä¸ä¸ä¸ªå¤çèç¹
public void setNext(Handler next) {
this.next = next;
}
// æ½è±¡å¤çæ¹æ³
public abstract boolean handle(Request request);
}
ç¶åæ¯ä¸ªæ ¡éªé»è¾é½ç»§æ¿è¿ä¸ªç±»ï¼æ¯å¦ç»å½æ ¡éªï¼
// ç»å½ææ ¡éªèç¹
class LoginHandler extends Handler {
@Override
public boolean handle(Request request) {
if (request.isLogin()) {
System.out.println("ç»å½ææ ¡éªéè¿ï¼äº¤ç»ä¸ä¸ä¸ªèç¹");
// æ ¡éªéè¿ï¼äº¤ç»ä¸ä¸ä¸ªå¤çè
return next != null ? next.handle(request) : true;
} else {
System.out.println("æªç»å½ï¼ç´æ¥è¿å失败");
// æ ¡éªä¸éè¿ï¼ç»æ¢é¾è·¯
returnfalse;
}
}
}
åå个æéæ ¡éªèç¹ãé¢çéå¶èç¹ï¼æåå¨ä½¿ç¨çæ¶åï¼æ ¹æ®æ¥å£éæ±å¨æç»è£ é¾è·¯ï¼
// ç»è£
é¾è·¯ï¼ç»å½æ ¡éª -> æéæ ¡éª -> é¢çéå¶
Handler loginHandler = new LoginHandler();
Handler authHandler = new AuthHandler();
Handler rateLimitHandler = new RateLimitHandler();
loginHandler.setNext(authHandler);
authHandler.setNext(rateLimitHandler);
// å起请æ±
Request request = new Request(true, "admin", 1); // å·²ç»å½ã管çåæéã第1次请æ±
boolean result = loginHandler.handle(request);
è¿æ ·ä¸æ¥ï¼è¯·æ±åèµ·æ¹åªéè¦è°ç¨ç¬¬ä¸ä¸ªèç¹ï¼æ ¹æ¬ä¸ç¨å ³å¿å颿å¤å°æ ¡éªæ¥éª¤ï¼ä¹ä¸ç¨ç¥éå ·ä½æ¯åªä¸ªèç¹å¨å¤çï¼å¦ææä¸ªæ¥å£ä¸éè¦é¢çéå¶ï¼ç´æ¥å»æ rateLimitHandler çç»è£ å°±è¡ï¼ä¸ç¨ä¿®æ¹ä»»ä½æ ¡éªèç¹ç代ç ï¼æµç¨è°æ´èµ·æ¥ç¹å«çµæ´»ã
# ä»ç»ä¸ä¸çç¥æ¨¡å¼åè´£ä»»é¾æ¨¡å¼ï¼åå«ç¨å¨åªäºåºæ¯ï¼
è¿ä¸¤ä¸ªè®¾è®¡æ¨¡å¼é½å±äºè¡ä¸ºå模å¼ï¼èä¸å¨å®é
å¼åä¸ï¼å®ä»¬å¾å¾é½æ¯ä¸ºäºè§£å³åä¸ä¸ªçç¹ï¼å¦ä½æ¶é¤ä»£ç ä¸å¤æç **if-else** æ **switch-case** é»è¾ï¼ä»èè®©ç³»ç»æ´æäºæ©å±ã
çç¥æ¨¡å¼
çç¥æ¨¡å¼å®ä¹ä¸ç³»åç®æ³ï¼æå®ä»¬ä¸ä¸ªä¸ªå°è£ èµ·æ¥ï¼å¹¶ä¸ä½¿å®ä»¬å¯ç¸äºæ¿æ¢ãä»èè®©ç®æ³å¯ç¬ç«äºä½¿ç¨å®ç客æ·èååã
åè®¾ä½ æ£å¨å¼åä¸ä¸ªçµåç½ç«çæ¯ä»æ¨¡åãç¨æ·å¯ä»¥éæ©æ¯ä»å®ã微信æ¯ä»æè é¶è¡å¡æ¯ä»ãæ¯ç§æ¯ä»æ¹å¼çåºå±é»è¾ï¼æ¯å¦è°ç¨ç APIãå 坿¹å¼ãåæ°æé ï¼é½å®å ¨ä¸åï¼ä½å¯¹äºè°ç¨æ¯ä»åè½çä¸å±ä¸å¡é»è¾æ¥è¯´ï¼å®åªéè¦è°ç¨ä¸ä¸ªç»ä¸ç âæ¯ä»â æ¹æ³å³å¯ï¼æ éå ³å¿å ·ä½æ¯åªç§æ¯ä»ã
è¿å°±æ¯çç¥æ¨¡å¼çç¨æ¦ä¹å°ãæä»¬ææ¯ç§æ¯ä»æ¹å¼ï¼æ¯ä»å®ã微信ï¼é½å°è£ æä¸ä¸ªç¬ç«ç âçç¥â ç±»ï¼å®ä»¬é½éµå¾ªä¸ä¸ªå ±åçæ¥å£ãä¸å±ä¸å¡ä»£ç éè¿è¿ä¸ªå ±åçæ¥å£æ¥è°ç¨æ¯ä»åè½ï¼å¹¶å¯ä»¥å¨è¿è¡æ¶æ ¹æ®ç¨æ·çéæ©ï¼å¨æå°åæ¢ä¸åççç¥ã
æä»¥ï¼çç¥æ¨¡å¼éç¨åºæ¯å¦ä¸ï¼
- å½ä¸ä¸ªç³»ç»éè¦å¨æå°å¨å ç§ç®æ³ä¸éæ©ä¸ç§æ¶ã
- å½ä¸ä¸ªå¯¹è±¡æå¾å¤è¡ä¸ºï¼ä¸æ³ä½¿ç¨å¤§éç
if-elseæswitch-caseè¯å¥æ¥éæ©æ¶ã - å½ä½ å¸æç®æ³çååä¸ä¼å½±åå°ä½¿ç¨å®ç客æ·ç«¯æ¶ã
è´£ä»»é¾æ¨¡å¼
è´£ä»»é¾æ¨¡å¼æ ¸å¿ææ³æ¯ä¸ºè¯·æ±å建ä¸ä¸ªæ¥æ¶è 对象çé¾ã对请æ±çåéè 忥æ¶è è¿è¡è§£è¦ï¼è®©å¤ä¸ªå¯¹è±¡é½ææºä¼å¤çè¿ä¸ªè¯·æ±ãè¯·æ±æ²¿çé¾ä¼ éï¼ç´å°é¾ä¸çä¸ä¸ªå¯¹è±¡å¤çå®ä¸ºæ¢ã
æ³è±¡ä¸ä¸å ¬å¸éç请åå®¡æ¹æµç¨ãä¸ä¸ªåå·¥è¦è¯·åï¼ä»é¦å ä¼æè¯·åæ¡äº¤ç»èªå·±çç´å±ç»çãå¦æè¯·å天æ°å¾çï¼æ¯å¦ 1 天ï¼ï¼ç»çèªå·±å°±è½æ¹åã妿天æ°è¾é¿ï¼æ¯å¦ 5 天ï¼ï¼ç»ç没ææéï¼å°±éè¦æè¯·åæ¡ä¸æ¥ç»é¨é¨æ»çãæ»ç乿èªå·±çå®¡æ¹æéä¸éï¼å¦æè¶ è¿äºï¼å°±éè¦ç»§ç»ä¸æ¥ç»æ»ç»çã
å¨è¿ä¸ªè¿ç¨ä¸ï¼è¯·åæ¡ï¼è¯·æ±ï¼å°±å¨ä¸æ¡ç±ç»ç -> æ»ç -> æ»ç»çï¼æ¥æ¶è é¾ï¼ä¸ä¼ éï¼ç´å°æä¸ªè§è²ï¼æ¥æ¶è ï¼è½å¤å¤çå®ãåéè¯·åæ¡çåå·¥ï¼å®¢æ·ç«¯ï¼å¹¶ä¸ç¥éæç»æ¯è°æ¹åäºä»çåï¼ä»åªéè¦æè¯·æ±æäº¤ç»é¾ç第ä¸ä¸ªèç¹ï¼ç»çï¼å³å¯ã
æä»¥ï¼è´£ä»»é¾æ¨¡å¼éç¨åºæ¯æ»ç»ï¼
- 彿å¤ä¸ªå¯¹è±¡å¯ä»¥å¤çåä¸ä¸ªè¯·æ±ï¼ä½å ·ä½ç±åªä¸ªå¯¹è±¡å¤çéè¦å¨è¿è¡æ¶å³å®æ¶ã
- å½ä½ å¸æè¯·æ±çåéè 忥æ¶è è§£è¦ï¼ä¸ç´æ¥éä¿¡æ¶ã
- å½ä½ éè¦å¨æå°æå®åä¿®æ¹å¤çä¸ä¸ªè¯·æ±ç对象éåæ¶ã
# I/O
# Javaæä¹å®ç°ç½ç»IOé«å¹¶åç¼ç¨ï¼
å¯ä»¥ç¨ Java NIO ï¼æ¯ä¸ç§åæ¥éé»å¡çI/O模åï¼ä¹æ¯I/Oå¤è·¯å¤ç¨çåºç¡ã
ä¼ ç»çBIOéé¢socket.read()ï¼å¦æTCP RecvBufferéæ²¡ææ°æ®ï¼å½æ°ä¼ä¸ç´é»å¡ï¼ç´å°æ¶å°æ°æ®ï¼è¿å读å°çæ°æ®ï¼ å¦æä½¿ç¨BIOè¦æ³è¦å¹¶åå¤çå¤ä¸ªå®¢æ·ç«¯çi/oï¼é£ä¹ä¼ä½¿ç¨å¤çº¿ç¨æ¨¡å¼ï¼ä¸ä¸ªçº¿ç¨ä¸é¨å¤çä¸ä¸ªå®¢æ·ç«¯ ioï¼è¿ç§æ¨¡å¼éç客æ·ç«¯è¶æ¥è¶å¤ï¼æéè¦å建ç线ç¨ä¹è¶æ¥è¶å¤ï¼ä¼æ¥å§æ¶èç³»ç»çæ§è½ã

NIO æ¯åºäºI/Oå¤è·¯å¤ç¨å®ç°çï¼å®å¯ä»¥åªç¨ä¸ä¸ªçº¿ç¨å¤çå¤ä¸ªå®¢æ·ç«¯I/Oï¼å¦æä½ éè¦åæ¶ç®¡çæåä¸ä¸çè¿æ¥ï¼ä½æ¯æ¯ä¸ªè¿æ¥åªåéå°éæ°æ®ï¼ä¾å¦ä¸ä¸ªè天æå¡å¨ï¼ç¨NIOå®ç°ä¼æ´å¥½ä¸äºã

# BIOãNIOãAIOåºå«æ¯ä»ä¹ï¼
- BIOï¼blocking IOï¼ï¼å°±æ¯ä¼ ç»ç java.io å ï¼å®æ¯åºäºæµæ¨¡åå®ç°çï¼äº¤äºçæ¹å¼æ¯åæ¥ãé»å¡æ¹å¼ï¼ä¹å°±æ¯è¯´å¨è¯»å ¥è¾å ¥æµæè è¾åºæµæ¶ï¼å¨è¯»åå¨ä½å®æä¹åï¼çº¿ç¨ä¼ä¸ç´é»å¡å¨é£éï¼å®ä»¬ä¹é´çè°ç¨æ¯å¯é ç线æ§é¡ºåºãä¼ç¹æ¯ä»£ç æ¯è¾ç®åãç´è§ï¼ç¼ºç¹æ¯ IO çæç忩屿§å¾ä½ï¼å®¹ææä¸ºåºç¨æ§è½ç¶é¢ã
- NIOï¼non-blocking IOï¼ ï¼Java 1.4 å¼å ¥ç java.nio å ï¼æä¾äº ChannelãSelectorãBuffer çæ°çæ½è±¡ï¼å¯ä»¥æå»ºå¤è·¯å¤ç¨çã忥éé»å¡ IO ç¨åºï¼åæ¶æä¾äºæ´æ¥è¿æä½ç³»ç»åºå±é«æ§è½çæ°æ®æä½æ¹å¼ã
- AIOï¼Asynchronous IOï¼ ï¼æ¯ Java 1.7 ä¹åå¼å ¥çå ï¼æ¯ NIO çåçº§çæ¬ï¼æä¾äºå¼æ¥éå µå¡ç IO æä½æ¹å¼ï¼æä»¥äººä»¬å«å® AIOï¼Asynchronous IOï¼ï¼å¼æ¥ IO æ¯åºäºäºä»¶ååè°æºå¶å®ç°çï¼ä¹å°±æ¯åºç¨æä½ä¹åä¼ç´æ¥è¿åï¼ä¸ä¼å µå¡å¨é£éï¼å½åå°å¤çå®æï¼æä½ç³»ç»ä¼éç¥ç¸åºç线ç¨è¿è¡åç»çæä½ã
# NIOæ¯æä¹å®ç°çï¼
NIOæ¯ä¸ç§åæ¥éé»å¡çIO模åï¼æä»¥ä¹å¯ä»¥å«NON-BLOCKINGIOãåæ¥æ¯æçº¿ç¨ä¸æè½®è¯¢IOäºä»¶æ¯å¦å°±ç»ªï¼éé»å¡æ¯æçº¿ç¨å¨çå¾ IOçæ¶åï¼å¯ä»¥åæ¶åå ¶ä»ä»»å¡ã
åæ¥çæ ¸å¿å°±Selectorï¼I/Oå¤è·¯å¤ç¨ï¼ï¼Selector代æ¿äºçº¿ç¨æ¬èº«è½®è¯¢IOäºä»¶ï¼é¿å äºé»å¡åæ¶åå°äºä¸å¿ è¦ççº¿ç¨æ¶èï¼éé»å¡çæ ¸å¿å°±æ¯ééåç¼å²åºï¼å½IOäºä»¶å°±ç»ªæ¶ï¼å¯ä»¥éè¿åå°ç¼å²åºï¼ä¿è¯IOçæåï¼èæ é线ç¨é»å¡å¼å°çå¾ ã
NIOç±ä¸ä¸ªä¸é¨ç线ç¨å¤çææIOäºä»¶ï¼å¹¶è´è´£ååãäºä»¶é©±å¨æºå¶ï¼äºä»¶å°æ¥çæ¶å触åæä½ï¼ä¸éè¦é»å¡ççè§äºä»¶ã线ç¨ä¹é´éè¿wait,notifyéä¿¡ï¼åå°çº¿ç¨åæ¢ã
NIOä¸»è¦æä¸å¤§æ ¸å¿é¨åï¼Channel(éé)ï¼Buffer(ç¼å²åº), Selectorãä¼ ç»IOåºäºåèæµåå符æµè¿è¡æä½ï¼èNIOåºäºChannelåBuffer(ç¼å²åº)è¿è¡æä½ï¼æ°æ®æ»æ¯ä»éé读åå°ç¼å²åºä¸ï¼æè ä»ç¼å²åºåå ¥å°ééä¸ã
Selector(éæ©åº)ç¨äºçå¬å¤ä¸ªééçäºä»¶ï¼æ¯å¦ï¼è¿æ¥æå¼ï¼æ°æ®å°è¾¾ï¼ãå æ¤ï¼å个线ç¨å¯ä»¥çå¬å¤ä¸ªæ°æ®ééã

# ä½ ç¥éæåªä¸ªæ¡æ¶ç¨å°NIOäºåï¼
Nettyã
Netty ç I/O æ¨¡åæ¯åºäºéé»å¡ I/O å®ç°çï¼åºå±ä¾èµçæ¯ NIO æ¡æ¶çå¤è·¯å¤ç¨å¨ Selectorãéç¨ epoll 模å¼åï¼åªéè¦ä¸ä¸ªçº¿ç¨è´è´£ Selector ç轮询ãå½ææ°æ®å¤äºå°±ç»ªç¶æåï¼éè¦ä¸ä¸ªäºä»¶ååå¨ï¼Event Dispatherï¼ï¼å®è´è´£å°è¯»åäºä»¶ååç»å¯¹åºç读åäºä»¶å¤çå¨ï¼Event Handlerï¼ãäºä»¶åå卿䏤ç§è®¾è®¡æ¨¡å¼ï¼Reactor å Proactorï¼Reactor éç¨åæ¥ I/Oï¼ Proactor éç¨å¼æ¥ I/Oã

Reactor å®ç°ç¸å¯¹ç®åï¼éåå¤çèæ¶ççåºæ¯ï¼å¯¹äºèæ¶é¿ç I/O æä½å®¹æé æé»å¡ãProactor æ§è½æ´é«ï¼ä½æ¯å®ç°é»è¾é叏夿ï¼éåå¾çæè§é¢æµåææå¡å¨ï¼ç®å主æµçäºä»¶é©±å¨æ¨¡åè¿æ¯ä¾èµ select æ epoll æ¥å®ç°ã
# å ¶ä»
# æä¸ä¸ªå¦çç±»ï¼æ³æç §åæ°æåºï¼åæå¦å·æåºï¼åºè¯¥æä¹åï¼
å¯ä»¥ä½¿ç¨Comparableæ¥å£æ¥å®ç°æç §åæ°æåºï¼åæç §å¦å·æåºãé¦å å¨å¦çç±»ä¸å®ç°Comparableæ¥å£ï¼å¹¶éåcompareToæ¹æ³ï¼ç¶åå¨compareToæ¹æ³ä¸å®ç°æç §åæ°æåºåæç §å¦å·æåºçé»è¾ã
public class Student implements Comparable<Student> {
private int id;
private int score;
// æé æ¹æ³åå
¶ä»å±æ§ãæ¹æ³çç¥
@Override
public int compareTo(Student other) {
if (this.score != other.score) {
return Integer.compare(other.score, this.score); // æç
§åæ°éåºæåº
} else {
return Integer.compare(this.id, other.id); // 妿忰ç¸åï¼åæç
§å¦å·ååºæåº
}
}
}
ç¶åå¨éè¦å¯¹å¦çå表è¿è¡æåºçå°æ¹ï¼ä½¿ç¨Collections.sort()æ¹æ³å¯¹å¦çå表è¿è¡æåºå³å¯ï¼
List<Student> students = new ArrayList<>();
// æ·»å å¦ç对象å°å表ä¸
Collections.sort(students);
# Nativeæ¹æ³è§£éä¸ä¸
å¨Javaä¸ï¼nativeæ¹æ³æ¯ä¸ç§ç¹æ®ç±»åçæ¹æ³ï¼å®å 许Java代ç è°ç¨å¤é¨çæ¬å°ä»£ç ï¼å³ç¨CãC++æå ¶ä»è¯è¨ç¼åç代ç ãnativeå ³é®åæ¯Javaè¯è¨ä¸çä¸ç§å£°æï¼ç¨äºæ è®°ä¸ä¸ªæ¹æ³çå®ç°å°å¨å¤é¨å®ä¹ã
å¨Javaç±»ä¸ï¼nativeæ¹æ³çèµ·æ¥ä¸å ¶ä»æ¹æ³ç¸ä¼¼ï¼åªæ¯å ¶æ¹æ³ä½ç±nativeå ³é®å代æ¿ï¼æ²¡æå®é çå®ç°ä»£ç ãä¾å¦ï¼
public class NativeExample {
public native void nativeMethod();
}
è¦å®ç°nativeæ¹æ³ï¼ä½ éè¦å®æä»¥ä¸æ¥éª¤ï¼
- çæJNI头æä»¶ï¼ä½¿ç¨javahå·¥å ·ä»ä½ çJavaç±»çæC/C++ç头æä»¶ï¼è¿ä¸ªå¤´æä»¶å å«äºæænativeæ¹æ³çååã
- ç¼åæ¬å°ä»£ç ï¼ä½¿ç¨C/C++ç¼åæ¬å°æ¹æ³çå®ç°ï¼å¹¶ç¡®ä¿æ¹æ³ç¾åä¸çæç头æä»¶ä¸çååå¹é ã
- ç¼è¯æ¬å°ä»£ç ï¼å°C/C++代ç ç¼è¯æå¨æé¾æ¥åºï¼DLLï¼å¨Windowsä¸ï¼ï¼å ±äº«åºï¼SOï¼å¨Linuxä¸ï¼
- å è½½æ¬å°åºï¼å¨Javaç¨åºä¸ï¼ä½¿ç¨System.loadLibrary()æ¹æ³æ¥å è½½ä½ ç¼è¯å¥½çæ¬å°åºï¼è¿æ ·JVMå°±è½æ¾å°å¹¶è°ç¨nativeæ¹æ³çå®ç°äºã
# Java è¿ç¨æ¯æä¹è·æä½ç³»ç»äº¤äºçï¼
Javaç¨åºè½ç¶æ¯è¿è¡å¨JVMä¸çï¼ä½JVMæ¬èº«å°±æ¯ä¸ä¸ªæä½ç³»ç»è¿ç¨ï¼æä»¥Javaè·æä½ç³»ç»ç交äºï¼æ¬è´¨ä¸æ¯éè¿JVMè¿ä¸ªä¸é´å±æ¥å®æçã
æåºç¡ç交äºå°±æ¯å å管çãJVMå¯å¨æ¶ä¼éè¿ç³»ç»è°ç¨åæä½ç³»ç»ç³è¯·å åï¼æ¯å¦å¨Linuxä¸ç¨mmapãbrkè¿äºç³»ç»è°ç¨æ¥åé å å åãæ å åãè½ç¶æä»¬å¨Java代ç éånew对象ï¼ä½åºå±è¿æ¯è¦è·æä½ç³»ç»æäº¤éè·åçå®çç©çå åã
线ç¨ç®¡ç乿¯éè¦ç交äºç¹ãJavaéå建ç线ç¨å¯¹åºæä½ç³»ç»çåç线ç¨ï¼å¨Linuxä¸ä¼è°ç¨pthread_createæ¥å建线ç¨ã线ç¨çè°åº¦ã忥æºå¶ï¼æ¯å¦synchronizedåºå±ç¨çäºæ¥éï¼æç»é½æ¯ç±æä½ç³»ç»æ¥ç®¡ççã
IOæä½æ¯æé¢ç¹ç交äºåºæ¯ãæä»¶è¯»åä¼è°ç¨readãwriteè¿äºç³»ç»è°ç¨ï¼ç½ç»ç¼ç¨åºå±ä¹æ¯è°ç¨socketãbindãlistenè¿äºç³»ç»è°ç¨ãJavaçNIOç¨çæ¯æä½ç³»ç»æä¾ç髿§è½IOæºå¶ï¼Linux䏿¯epollï¼Windows䏿¯IOCPã
JNIæ¯å¦ä¸ä¸ªéè¦ééãæäºæä½Javaåä¸äºæè æ§è½ä¸å¤ï¼å°±éè¿JNIè°ç¨C/C++代ç ï¼è¿äºæ¬å°ä»£ç å¯ä»¥ç´æ¥è°ç¨æä½ç³»ç»APIãJVMæ¬èº«ä¹å¤§é使ç¨JNIæ¥å®ç°åºå±åè½ã

è¿æä¿¡å·å¤çï¼æ¯å¦ä½ ç¨killå½ä»¤ç»Javaè¿ç¨åSIGTERMä¿¡å·ï¼JVM伿è·è¿ä¸ªä¿¡å·ç¶åæ§è¡å ³éé©åãè¿ç¨é´éä¿¡ãè·åç³»ç»èµæºä¿¡æ¯è¿äºï¼åºå±ä¹é½æ¯éè¿ç³»ç»è°ç¨å®æçã
ä»ç¨æ·æåå æ ¸æçè§åº¦è¯´ï¼Java代ç è¿è¡å¨ç¨æ·æï¼ä½IOãç½ç»è¿äºæä½éè¦åæ¢å°å æ ¸æï¼è¿ä¸ªåæ¢æ¯æå¼éçãJVMä¼åå¾å¤ä¼åï¼æ¯å¦ç¨ç¼å²åºåå°ç³»ç»è°ç¨æ¬¡æ°ãè½ç¶JVMå±è½äºåºå±å·®å¼è®©Java代ç 跨平å°ï¼ä½å¨æ¯ä¸ªå¹³å°ä¸JVMé½è¦éé 该平å°çç³»ç»è°ç¨åAPIã
ææ°çå¾è§£æç« é½å¨å ¬ä¼å·é¦åï¼å«å¿è®°å ³æ³¨å¦ï¼ï¼å¦æä½ æ³å å ¥ç¾äººææ¯äº¤æµç¾¤ï¼æ«ç 䏿¹äºç»´ç åå¤ãå 群ãã

