Java基礎知識java
一、關鍵字算法
二、標識符windows
3、基本類型和引用類型數組
4、public、default、protected、private緩存
5、static、Final、abstract安全
6、構造方法:服務器
7、this 和 super網絡
8、== 和 equalsapp
9、字符容器(String、StringBuffer、StringBuilder)函數
10、File(Java 文件操做)
11、流
12、經常使用類(內部類、匿名類、抽象類)
13、字符問題
14、三大特性(封裝、繼承、多態)
15、繼承(extends)
16、接口(implements)
17、重寫和重載
18、數組
19、泛型
20、枚舉
21、語法基礎
22、hashcode和equals (MD5的計算是目前最普遍的哈希算法)
23、類的加載執行、初始化
24、網絡通訊(Socket)
25、調用方法的參數傳遞問題
26、public static void main(String[] args){}
27、system.out.print(): 類名.成員變量.靜態方法
// 陌生單詞:compile編譯、deprecation過期、PermGen永久代(方法區)、Heap堆內存
準備明年開始找工做,全部刷了牛客app上的900多道Java相關的筆試題,
整理了答案下面的 精華知識,以備不時之需。若有不合理之處,萬望知會。
1、關鍵字
修飾符: abstract、class、final、private、protected、public、static、7
數據類型:boolean、byte、char、double、float、int、long、short、void、9
語句組成:break、case、catch、continue、default、do、else、extends、finally、 for、if、implements、import、instanceof、interface、new、package、 return、super、switch、sychronized、this、throw、throws、try、while26
特殊含義關鍵字:assert、const、goto、enum、native、strictfp、transient、volatile、7
assert: 斷言,用於調試,多被junit代替,IDE默認不開啓。
const:預留關鍵字。
goto:預留關鍵字。
enum: 枚舉。
native: 本地方法。
strictfp: 精確浮點,可用於類、接口、方法。
transient: 免除變量序列化。
volatile: 被設計用來修飾被不一樣線程訪問和修改的變量。
非java關鍵字:true、false、sizeof、null、serilizable、
2、標識符
標識符是用來標識類名、變量名、方法名、類型名、數組名及文件名的有效字符序列。
一、標識符由字母、數字、下劃線、美圓符號組成,長度不受限制。
二、第一個字符不能爲數字。
三、標識符不能是關鍵字。
四、標識符不能是true、false、null(字面常量)
3、基本類型和引用類型
Java中基本類型有四類八種,也稱爲原生類、內置類。其他的都屬於引用類型
整數:(byte、short、int、long) 引用類型:(Byte、Short、Integer、Long)
浮點:(float、double) 引用類型:(Float、Double)
字符型:(char2) 引用類型:(Character)
邏輯型:(bolean1) 引用類型:(Boolean)
nume(枚舉)是基本類型
String是基本類型
一個字符常量表示一個字符或一個轉義字符,被一列ASCII單引號包裹。
數組不管是定義實例變量仍是局部變量,若沒有初始化,都會被自動初始化。
char[] ch = new char[3]; //默認空格
int [] arr = new int[2]; //默認0
String[] string = new String[2]; //默認null
Byte類型引用包裝類默認爲null,byte的默認值爲0,byte[-128,127]
char類型存儲unicode碼,佔兩個字節16位,默認值爲’’,默認使用GBK編碼,可存中文漢字。UTF-8一個漢字佔3個字節,GBK佔兩個字節。
java中的小數類型默認值爲double.
包裝類型:Integer a=1; a=2; 在方法內===>等於從新new一個a對象,
在方法外===>等於改變a的指向地址,
包裝類對象作基本操做(拆比較、計算)會拆箱,再也不是引用傳遞。
引用類型通常有 數組(數組是一種對象,有行爲,大小一旦肯定,不能改變)、類、接口。
a = Integer.parseInt(「1024」);==>parseInt把String對象類型轉換爲 int。
b= Integer.ValueOf(「1024」).intValue(); ===>ValueOf把String轉換爲Integer類型,(JDK支持裝箱拆箱),intValue(); 把Integer類型轉化爲int類型。
Integer i01 = 59;會調用Integer的valueOf方法,判斷是否在[-128,127]之間,返回引用或新建對象。
int i02 = 59;基本類型,存儲在棧中。
Integer i03 = Integer.valueOf(59);直接返回引用(IntegerCache中的對象引用)
Integer i04 = new Integer(59); 直接建立一個新的對象
i01 == i02; ===>Integer會拆箱成int,作值之間比較 true
i02 == i04; ====>Integer會拆箱成int,作值之間比較 true
4、public、default、protected、private
訪問權限
5、static、Final、abstract
static : 在編譯器就肯定了函數和地址,不存在多態狀況
靜態方法屬於類,靜態方法在對象實例建立前已經存在了,它的使用不依賴對象是否被建立,當咱們經過實例來調用方法時,實際上仍是把實例對象轉換成類去調用方法,這裏的null沒有意義。((TestClass) null).testMethod();能夠寫成TestClass t = null; t.testMethod(); null能夠被強制轉換成任意類型對象。(空指針能夠操做 類變量和類方法)
靜態方法不能引用非靜態變量。不能調用類的對象方法,在類方法中不能使用this、super。但能夠new對象,有了對象就能夠實現實例的成員變量和方法。
static修飾的爲類變量和類方法,在類初始化時加載完成,能夠被成員方法調用或訪問。
Final: 能夠用來修飾類、變量、方法、引用。類不能被繼承,方法不能被重寫,能夠繼承和重載。變量經修飾變爲常量,引用不能變,在編譯期就肯定,變爲宏變量。
final修飾的對象引用不能變,即地址不可變,但地址中的值可變。 p.name = 」aaa」; p.name=」bbb」;但對於String(只讀類型的引用???)特殊,final String str=」aaa」; str=」bbb」; //編譯不經過,引用被改變。
final修飾方法:聲明final就是防止功能被修改。
final修飾局部變量能夠在聲明時初始化,也能夠在第一次使用時經過方法或表達式賦值,
final修飾的成員變量能夠在類方法、聲明、初始化塊中賦值,==>沒有默認值,聲明同時賦值。
6、構造方法:
構造方法能夠被public、private、Protected修飾,不能被繼承。
7、this 和 super
this: 表示某個對象,this能夠出如今實例方法和構造方法中,但不可出如今類方法中。
this出如今構造方法中,表明當前對象,通常省略。
this出如今實例方法中,表明正在調用當前方法的對象,成員變量和局部變量重名時出現,多出如今set方法中,對象的成員變量。
super:子類一旦隱藏了繼承的成員變量,那麼子類建立的對象就再也不擁有該變量,該變量就歸super關鍵字所擁有。
在子類的構造函數中默認有super();
父類沒有無參構造時,需在子類的構造方法中顯式調用super(「xxx」);
只有在重寫了父類的方法以後,再調用父類的方法須要使用super調用。
父類靜態方法不能被子類重寫,只是被隱藏,也須要使用super調用。
8、== 和 equals
== 比較類型和值(也能夠說是比較地址)
equals 底層也採用 == 作比較,但String中重寫了Object中的此方法,用於比較字符串的內容。
Object中equals的源碼,沒有重寫equals時,底層直接用「==」作判斷。而String中重寫了方法。
public boolean equals(Object obj){
return (this==obj);
}
重寫後的equals方法:
public static boolean equals(String str1, String str2) {
return str1 == null ? str2 == null : str1.equals(str2);
}
9、字符容器(String、StringBuffer、StringBuilder)
String傳遞是引用傳遞,StringBuffer是引用傳遞===>可改變內容,不可改變引用地址。
String s = new String(「xyz」); 分常量池和堆。
xyz可能存在於兩個地方,編譯期遇到」xyz」,檢測到常量池沒有xyz存在,就在常量池中建立一個xyz常量。
new String(「xyz」)會在執行時,在堆中建立一個實例。
10、File(Java 文件操做)
1)File類是對文件總體或者文件屬性操做的類,例如:建立文件,刪除文件等,文件內容用IO流操做。
2)能用文本文檔打開的都是文本文件(文本打開亂碼都不是文本文件),用特殊應用打開的都是二進制文件。
3)輸出過程到達文件或流的末尾,會拋出EOFException,正常狀況異常 會被處理返回特殊值(read()會返回-1)。
11、流
字節流繼承於InputStream、OutputStream
字符流繼承 InputStreamReader/OutputStreamWriter
1)InputStreamReader的構造函數:
InputStreamReader(InputStream in): 建立一個使用默認字符集的InputStreamReader.
InputStreamReader(InputStream in,Charset cs):建立使用給定字符集的InputStreamReader
InputStreamReader(InputStream in,CharsetDecoder dec):建立使用給定解碼字符集的InputSt..
InputStreamReader(InputStream in,String charsetName):建立使用給定字符集的InputStream..
BufferedReader的構造函數:
BufferedReader(Reader in):建立使用默認大小輸入緩衝區的緩衝字符輸入流
BufferedReader(Reader in,int size):建立使用指定大小輸入緩衝區的緩衝字符輸入流
Writer的構造函數:
Protected ... Writer( ):建立一個字符流writer,其做用是同步到writer自身,
Protected...Writer(Object lock):建立一個字符流writer,做用是同步到給定的對象
管道流:管道其實是一個大小固定的緩衝區,管程對於管道兩端的進程而言,就是一個文件,但它不是普通文件,它單獨構成一種文件系統,而且只存在內存中,相似於半雙工通訊。管道的內存大小一般是內存上的一頁,它的大小並不受磁盤容量大小的限制。當管道空時,進程讀操做會堵塞,管道滿時,寫操做會堵塞。
PipedInputStream的構造函數:
PipedInputStream():建立一個還沒有鏈接的PipedInputStream.
PipedInputStream(int pipeSize):建立還沒有鏈接的PipedInputStream,並指定管道緩衝區的大小
PipedInputStream(PipedOutStream src):建立PipedInputStream,鏈接到管道輸出流src
PipedInputStream(PipedOutputStream sc,int pipeSize):建立PipedInputSt...,指定大小,鏈接src。
12、經常使用類(內部類、匿名類、抽象類)
對於局部類、方法、變量,只針對特定區域有效,訪問權限無效。
外部類的修飾符能夠爲 public 和 默認缺省修飾符(default)。由於外部類在包中,只有包可見和包不可見。
外部類中的內部類能夠看作是外部類的成員變量。
內部類:(常規內部類、靜態內部類、局部內部類、匿名內部類)
常規內部類:沒有用static修飾且定義在外部類類體中,可直接訪問外部類成員變量、方法。
靜態內部類:與靜態內部方法類似,只能訪問外部類的static成員,可經過對象引用訪問外部類的成員變量。(實例變量、方法)
局部內部類:存在於方法體或語句塊中(包括方法、局部塊、靜態初始化塊)不能加任何修飾符,只對局部有做用。
匿名內部類:定義一個類的同時建立一個沒有名字的類稱爲匿名內部類,只用一次。
靜態內部類才能夠定義static方法,
內部類權限修飾符能夠爲public、protected(同包子類)、默認(同包)、private(同類有效),因此說一個java文件能夠有多個public修飾的類。
爲何使用內部類?每一個內部類都能獨立的繼承一個(接口)實現,不管是外部類是否已繼承。最大的優勢就是它可以很是好的解決多重繼承的問題。
1)內部類能夠有多個實例,且每一個實例有本身的狀態信息,相互獨立。
2)在單個外部類中,可讓多個內部類以不一樣方式來實現同一個接口,或者繼承同一個類。
3)建立內部類實例對象不依賴外部類。
4)內部類沒有使人迷惑的」 is--a 」關係,它就是一個獨立的實體。
5)內部類提供了更好的封裝,除了外部類,其餘類不可訪問。
匿名類:
匿名內部類:用在任何容許存在表達式的地方,只能用一次。
局部內部類:用在任何容許出現局部變量的地方,能夠在本身的定義域中屢次使用。
抽象類:通常使用Protected修飾
abstract不可與final、static、private共存,由於須要被繼承,重寫方法。
抽象方法中不能有方法體,抽象類中能夠沒有抽象方法。
抽象類有構造方法,能夠給子類初始化,但不可實例化,(可用在匿名內部類??)
抽象類能夠實現接口,也能夠繼承自抽象類。
抽象類有構造方法,但不是用來實例化的,而是用來初始化的。
抽象類能夠定義普通成員變量而接口不能夠,可是二者均可以定義靜態成員變量。
13、字符問題
java語言使用Unicode字符集,而ASCII是國際上使用最普遍的字符編碼,BCD是一種數字壓縮存儲編碼Unicode(又稱統一碼、萬國碼、單一碼)是計算機學領域上的一項業界標準,包括字符集、編碼方案等,爲每種語言的每一個字符設定了統一而且惟一的二進制編碼,以知足跨語言,跨平臺的文本轉換。一個unicode(中英文同樣)佔兩個字節(16bit)。
UTF-8、UTF-16、UTF-32都是將Unicode裝換到程序數據的編碼方案。
JVM使用UTF-16保存字符。
編碼(Unicode)就是一個編號(數字)到字符的一種映射關係,一對一的映射表。
編碼格式(UTF-8)就是序列化或存儲編碼中的那個編碼的一種」格式」。
中文漢字在java(Unicode)中佔兩個字節,在utf-8中佔三個字節,在gbk中佔兩個字節。
標準ASCII 只使用7個bit,擴展的ASCII 使用8個bit,ASCII 中包括一些不可打印字符,0-31分配給不可打印字符,
ANSI一般使用0x00--0x7f範圍的一個字節來表示1個英文字符,即擴展的ASCII編碼。表明本地編碼格式。
簡體中文windows中,ANSI表明GBK,GB2312 是國標。
繁體中文 ANSI表明 Big5。
日文中 ANSI 表明shift_JIS。
14、三大特性(封裝、繼承、多態)
1五、繼承(extends)
繼承:基類和派生類是父子關係,超類和子類也是父子關係,父類中類方法不會被繼承,屬於super關鍵字所擁有。
16、接口(implements)
接口變量用public static final修飾,爲常量。方法沒有方法體,爲抽象方法。
接口的方法修飾符爲 public abstract,接口是通用的,不設訪問權限。
接口中沒有構造函數,
接口沒有構造函數,因此不能實例化,
17、重寫和重載
多態包括重載和重寫,
重載是方法的多態,調用方法時經過傳遞給方法的不一樣參數(參數個數、參數類型)來肯定具體使用哪一個方法。(向上轉型,編譯看左邊,決定哪些方法編譯,運行看實際類型選擇)
方法名一致,返回值類型和訪問權限沒有要求。
重載選擇執行方法時,是參考傳入參數的實際類型,而不是靜態類型(特別注意上轉型)
重寫存在於子父類中,遵循兩同兩小一大原則,
方法名、參數相同。
返回值類型、拋出異常要小。
訪問權限要大。
對於成員變量,編譯和運行都參考左邊。
對於成員函數(非靜態):編譯看左邊,運行看右邊。
對於靜態函數:編譯和運行都看左邊。
18、數組
19、泛型
泛型防止代碼編寫出錯,在編譯期,泛型會被擦除,並不會影響運行速度。
20、枚舉
枚舉是JDK1.5新增的特性,它是一種新的類型,表示特定的數據片斷,類型安全,是特殊類,擁有成員變量和方法。 (寫一個根據輸入輸出星期程序)
全部的枚舉值都是類靜態常量,在初始化時會對全部的枚舉值對象進行一次初始化。
21、語法基礎
1、if(x=y)==>會出錯,發生類型強轉異常。(mismatch) 。
2、int x=1;float y=2; x/y=1.0/2.0=0.5==>發生自動轉型,byte-short-char-int-long-float-double
3、public class A extends B implements C{} ===>先繼承再實現
4、package在程序文件的第一句,且沒有註釋。
5、float f = 1.0f; f必須有。
6、int a[] = null; a[0] = 1; 拋出NullPointException。
7、<< 左移,乘以2的n次方, << 無符號左移,末尾補0, >>> 無符號左移
8、instanceOf運算符用來判斷一個變量所引用的對象的實際類型,(重點考察上轉型看實際)
9、強制轉int型,會向下取整。 int(5.7) = 5
10、包裝類相關:
兩種不一樣類型的引用不能進行」==」比較,例如:Integer和Double
s.equals(q);在進行equals比較以前,會對q調用Integer.valueOf;進行自動裝箱,因爲IntegerCache中已經存在q,因此,直接建立了一個新的Integer實例,但值也是q,知足條件,返回真。
包裝類也重寫equals,沒有常量池,Integer s = new Integer(q);Integer t = new Integer(q);強制在堆內存建立 q 對象實例。
11、String str1 = new String(「hello」); //正常建立對象保存在堆區
String str2 = 「Hello」; //建立的字符串,保存在字符串常量區
12、當使用Integer賦值的時候,java編譯器會將其翻譯成調用ValueOf()方法,好比 Integer i = 127,對於-128到127之間的數,Java會對其進行緩存,超過這個範圍則新建一個對象。
13、求數組的長度(容量):length。
求字符串的長度:length()。
求集合的長度:size().
22、hashcode和equals (MD5的計算是目前最普遍的哈希算法)
哈希又稱散列,經過散列算法將任意長度的輸入變成固定長度的輸出,又稱散列值,是一種壓縮映射,散列值可能相同。
1) 若是兩個對象相等,那麼他們必定有相同的哈希值。
2) 若是兩個對象哈希值相等,它們不必定相等。須要用equals判斷。
hash值: 具備等冪性(對象不變,作多少次計算hash值都不變)、
對等性(equals計算兩個對象相等,而hash值必定對等)、
互異性(若兩個對象equals爲false,而hash值最好也不一樣)
hash值的計算通常採用 多個成員變量的hash值相加,或 加權值
對象的hash值作key。
23、類的加載執行、初始化
類的加載順序:
父類靜態塊--子類靜態塊--父類初始化塊--父類構造方法--子類初始化塊--子類構造方法
靜態塊---main()---初始化構造塊-----構造方法
靜態域最早初始化,靜態域包括靜態變量和靜態方法,
new一個對象==初始化靜態塊+執行構造函數。
初始化父類靜態變量、靜態代碼塊,
初始化子類靜態變量、靜態代碼塊,
初始化父類普通成員變量、代碼塊、父類構造方法,
初始化子類普通成員變量、代碼塊、子類構造方法,
在繼承存在的狀況下,類的執行:
父類靜態對象、父類靜態代碼塊
子類靜態對象、子類靜態代碼塊
父類非靜態對象、父類非靜態代碼塊、父類構造函數
子類非靜態對象、子類非靜態代碼塊、子類構造函數
Java中對字段屬性是靜態綁定(編譯出錯),方法成員是動態綁定(運行出錯)。
對象的初始化方式(實例化對象):
1)new時初始化 :調用構造函數,分配內存空間,
2)靜態工廠newInstance :
3)反射Class.forName():使用構造方法
4)clone方式:clone只是複製拷貝(深拷貝須要new,淺拷貝不須要,原來的對象的改變不反應在拷貝對象上)
5)反序列化:readObject是從文件中還原對象
24、網絡通訊(Socket)
服務器端:ServerSocket server = new ServerSocket(端口號);
服務器端的經常使用方法:
ServerSocket(int port)、accept()、close()、getInetAddress()、getLocalPort()
客戶端: Socket soc = new Socket(ip地址,端口號);
客戶端的經常使用方法:
Socket(InetAddress address, int port)、 Socket(String host, int port)、close()
25、調用方法的參數傳遞問題
26、public static void main(String[] args){}
main方法中的變量也是局部變量,
27、system.out.print(): 類名.成員變量.靜態方法
system是java.lang的一個類,out是system內的一個成員變量,這個變量是java.io.PrintStream類的對象。println()是java.io.PrintStream類的方法,因此能夠調用類.成員變量.println()方法。
// 陌生單詞:compile編譯、deprecation過期、PermGen永久代(方法區)、Heap堆內存