1.String StringBuffer StringBuilder 區(qū)別?
String 字符串常量,StringBuffer 字符串變量(線程安全),StringBuilder 字符串變量(非線程安全)。
String 是不可變的對象, 常量池中只會維護(hù)一個值相同的String 對象,對于“?”內(nèi)容為null 的常量字符串,會創(chuàng)建一個長度為0,內(nèi)容為空的字符串放入常量池中。當(dāng)調(diào)用String?類的intern()方法時,若常量池中已經(jīng)包含一個等于此String?對象的字符串(用?Object?的?equals?方法確定),則返回池中的字符串,否則將此?String?對象添加到池中,并返回此?String?對象在常量池中的引用。
Java.lang.StringBuffer線程安全的可變字符序列。一個類似于 String 的字符串緩沖區(qū)??蓪⒆址彌_區(qū)安全地用于多個線程。可以在必要時對這些方法進(jìn)行同步,任意特定實例上的所有操作就好像是以串行順序發(fā)生的,該順序與所涉及的每個線程進(jìn)行的方法調(diào)用順序一致。StringBuffer 上的主要操作是 append 和 insert 方法,可重載這些方法,以接受任意類型的數(shù)據(jù)。StringBuffer 內(nèi)部實現(xiàn)是char 數(shù)組,默認(rèn)初始化長度為16,每當(dāng)字符串長度>char 數(shù)組長度時,JVM 會構(gòu)造更大的char 數(shù)組,并將原先的數(shù)組內(nèi)容復(fù)制到新數(shù)組。
java.lang.StringBuilder此類提供一個與 StringBuffer 兼容的 API,StringBuffer方法上都加了synchronized,StringBuilder沒有,不保證同步。該類被設(shè)計用作 StringBuffer 的一個簡易替換,用在字符串緩沖區(qū)被單個線程使用的時候。它比 StringBuffer 要快。
2.泛型,即參數(shù)化類型,泛型擦除:Java 編譯器生成的字節(jié)碼文件不包含有泛型信息,泛型信息將在編譯時被擦除,這個過程稱為泛型擦除。其主要過程為1)將所有泛型參數(shù)用其最左邊界(最頂級的父類型)類型替換;2)移除all 的類型參數(shù)。
3.多態(tài):父類引用指向子類對象,對于static,編譯運行都看左邊。
4.數(shù)組VS 鏈表——數(shù)組在內(nèi)存中連續(xù),鏈表不連續(xù)。數(shù)組可以隨機訪問,鏈表順序訪問。數(shù)組查詢方面,鏈表插入和刪除方便。
5.Int?和?integer:1)只要?int?和?integer?比較,integer?就自動拆箱;
6.Hash:把任意長度的輸入,通過散列算法,變換成固定長度的輸出。不同的輸入可能導(dǎo)致相同的輸出。作用:文件校驗,數(shù)字簽名,hash?表查找O(1)。
7.Java8 新特性:
1)接口的默認(rèn)方法,java 8??允許我們給接口添加一個非抽象方法,只需使用default 關(guān)鍵字。2)lambda 表達(dá)式,在java8 之前,若想將行為傳入函數(shù),僅有的選擇是匿名類,而定義行為最重要的那行代碼,卻混在中間不夠突出。lambda 表達(dá)式取代了匿名類,編碼更清晰。3)函數(shù)式接口:指僅僅只有一個抽象方法的接口,每一個該類型的lambda 表達(dá)式都會被匹配到這個抽象方法。每一個lambda 表達(dá)式都對應(yīng)一個類型,通常是接口類型,我們可以把lambda 表達(dá)式當(dāng)作任意只包含一個抽象方法的接口類型,為了確保接口一定達(dá)到這個要求(即有一個抽象方法),你只需要給你的接口加上@FunctioalInterface 注釋(編譯器若發(fā)現(xiàn)標(biāo)注了這個注釋的接口有多于一個抽象方法,則報錯)。4)lambda 作用域,在lambda 表達(dá)式中訪問外層作用域和老版本的匿名對象中的方法很相似,你可以直接訪問標(biāo)記了final 的外層局部變量或?qū)嵗淖侄我约办o態(tài)變量。lambda 表達(dá)式對外層局部變量只可讀不可寫,對類實例變量可讀也可寫。5)dateAPI:java8 在java.time 包中包含一組全新日期API。6)annotation 注釋,java8 支持可重復(fù)注解,相同的注解可以在同一地方使用多次。
8.Synchronized
在java 設(shè)計中,每一個對象自打娘胎里出來就帶了一把看不見的鎖,即monitor 鎖。
?1)同步代碼塊使用monitorenter?和moniterexit?指令實現(xiàn),monitorenter 指令插入到同步代碼塊的開始位置,moniterexit?指令插入到同步代碼塊的結(jié)束位置,jvm 需要保證每一個monitorenter?都有一個moniterexit?與之對應(yīng)。任何對象都有一個monitor?與之相關(guān)聯(lián),當(dāng)且一個monitor?被持有之后,他將處于鎖定狀態(tài)。線程執(zhí)行到monitor?指令前,將會嘗試獲取對象所對應(yīng)的monitor?所有權(quán),即嘗試獲取對象的鎖。
2)同步方法。依靠的是方法修飾符上的ACC_SYNCHRONIZED?實現(xiàn)。Synchronized?方法則會被翻譯為普通的方法調(diào)用和返回指令,比如invokevirtual?指令,在jvm?字節(jié)碼層面并沒有任何特別的指令來實現(xiàn)。synchronized?修飾的方法,而是在class?文件的方法表中將該方法的access_flags?字段中的synchronized?標(biāo)志位置為1,表示該方法為synchronized?方法,且使用調(diào)用該方法的對象or該方法所屬的class 在jvm 內(nèi)部對象表示作為鎖對象。
Monitor 是線程私有的數(shù)據(jù)結(jié)構(gòu),每一個線程都有一個可用monitor record 列表,同時還有一個全局可用列表。每一個被鎖住對象都會和一個monitor 關(guān)聯(lián)。Monitor 中有一個owner 字段存放擁有該對象的線程的唯一標(biāo)識,表示該鎖這這個線程占有。Owner:初始時為null,表示當(dāng)前沒有任何線程擁有該monitor record,當(dāng)線程成功擁有該鎖后保存線程唯一標(biāo)識,當(dāng)鎖被釋放時,又設(shè)為null。Entry Q:關(guān)聯(lián)一個系統(tǒng)互斥鎖,阻塞all 試圖鎖住monitor entry 失敗的線程。Next:用來實現(xiàn)重入鎖的計數(shù)。
可重入鎖:同一線程,外層函數(shù)獲得鎖所之后,內(nèi)層遞歸函數(shù)仍有獲得該鎖的機會但不受影響。Synchronized 和reentrantlock 都是可重入鎖。
鎖主要有4 中狀態(tài):無鎖狀態(tài)、偏向狀態(tài)、輕量級狀態(tài)、重量級狀態(tài)。他們會隨著競爭的激烈而逐漸升級,鎖可以升級但不可以降級。
自旋鎖、自適應(yīng)自旋鎖、鎖消除。鎖消除的依據(jù)是逃逸分析的數(shù)據(jù)支持。鎖粗化:將多個連續(xù)加鎖解鎖操作鏈接起來擴展成一個范圍更大的鎖。
輕量級鎖:傳統(tǒng)的鎖是重量級鎖,他是用系統(tǒng)的互斥量來實現(xiàn)。輕量級鎖的本意是在沒
有多線程競爭的前提下,減少傳統(tǒng)的重量級鎖使用操作系統(tǒng)互斥量產(chǎn)生的性能消耗。
偏向鎖:目的是消除數(shù)據(jù)在無競爭情況下的同步原語。如果說輕量級鎖是在無競爭的情況下使用CAS 操作去消除同步使用的互斥量,那么偏向鎖就是在無競爭的情況下把整個同步消除掉。
Synchronized 用的鎖時存在java 對象頭里。對象頭包含標(biāo)記字段和類型指針。類型指針是對象指向它類元數(shù)據(jù)的指針,虛擬機通過這個指針來確定這個對象是哪個類的實例。標(biāo)記字段用于存儲對象自身運行時數(shù)據(jù),他是實現(xiàn)輕量級鎖和偏向鎖的關(guān)鍵。
JVM 可以通過對象的元數(shù)據(jù)信息確定對象的大小,但是無法從數(shù)組的元數(shù)據(jù)來確定數(shù)組的大小。
ClasscastException:當(dāng)試圖將對象強制轉(zhuǎn)換為不是實例的子類時,拋出該異常。
Collections 類中提供了一個方法,返回一個同步版本的hashmap,該方法返回的是一個synchronized Map 的實例,synchronized Map 類是定義在Collections 中的一個靜態(tài)內(nèi)部類。它實現(xiàn)map 接口,并對其中的每一個方法通過synchronized 關(guān)鍵字進(jìn)行了同步控制。但synchronized Map 在使用過程中不一定線程安全。
9.內(nèi)部類一共有4 種1)成員內(nèi)部類:外部類的成員。2)局部內(nèi)部類。3)靜態(tài)內(nèi)部類:類似于靜態(tài)成員。4)匿名內(nèi)部類:實現(xiàn)一個接口or 繼承一個抽象類。
外部類不能任意訪問內(nèi)部類的成員,要做到這一點,外部類必須創(chuàng)建其內(nèi)部類的對象(靜態(tài)內(nèi)部類除外)。內(nèi)部類可以訪問all 外部類的成員,因為內(nèi)部類就像是一個類的成員。
10.Java 本地方法:該方法的實現(xiàn)是由非java 寫的,可以用java 調(diào)用c 或c++的代碼,這是出于性能的考慮or 訪問底層操作系統(tǒng)。
11.Java 反射:可以在運行時獲取類or 對象的相關(guān)信息。
一個類可以有一個or 多個靜態(tài)代碼塊。靜態(tài)代碼塊在類被加載時執(zhí)行,優(yōu)于構(gòu)造函數(shù)的執(zhí)行,并且按照各靜態(tài)代碼塊放在類中的順序執(zhí)行。
12.字符和字節(jié):字節(jié)是一種計量單位,表示數(shù)據(jù)量多少,他是計算機信息技術(shù)用于計量存儲容量的一種單位。字符:計算機中使用的文字和符號。不用編碼里,字符和字節(jié)對應(yīng)關(guān)系不同。1)ASCII ???中,一個英文字母(不論大小寫)占一個字節(jié),一個漢字占2 個字節(jié)。2)UTF-8,一個英文1 個字節(jié),一個中文,3 個字節(jié)。3)unicode ,中文、英文都是兩個字節(jié)。
13Java 的包有:java.io;java.net;java.lang;java.util;java.awt;java.sql;javax.swing;java.math(javax 開頭的都是擴展包)。
14.正則表達(dá)式 \\\\ \\+ \\d \\??
X? 0?次或1?次
X+ 1?次或多次
X* 0?次或多次
X{n} 恰好n?次
X{n,} 至少n?次
X{n,m} 至少n?次,至多m?次
Pattern p=Pattern.copmile(正則表達(dá)式);Macher m=p.matcher(要匹配的String);
組是用括號劃分的正則表達(dá)式,可用組的編號來引用組,組號為0 為整個組,組號為1
表示第一對括號。
15.System.arraycopy(object[] src,int?I,?object[] desc,int?j,int?len):從src?數(shù)組復(fù)制到desc?數(shù)組,從src?的i?位置復(fù)制len?個元素,從desc?的j?位置開始放?;緮?shù)據(jù)類型就放值,引用數(shù)據(jù)類型就復(fù)制地址,不支持自動拆箱或裝箱,兩個類型必須一致。
16.Arrays.equals()比較兩個數(shù)組是否相等,必須元素個數(shù)相同,并且對應(yīng)位置元素相同(用
equals()來比),int 變?yōu)閕nteger。
Collection 的reverseOrder()方法返回一個比較器。?
17.Java 接口的修飾符只可以是abstract 和public。
18.Integer.parseInt(s,x);s 是需要轉(zhuǎn)換的字符串,x 為按什么進(jìn)制2,10 ,16 ,8,默認(rèn)是
10。
19.RandomAccessFile:用來訪問那些保存數(shù)據(jù)記錄的文件,可用seek 方法訪問記錄,并進(jìn)行讀寫,這些記錄的大小不必相同,但其大小和位置必須可知。該類僅限操作文件。
RandomAccessFile 不屬于InputStream 和outputStream 系列,直接繼承自object。
RandomAccessFile?構(gòu)造函數(shù),兩種模式:1)“r”,只讀,不會創(chuàng)建文件,會去讀一個已存在的文件,若文件不存在則拋異常2)“w 讀寫模式,若操作的文件不存在,則自動創(chuàng)建,若存在也不會覆蓋。
20.copyOnWriteArrayList?和copyOnWriteSet?從一開始大家都在共享同一個內(nèi)容,當(dāng)某個人想要修改這個內(nèi)容時,才會真正的把內(nèi)容copy?出去,形成一個新的內(nèi)容后再改。比如:當(dāng)我們往一個容器添加元素時,不直接往當(dāng)前容器添加,而是先將容器進(jìn)行copy,復(fù)制出一個新容器,再往新容器里加元素。添加完之后,再將原容器引用指向新容器。好處:對
copyOnWrite 容器進(jìn)行并發(fā)讀時,不需要加鎖,因為當(dāng)前容器不會增加新元素,讀寫分離。
copyOnWriteArrayList?的add?方法要加鎖,否則多線程的時候會copy?N?個副本。
copyOnWrite????容器不會拋出并發(fā)修改異常,并且返回的元素與迭代器創(chuàng)建時的元素完全一致,而不必考慮之后修改操作帶來的影響,當(dāng)?shù)僮鬟h(yuǎn)大于修改操作時適用。
copyOnWrite 適合于讀多寫少的場景,但他只能保證數(shù)據(jù)最終一致性,不能保證實時一致性。若你希望寫入馬上被讀到,不要用copyOnWrite 容器。
21.Queue?上的操作不會阻塞,如果隊列為空,那么獲取元素的操作返回空。BlockingQueue 擴展了Queue,增強了可阻塞的插入和獲取等。若隊列對null,那么獲取元素的操作將一直阻塞,直到隊列中出現(xiàn)一個可用的元素;若隊列已滿(對于有界隊列來說),那么插入元素的操作將一直阻塞,直到隊列中有可用空間。Deque 和BlockingDeque 為雙端隊列,可以在隊列頭和尾插入刪除,在生產(chǎn)者-消費者中,所有消費者有一個共同的工作隊列。而在工作密取設(shè)計中,每個消費者都有自己的雙端隊列。若一個消費者完成了自己雙端隊列中的全部工作容,那么他可以從其他消費者雙端隊列末尾秘密的獲取工作。大多數(shù)情況下,消費者只訪問自己的雙端隊列,從而極大減少競爭,而且訪問別人雙端隊列時是從末尾開始取,進(jìn)一步減小競爭。
22.ConcurrentHashmap??允許一邊迭代,一邊更新,不會出現(xiàn)并發(fā)修改異常。也就是說,在用iterator 遍歷時,ConcurrentHashmap 也可以進(jìn)行remove、put 操作,且遍歷的數(shù)據(jù)會隨著remove、put 發(fā)生變化,(弱一致性)。Concurrentmap???中以下功能:若沒有則添加,若相等則移除,若相等則替換,且都為原子性。
23.Java 的序列化算:1)當(dāng)前類的描述2)當(dāng)前類屬性的描述3)父類描述4)父類屬性描述5)父類屬性值描述6)子類屬性值描述類描述是從下到上,類屬性描述是從上到下。
24.CAS:Compare and swap 。Java.util.concurrent 包完全建立在cas 上,沒有cas 就不會有此包。Cas 有3 種操作數(shù):內(nèi)存值V,舊的預(yù)期值A(chǔ) 和要修改的新值B。當(dāng)且僅當(dāng)預(yù)期值A(chǔ) 和內(nèi)存值V 相同時,將內(nèi)存值V 改為B,返回V。CAS 通過調(diào)用JNI 的代碼實現(xiàn)。
25.加載發(fā)生于創(chuàng)建的第一個對象之時,但是當(dāng)訪問static 變量或static 方法時也會發(fā)生加載。初次使用之處也是static 初始化發(fā)生之處,所有static 對象和static 代碼都會在加載時按程序中的順序(定義類時的書寫順序)而依次初始化。當(dāng)然,定義為static 的東西只會被初始化一次。private 不能被繼承。
將一個方法調(diào)用同一個方法主體關(guān)聯(lián)起來叫做綁定。java 中除了static 方法和final 方法,其他所有方法都是動態(tài)綁定。
private 方法默認(rèn)為final 的,private 方法不能被覆蓋。
26.初始化:初始化順序:1)成員變量默認(rèn)初始化2)調(diào)用基類的構(gòu)造器,一層一層調(diào)用3)按聲明順序調(diào)用成員的初始化方法4)調(diào)用子類構(gòu)造器主體。
27.jdk1.8bin?目錄下的東西Java.exe javac.exe Javadoc.exe jar.exe jstack.exe?(打印所有java?線程堆棧跟蹤信息)
jdk?和jre?區(qū)別?jdk?的bin?下有javac,jre?的bin?下沒有javac。面向?qū)ο蠛兔嫦蜻^程的區(qū)別?(過程)優(yōu)點:性能比面向?qū)ο蟾撸驗轭愓{(diào)用時需要實例化,開銷比較大,比較消耗源;比如嵌入式開發(fā)、Linux/Unix 等一般采用面向過程開發(fā),性能是最重要的因素。缺點:沒有面向?qū)ο笠拙S護(hù)、易復(fù)用、易擴展。
(對象)優(yōu)點:易維護(hù)、易復(fù)用、易擴展,由于面向?qū)ο笥蟹庋b、繼承、多態(tài)性的特性,可以設(shè)計出低耦合的系統(tǒng)。缺點:性能比面向過程低。
jdk 中的設(shè)計模式:1)單例,比如Runtime 類;2)靜態(tài)工廠Interger a=Integer.valueOf(int or String);3) 迭代器模式Collection.interator();4) 原型設(shè)計模式,clone 方法;5 )適配器
在jdk1.8 之后,hashmap 中,若鏈表長度太長(默認(rèn)為8)時,鏈表轉(zhuǎn)為紅黑樹。
Jdk1.5 泛型、自動拆箱/裝箱,foreach、枚舉、線程池;jdk1.7switch ?中用string、菱形語法。
28.進(jìn)程VS?程序——程序,一段代碼,一組指令的有序集合。進(jìn)程:程序的一次動態(tài)運行,通過進(jìn)程控制塊唯一的標(biāo)識這個進(jìn)程。進(jìn)程:動態(tài),有資源,有唯一標(biāo)識,有并發(fā)性;程序:
靜態(tài),無資源,無唯一標(biāo)識,無并發(fā)性。
并行:兩個或多個事件,在同一時刻發(fā)生。并發(fā):兩個或多個事件,在同一時間間隔發(fā)生。
進(jìn)程基本狀態(tài):縣城:比進(jìn)程更小的獨立運行單位,同一進(jìn)程中可有多個線程并發(fā)執(zhí)行。線程:cpu 調(diào)度基本單位。進(jìn)程:cpu 分配資源基本單位。
29.抽象類和接口應(yīng)用場景——1)標(biāo)記接口:什么抽象方法都沒有。2)需要實現(xiàn)特定的多項功能,而這些功能之間完全沒有聯(lián)系。3)定義了一個接口,但又不想強迫每個實現(xiàn)類都必須實現(xiàn)所有抽象方法,所以可以用抽象類來實現(xiàn)一部分方法體,比如adapter。抽象類是簡化接口的實現(xiàn),它不僅提供了公共方法的實現(xiàn),讓我們可以快速開發(fā),又允許你的類完全可以實現(xiàn)所有的方法,不會出現(xiàn)緊耦合的情況。
30.常見的runtimeException:空指針、數(shù)組越界、類型轉(zhuǎn)換,除零、并發(fā)修改異常,rejectedExecutionException。
31.基本數(shù)據(jù)類型double 在判斷相等時,為什么不可以用==?答案:存儲精度問題,一般使用閾值,a-b 小于這個閾值,一般就認(rèn)為相等。
32.編碼:字符只以一種形式存在,那就是Unicode(不選擇任何特定的編碼,直接使用他們在字符集中的編號,這是統(tǒng)一的唯一的方法)。在java 中指:在JVM 中,在內(nèi)存中,在你的代碼里聲明的每一個char,string 類型的變量中。Reader 和Writer 類使用的是GBK 編碼。
33.基本類型:類型由低到高為(byte,short,char)--int--long--float--double
byte,short,char 相同級別,不能相互轉(zhuǎn)換,但可以使用強制類型轉(zhuǎn)換
六個包裝類:Float,Double,Byte,Short,Int,Long,Character,Boolean
Java 中float 默認(rèn)0.0f,double 默認(rèn)0.0d
String 對象一旦被創(chuàng)建,就不可以改變
Java.util.regex 使用正則表達(dá)式來實現(xiàn)模式匹配。
34.類
main 方法必須是public 的,public static void main() 是對的,static void main(String [] args) 是錯的,因為默認(rèn)為protected 的、不論java 的參數(shù)類型是什么,一律傳遞參數(shù)額副本,若java 是傳值,那么傳遞的是值的副本,若傳遞的是引用,則傳遞的是引用的副本。
在Java 中,有事會遇到子類中的成員變量or 方法和父類同名的情況。因為子類中的成員變量or 成員方法的優(yōu)先級高,所以子類中的同名成員變量or 方法就隱藏了父類的成員變量or 方法,但父類同名的成員變量or 方法仍然存在,可用super 顯示調(diào)用。
Java?中的大數(shù)類。BigInteger1)該類在java.math?包中2)他的其中一個構(gòu)造器為new BigInteger(String?s) ,將BigInteger?的十進(jìn)制字符串表示轉(zhuǎn)換為BigInteger,若要將int?型的轉(zhuǎn)為BigInteger,則?BigInteger?two=new?BigInteger(“2”);雙引號不能省略。?BigInteger?oneo=new BigInteger(“1”);??one.add(two)??其中?two?必須為?BigInteger?類型,并且?add()方法返回一個BigInteger 對象,其值為3,one 中的值不變。
內(nèi)部類擁有其外圍類的所有元素的訪問權(quán),包括private,包括方法和字段。構(gòu)造內(nèi)部類對象時,需要一個指向其外圍類對象的引用(static 內(nèi)部類除外),這個引用編譯器已經(jīng)幫你做了。非靜態(tài)內(nèi)部類,用外部類對象創(chuàng)建內(nèi)部類對象:new outer().new Inner();
接口的所有成員(方法+變量),自動被設(shè)為public。可以在一個方法里或任意作用域來定義內(nèi)部類。
每個類都會生成一個class 文件,內(nèi)部類的class 文件命名為:外部類名$內(nèi)部類名。若是匿名的,則編譯器會簡單生成一個數(shù)字作為標(biāo)識符。
Math.ceil(a) 返回>=a 的最小
Math.floor(a) 返回<=a 的最大
Math.round(a) 四舍五入
Byte,short,Int,Long,F(xiàn)loat,Double,Character,Boolean 都在java.lang 包中。
Float a=1.0f; 是對的
Float a=1.0;是錯的,因為1.0?默認(rèn)為是double?類型,必須強轉(zhuǎn)為float。
Long?和?float?正常定義要加上?L?和?F byte?的范圍是-128?到?127
所有byte,short,char 類型的值將被提高為int 進(jìn)行計算。被final 修飾的變量不會自動改變類型,當(dāng)2 個final 修飾的變量操作時,結(jié)果根據(jù)左邊類型而轉(zhuǎn)化。
Java 中數(shù)組是對象,不是原生類。
默認(rèn)值——Boolean-false;char-null;byte-(byte)0;short-(short)0;int-0;long-0L;
float-0.0f;double-0.0d。
System.out 返回PrintStream 對象,println()是該對象中的一個方法。
Javadoc?生成注釋文檔,只能為?public?和?protected?成員生成注釋。賦值 A=4;是對的 4=a?是錯的,只能為變量賦值。
編譯器通常把指數(shù)默認(rèn)為?double,若要定義為?float,則要加?f。float a=1.43e-13;編譯失敗。float a=1.43e-13f;編譯成功。
Boolean??–exp?value?0:value?1;
若?Boolean??–exp?為?true,則計算?value?0,而且這個計算結(jié)果也就是操作符最終產(chǎn)生的;
若?Boolean??–exp?為?false,則計算?value??1,而且這個計算結(jié)果也就是操作符最終產(chǎn)生的值。
java 不允許我們使用一個數(shù)字作為布爾值。
For(1;;) 1?的位置可以有任意數(shù)量的同一類型的定義。構(gòu)造器沒有返回值,與返回空不一樣。
只有構(gòu)造函數(shù)才可以調(diào)用構(gòu)造器。
Dog dog=new Dog();這句話的執(zhí)行過程:1)加載dog 的class 文件。2)初始all 靜態(tài)(包括static 變量和靜態(tài)代碼塊),并且要按照順序。3)默認(rèn)初始化。4)顯示初始化。5)構(gòu)造代碼塊。6)構(gòu)造函數(shù)。
Collection 有iterator 方法,所以list 和set 有。Map 沒有,要遍歷map,要使用entryset
或keyset。
Treemap 根據(jù)鍵的自然順序排序。
1)數(shù)組轉(zhuǎn)為?list Arrays.aslist?方法,
String[] s={“str1”,”str2”}; ArrayList al=Arrays.?Aslist(s);
2)list?轉(zhuǎn)為數(shù)組list?的toArray?方法。
可變類型參數(shù) (Object…args)仍是?object?的數(shù)組,可用?foreach?遍歷。
Package 語句必須是文件中的第一行(除了注釋)。
即使一個類只有包訪問權(quán)限,其?public main?仍然可以訪問。
Has-a 組合;is-a 繼承。
既是static,又是final 是編譯器常量。
Final 初始化只有兩個地方:定義處和構(gòu)造函數(shù)。
覆
蓋,只有在某方法是基類的接口的一部分時才會出現(xiàn),即必須能將一個對象向上轉(zhuǎn)型為它的基本類型,并調(diào)用相同的方法。若一個方法為private,他就不是
接口的一部分,他僅是一些隱藏于類中的程序代碼,只不過具有相同的名稱而已。但是若在子類中以相同的名稱生成一個public、protected
或包訪問權(quán)限方法的話,此時并沒有覆蓋該方法,只是生成了一個新的方法。由于private
方法無法觸及,而且能有效隱藏,所以除了把它看成是因為他所歸屬的類的組織結(jié)構(gòu)的原因而存在外,其他任何事物都不需要考慮到他。
適配器中的代碼接受你所擁有的接口,并且產(chǎn)生你需要的接口。
一個類可以實現(xiàn)多個接口,但只能繼承一個類,且繼承類要寫在前面,后面才跟接口,否則編譯報錯。接口與接口也是繼承,接口可以多繼承。
35.序列化一個對象?只要讓他實現(xiàn)?serializable?接口(該接口沒有方法,是一個標(biāo)記接口)。靜態(tài)不能被序列化,因為他不在堆里,用?transient?修飾的也不能序列化(即使在堆中),使?用?ObjectInputStream 和?ObjectOutputStream 。
36.淺拷貝是指拷貝對象時僅僅拷貝對象本身(包括對象中的基本變量),而不拷貝休息包含的引用指向的對象。深拷貝不僅拷貝對象,而且拷貝對象包含的引用所指向的對象。比如,對象a1 中包含對象b1 的引用,對象b1 中包含對象c1 的引用,淺拷貝a1 得到a2,則a2 中仍然包含對b1 的引用,b1 中任然包含對c1 的引用。深拷貝是對淺拷貝的遞歸,若是深拷貝a1 得到a2,則a2 中包含b2(b2 是b1 的copy),b2 中包含c2(c2 是c1 的copy)。
37.存儲結(jié)構(gòu)分為4 種。1)隨機存?。嚎梢噪S意直接存取任何一個元素,可以通過下標(biāo)直接存取任意一個元素,如數(shù)組等,有如內(nèi)存,可以通過地址直接訪問任意一個空間。2)順序存?。褐荒軓那巴笾饌€訪問,如鏈表。3)索引存?。簽槟硞€關(guān)鍵字建立索引,從索引表中得到地址,再直接訪問。4)散列存?。航⑸⒘斜?。
38.優(yōu)先級隊列(PriorityQueue)的頭是按指定排序方式確定的最小元素。
39.反射Class.forName(String s)方法返回與帶有給定字符串名的類or 接口相關(guān)聯(lián)的class 對象,這將導(dǎo)致命名為s 的類被加載。
40.JAVA IO:
1)RandomaccessFile:用來訪問哪些保存數(shù)據(jù)記錄的文件,可以用seek 方法進(jìn)行訪問,并進(jìn)行讀寫。這些記錄的大小不必相同,但是其大小和位置必須可知,該類僅限于操作文件。
2)RandomaccessFile 不屬于inputStream 和outputStream 類系。隨機訪問文件的行為類似存儲在文件系統(tǒng)中的一個大型byte 數(shù)組,存在一個光標(biāo)。
Resultmetadata:可用于獲取關(guān)于resultset 對象中列的類型和屬性信息的對象。創(chuàng)建類實例的方法:1)new 2)class.forname(類全名).newInstance() 3)clone().
41.Java5 個特性:面向?qū)ο螅缙脚_,多線程,健壯性,解釋性。
42.java 異常
CheckedException VS Un?CheckedException
將派生于?Error?或者?RuntimeException?的異常稱為?UnCheckedException,所有其他異常稱為?CheckedException 。若出現(xiàn)了?RuntimeException,則一定是程序員自己的問題。
Exception 一般分為IOException 和RuntimeException。
Java 實現(xiàn)封裝用的是private。
Fast-fail:java?集合中一種錯誤檢查機制。當(dāng)多個線程對集合進(jìn)行結(jié)構(gòu)上的改變的操作時,
有可能會Fast-fail。注意:是有可能,而不是一定。
DeflaterOutputStream 和InflaterInputStream 在java.uti.ip 包下
Blob 對象中的type 屬性表示文件的MIME 類型。
除了8 種基本類型以及它們的封裝類型,另外還有String 類,會發(fā)生深拷貝,其余都是淺拷貝。
String 的contains 和indexof 都可以判斷是否有某詞。
Class 的getConstructor()返回指定的公有的構(gòu)造函數(shù);Class 的getDeclaredConstructor()
返回指定的構(gòu)造函數(shù),私有也可以得到。
可以被序列化:String、數(shù)組、Enum、實現(xiàn)了序列化接口()從WriteObject ?方法看出來,這四個可以被序列化。
實現(xiàn)某個接口時,并不需要實現(xiàn)嵌套在其內(nèi)部的任何接口,且private 接口不能在定義它的類之外被發(fā)現(xiàn)。
StringBuffer.append(“123”).?append(26).ppend(true).reverse()后變?yōu)?eurt62321。
你可以將任意數(shù)量的對象放置到容器中,并且不需要擔(dān)心容器應(yīng)該設(shè)置為多大。使用泛型可以在編譯期防止將錯誤類型的對象放置到容器中。
Collection.reverseOrder(comparator cmp)返回一個比較器,順序和傳入的比較器相反。
高級for?循環(huán)可用于數(shù)組和任何collection?對象。如果我們創(chuàng)建了任何實現(xiàn)interator?的類,就可以用高級for?循環(huán)。但數(shù)組不是一個interator。
String?s1=”abc”+”def”+47+”mm”;編譯器使用了?StringBuilder?的?append()方法,最后調(diào)用toString();
String?的?format?方法,用于格式化輸出。S.O.P(String.format(“格式”,變量..));
GetDeclaredMethods():
返回method 對象的一個數(shù)組,這些對象反應(yīng)次class 對象表示的類or 接口聲明的all
方法,包括公有、私有、默認(rèn)和保護(hù)方法,但是不包括繼承的方法。GetMethods():反應(yīng)此class 對象表示的類or 接口的公共method
方法。
Int a[]=new int[] ; a++;(這句話是錯的,因為a 是常量,是地址)。外部排序常用的是歸并排序。
InputStream 和outputStream 之間傳數(shù)據(jù)需要一個byte[], byte[] b=new byte[1024]; While(len=in.read(b)!=-1)
Out.write(b,0,len);
getDeclaredMethod:返回method 數(shù)組,表示class 對象表示的類or 接口聲明的all 方法,包括公共、保護(hù)、私有,但不包括繼承。
GetMethod:返回method 數(shù)組,表示class 對象所表示的類or 接口的公有方法,包括從父類繼承的。
CopyOnWriteArrayList 的核心:對于任何Array 在結(jié)構(gòu)上有所改變的操作(add,remove 等),CopyOnWriteArrayList 都會copy 現(xiàn)有數(shù)組,再在copy 的數(shù)組上修改。這樣就不影響
子類引用父類靜態(tài)字段,子類不會初始化。通過數(shù)據(jù)定義引用類,不會觸發(fā)此類的初始化,比如Person[] p=new Person[10];
若一個類方法體的字節(jié)碼沒有通過驗證,那肯定是有問題的;但若一個方法體通過了字節(jié)碼驗證,也不能說明其一定安全。
符號引用的目標(biāo)不一定已經(jīng)加載入內(nèi)存;直接引用的目標(biāo)一定已經(jīng)加載入內(nèi)存。
在編譯程序代碼的時候,棧幀中需要多大的局部變量表,多深的操作數(shù)棧都已經(jīng)完全確定了,并且寫入到方法表的code 屬性中,因此,一個棧幀需要分配多少內(nèi)存,不會受到運行期變量數(shù)據(jù)的影響,而僅僅取決于具體虛擬機的實現(xiàn)。
局部變量表以slot 為單位,long 和double 占2 個slot,第0 位索引的slot 默認(rèn)為用于傳遞方法所屬對象實例調(diào)用,this。
若一個局部變量定義了,但沒有賦初始值是不能使用的。操作數(shù)棧中元素的類型必須與字節(jié)碼指令的序列嚴(yán)格匹配。
每個棧幀都包含一個指向運行時常量池中該棧所屬方法的引用,持有這個引用是為了支持方法調(diào)用過程中的動態(tài)鏈接。
只
要能被invokestatic 和invokespecia
指令調(diào)用的方法,都可以在解析階段中確定唯一的調(diào)用版本,符合這個條件的有靜態(tài)方法,私有方法,實例構(gòu)造器,父類方法,他們在類加載的時候就會把符號引
用,改為該方法的直接引用,他們稱為非虛方法(包括final 修飾的方法)。
不可變類型String、long、double 等數(shù)值包裝類型,BigInteger 和BigDecimal 等大數(shù)據(jù)類型。
Java 中各種操作共享的數(shù)據(jù)分為五類:不可變,絕對線程安全,相對線程安全,線程兼容,線程對立。
綁定多個條件:一個reentrantlock 對象可以同時綁定多個condition。