- java的核心優勢:
跨平臺,由於提供不同系統的jvm可以讓javaapp通過jvm面對不同的操作系統 - java各個版本的含義:
javaSE:JAVA STANDARD Edition:標準版:定位個人計算機,java平臺的核心,提供豐富的API包含AWT及Swing,此外Applet被FLASH、HTML5取代;必學
javaEE:JAVA ENTERPRISE EDITION: 企業版,定位服務器,SE的擴展,增加用於服務器開發的類庫。如JDBC、Servlet、Request-Response、JSP
JAVEME:JAVE MICRO EDITION: 微型版,定位消費電子產品,含J2SE一部分核心類,SE的內伸。被Android取代 - java的特性和優勢:
①跨平臺/可移植性:如int永遠32位
②安全性:爲網絡/分佈式環境構建了防病毒,防篡改的系統
③面向對象:比C++(兼容C)更徹底,完全面向對象。
④簡單性:C+±,去除頭文件,指針運算,結構,聯合,操作符重載,虛基類,基於C易學習
⑤高性能:初期性能低,後期優化jvm加入JIT(即時編譯技術),通過編譯本地化“熱點”代碼,並緩存起來,提高編譯效率。
⑥分佈式:爲Internet分佈式環境設計,可處理TCP/IP協議,可通過URL訪問網絡資源和訪問本地文件相似,支持遠程方法調用(RMI,Remote Method Invocation),使程序可通過網絡方法調用。
⑦多線程:帶來更好的交互和實時行爲。也是成爲主流服務端開發語言原因之一。
⑧健壯性:去除指針,內存申請和釋放等。自帶GC;出色的異常機制避免了計算機崩潰和程序崩潰。 - java的運行機制:
源文件.java,通過jdk編譯器編譯成.class文件,通過JRE的類裝載器,字節碼校驗器,解釋器以及JIT進行解釋執行,系統運行app - JVM、JRE、JDK區別
JVM:java virtual machine:虛擬機,執行bytecode字節碼的虛擬計算機,定義了:指令集,寄存器集,結構棧,垃圾收集堆,內存區域。負責將java字節碼解釋運行,解釋邊運行。
JRE:java runtime environment:含JVM、庫函數、運行java程序必須的文件(只運行javaapp只需要jre)
JDK:java development kit:含JRE,以及增加編譯器和調試器等用於程序開發的文件(開發必備);
JDK(javac,jar,debugging,tools,javap)》JRE(Java,javaw,libraries,rt,jar)》JVM(JIT) - 標識符的概念及規則、規範:
概念:用於命名:變量、類、方法名
規則:用字母、數字、下劃線_、、數字組成
大小寫敏感,無長度限制
不可以爲關鍵字;
規範:類名:每個單詞首字母大寫
方法名、變量:第一個單詞首字母小寫,其餘單詞首字母大寫,“駝峯原則” - 變量的本質:
是可操作的連續空間,空間位置確定,內容不定,可通過變量名訪問“存儲空間”,並進行操作。
包含:變量名,變量類型,作用域;先聲明分配相應長度存儲空間,[初始化]後使用; - 變量類型:
基本類型,引用類型 - 變量分類:
局部變量local variable:聲明在語句塊活方法內,從屬方法或語句塊,週期跟隨方法活語句塊,必須初始化使用;
成員變量member variable(實例變量):聲明於類內部方法外部,叢書對象,週期跟隨對象,可默認初始化,
靜態變量static variable(類變量):聲明於類內部,static修飾,從屬類,週期跟隨類加載、卸載、消失,可被更改,所有類對象公用一個。 - 常量定義,分類:
定義:固定的值,(符號常量)用final修飾,一旦初始化不能修改,(靜態變量通行不可更改,故而用加上final變成靜態常量且需要手動初始化)
分類:字面常量:1,2,true,’b’,”hello”
符號常量:用final修飾定義。final double PI = 3.14; - 變量和常量命名規範:
所有變量、方法、類名:見名知意
類成員變量:首字母小寫,駝峯原則
局部變量:首字母小寫駝峯原則
常量:大寫字母和下劃線組合:MAX_VALUE
類名:首字母大寫和駝峯原則:GoodMan
方法名:首字母小寫和駝峯原則 - 數據類型分類,詳細分類
基本數據類型(primitive data type):
數值型:
整數類型:byte 1byte,short 2byte,int 4byte,long 8byte
浮點類型:float 4byte,double 8byte
字符型:char 2byte
布爾型:boolean 1bit
引用數據類型(reference data type):(記錄的是對象的地址)
類:class 4byte
接口:interface 4byte
數組:array[] 4byte - 整數變量各個類型的範圍,表現形式:
byte 1byte -128-127 (二進制8位,正負各分一半)
short 2byte -32768-32767
int 4byte -21億-21億
long 8byte -263-263-1 - 整數常量的四種進制表現形式:
十進制:99,
八進制:0開頭
十六進制:0X或0x開頭
二進制:0b或0B開頭 - Java 默認整數(字面)常數類型:
int ,如果聲明long型字面常量可後加L或l(不加可能導致超過int範圍,沒出錯是在範圍內的自動轉型) - 浮點變量的各個類型和範圍
float 4byte -3.4E38-3.4E38
double 8byte -3.4E308-3.4E308
float可精確7位尾數,單常用的是double,精度是float的兩倍, - 浮點字面常量的默認類型:
double - 浮點型字面常量的各進制表現形式:
十進制:3.14
科學計數法:314e2,314E-2
float的字面數值後要加F或f,沒有的默認爲double類型,可在double後加D或d - 精確的無誤差數字計算使用的類:
java.math.BigDecimal類用於浮點運算,常用於金融領域。
java.math.BigInteger類常用於整數運算。 - 浮點數比較方式:
通過BigDecimal; - BigDecimal的常用方法:
BigDecimal.valueOf(double):用於獲取精確的浮點值
subtract(BigDecimal):用於減法。
multiply(BigDecimal):乘法
add(BigDecimal):加法
divide(BigDecimal):除法
abs(BigDecimal):絕對值
compareTo(BigDecimal):比較,等爲0,大爲1,小爲-1
- ‘A’ == “A”的結果,爲什麼?
結果是不能比較,編譯出錯;一個是字符一個是字符串。 - char使用的字符集,佔空間大小,範圍
Unicode編碼表中的字符,佔2字節,允許0-65536個字符;編碼從‘\u000’到‘\uFFFF’
u表示Unicode,後加四位16進制。注意‘One’是錯的,他是無效字符 - char字面常量的表現形式
char可以用16進制方式也可以直接用字符來表示。 - char常用的轉義字符\搭配
\b退格 \u0008
\n換行 \u000a
\r回車 \u000d
\t製表符tab \u0009
\”雙引號 \u0022
\’單引號 \u0027
\反斜槓 \u005c - String的本質:
字符序列:char sequence - boolean常量值true/false在內存中佔空間?
1位 - 運算符的分類:8種
算數運算符(一元,二元)
賦值運算符
擴展運算符
關係運算符(除去大小等等,還有instanceof用於實例相同比較)
邏輯運算符
位運算符
條件運算符
字符串連接符 - %的作用:
取模,取餘數 - 二元運算符的運算規則:
整數運算:
兩個整數字面量爲操作數,存在一個爲Long,結果也爲Long
沒有Long時,都爲int,無論操作數是byte和short
浮點運算:
有double,結果爲double
兩個都爲float則結果爲float。
取模運算:
操作數可爲浮點數,一般用整數,結果爲“餘數”,符號與左邊操作數相同。 - 一元運算符運算規則:“++/–”自增運算符
i++:先用後自增
++i:後用後自增
看自增運算符是先是後,在前就先自增。 - 關係運算符的操作數類型,結果類型
=不是關係運算符;
==,!= 是所有(基本和引用)數據類型都可以使用;當爲引用(如String)時比對的是引用地址。
'>、>=、<、<='僅針對數值類型(byte/short/int/long,float/double,char) - 邏輯運算符的操作數類型,運算結果類型,&和&&,|和||的區別,邏輯異或^的判斷方式:
操作數和結果類型:boolean值。
&&是短路與,一旦左邊第一個條件爲false則直接返回false,&則需要判斷所有操作數,此外&的操作數爲非boolean時則是位運算與。
||是短路與,一旦左邊第一個條件爲true則直接返回true,|則需要判斷所有操作數,此外|的操作數爲非boolean時則是位運算非
短路常用於空指針的預防。
^:兩個操作數相相爲false,不同爲true;此外|的操作數爲非boolean時則是位運算異或 - '3<<2’的值,'12>>3’的值,~3的值:
3爲0b10100b0101:結果爲4
‘322’,2爲3的二進制左移兩位,結果爲12
‘12/2/2/2’,3爲12的2進制有右移動3位置.結果爲1,同理,'12>>4’結果爲0 - 字符串連接符“+”規則:
只要兩個操作數中有一個時String類型,則系統將會將另一個操作數自動轉換爲字符串然後拼接。 - 運算符優先級:
一般邏輯非》邏輯與》邏輯或
A||B&&C的實際運算爲:A||(B&&C) - 數據類型的自動轉換:
注意字面常量數的範圍,如果爲默認時別超過int的範圍21億 - 強制類型轉換的概念:
又稱造型(由大到小):用於顯示轉換一個數值的類型,可能會出現丟失信息,可能造成精度降低或溢出。
(type)var
當出現目標type的範圍時,會被截斷成不同的值(一般是範圍內的循環)
不可以在布爾類型和任何數值類型之間做強制轉換。 - Java的鍵盤輸入常用類及方法:
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int age = scanner.nextInt();
- 流程控制語句的分類:
順序結構,選擇結構,循環結構 - 程序的本質:
變量,選擇語句,循環語句 - 算法的基本構成:
變量,選擇結構,順序結構,循環結構共同支撐了算法的基本結構 - 選擇結構的分類:
If選擇結構:if單選擇結構,if-else雙選擇結構,if-else if-else多選擇結構
Switch選擇結構。 - 獲取0-1之間的隨機數,
Java.lang.Math.ramdom();可以生成[0,1)之間的隨機數。 - If單分支如果不寫{}後續代碼的執行效果:
會執行後面的第一條語句。 - If-else有時候可以通過那種方式替換:
1>2?”假的”:”真的”;條件運算符。 - If-else if-else多選擇結構的執行順序,以及編寫建議:
執行順序:從上到下,遇真進入執行並返回
編寫建議:後續分支的條件不要和先序條件有交集。逐層遞進,需要理清先後順序。 - switch多選擇結構的語法,執行原理:
switch (表達式) {
case 值1:
語句序列1;
[break];
case 值2:
語句序列2;
[break];
… … … … …
[default:
默認語句;]
}
根據表達式的值,從相匹配的case標籤處開始執行,一直執行到break語句處,或是語句末尾。如果一直不匹配,則進入default(當default存在時)
50. switch中表達式的可用類型:
jdk1.5前:必須是整數,long除外;或者是枚舉,不可以爲字符串
jdk1.7之後:可以爲String
當前表達式可以爲:byte,short,int,char,枚舉;Stirng(1.7以上)
51. if多分枝和switch多分枝的使用區分:
任何switch多分枝可以通過if多分枝替換;
表區間判斷的時候,只能夠用if多分枝;
當是對明確值做等值判斷時建議使用switch分支,明確。
52. 循環結構的分類:
當型:當布爾表達式條件爲true時,反覆執行某語句塊,當表達式爲false時才停止循環。While/for
直到型:先執行某語句,再判斷布爾表達式。如果爲true,再次執行。反覆,直到布爾表達式爲false停止。Do-while
53. While循環的使用注意點:
循環開始即判斷布爾表達式。先執行先判斷
語句中應該有是循環趨向結束的語句,否則陷入死循環。
54. do-while循環的使用注意點:
先執行一次語句,再判斷布爾表達式。後執行後判斷
語句中應該有是循環趨向結束的語句,否則陷入死循環。
55. for循環的語法,語句執行順序:
for(初始表達式;布爾表達式;迭代因子){
循環體;
}
A. 初始化部分設置循環變量的初值
B. 條件判斷部分爲任意布爾表達式
C. 循環語句(可能跳過)
D. 迭代因子控制循環變量的增減
B.。。。。。
56. for循環和while,dowhile的區別:
for循環:支持迭代的通用結構,有效靈活,第一次反覆之前,需要執行初始化,再進行布爾表達式的判斷;之後執行語句;執行完之後,會執行迭代因子的步進;(先初始化,再判斷,後執行,最後迭代)
while:不支持迭代,手動迭代,先判斷後執行;
do-while:不支持迭代,手動迭代,先執行後判斷。
57. java中逗號分隔符常用於何處:
多個變量聲明;for循環初始表達式;布爾表達式;迭代因子的多個分割;多個接口實現;形式參數和實際參數列表分割
58. for循環的循環部分是否可以爲空:
可以,但是要用兩個分號分隔,表示進入死循環
59. 雙層for循環的嵌套方式理解:
外層控制行數,內層控制列數
60. Continue和break的區別
Break:用於控制循環的流程,強行退出循環,不執行循環中剩餘的語句;此外,switch多分枝語句中break用於中斷分支。不在進行下面的語句
Continue:用於終止某次循環過程,跳過該次循環中的剩餘語句,開啓下一次循環,for語句中還需要執行迭代因子的步進,在while和dowhile中直接跳回到循環首部。
61. 帶標籤的break和continue的用法:
由於goto是java的保留字,當前要跳出多層循環需要使用帶標籤的break和continue
用法:
(只有)在循環語句前,加上 “標籤名:”形式聲明跳出位置;在循環中通過使用:braek 標籤名或者continue 標籤名的形式做跳出。
62. 語句塊的定義,嵌套的語句塊中能聲明相同名稱的變量嗎:
又稱複合語句,用{}擴起來的任意數量的簡單java語句,決定了局部變量的作用域,塊中的程序代碼作爲整體被執行。且塊可以嵌套。
不能。
63. 方法的定義:
用來完成特定功能的代碼片段;
用於定義類及類對象的行爲特徵和功能實現。
方法是類和對象行爲特徵的抽象。
類是java程序的基本單位,方法從屬於類和對象。
64. 方法的調用方式:
對象名.方法名(實參列表);這裏的對象名實際是實例引用地址
靜態方也法可以直接通過類名調用。非靜態方法必須通過實例調用,常見的看到的類內部的沒有加對象是因爲默認有this指針表示當前創建的對象。
65. 方法使用的注意事項:
實參數目、數據類型、次序必須和方法聲明的形式參數一致。
Return語句終止犯法的運行並返回需要類型的數據。無返回值時要用void做返回類型。
Java中方法調用傳參,遵循值傳遞(傳遞的都是數據的副本,引用類型數據是地址的副本)
基本類型傳遞的是該數據值的copy值
引用類型傳遞的是該對象應用的copy值,但指向的是同一個對象。
66. 方法的重載:overload定義:
指一個類中可以定義多方法名相同,但參數不同的方法。調用時,根據不同的參數自動匹配對應的方法。
67. 構成方法重載的條件:
重載的方法,實際是完全不同的方法,只是名稱不一樣而已!
不同:形式參數類型,形式參數個數,形式參數順序
只有返回值不同,不構成方法的重載,會報異常。(不提供根據返回值判斷依據)
只有形式參數的名稱不同,不構成方法的重載。(無意義)
注意自動轉換類型。
68. 調用方法,涉及到重載時的匹配方式:
通過調用方法的實際參數的類型,先經行原類型匹配,如果沒有,則遵循自動轉換類型規則進行匹配,且遵循少跨級原則。如果沒有則爲異常。
69. 遞歸算法的基本思想,內容組成:
自己調用自己
70. 定義遞歸頭:告訴什麼時候不再調用方法自身。如果沒有盡頭則會陷入死循環。
71. 定義遞歸體:用於實際需要遞歸處理的具體處理方法,業務處理語句,同時展現進行遞歸調用。
求n!;
public class TestRecursion{
public static void main(String[] args){
long n = 100;
System.out.printf("%d階乘的結果:%s%n", n, factorial(n))
}
static long factorial(long n){
if(n==1){//遞歸頭(盡頭)
return n;
}else{
return n*factorial(n-1);//遞歸體 //實際就是 n * (n-1) 這裏的n-1就是//需要通過遞歸求取的
)
}
}
調用原理:
72. 遞歸的優缺點:
有點:程序簡單易懂,易於理解和調試,不強調效率時,用遞歸。
缺點:(耗時耗內存)大量佔用系統堆棧;內存消耗多;當調用層次多時,速度明顯慢於循環。此外任何用遞歸解決的問題,使用循環迭代都能解決。當性能要求高時,用循環。