J2SE基礎(chǔ)
- 九種基本數(shù)據(jù)類型的大小勾拉,以及他們的封裝類粘姜。
Java基本類型共有八種,基本類型可以分為三類乞榨,字符類型char秽之,布爾類型boolean以及數(shù)值類型byte、short吃既、int考榨、long、float鹦倚、double河质。數(shù)值類型又可以分為整數(shù)類型byte、short、int掀鹅、long和浮點數(shù)類型float散休、double。JAVA中的數(shù)值類型不存在無符號的淫半,它們的取值范圍是固定的溃槐,不會隨著機器硬件環(huán)境或者操作系統(tǒng)的改變而改變。實際上科吭,JAVA中還存在另外一種基本類型void昏滴,它也有對應(yīng)的包裝類 java.lang.Void,不過我們無法直接對它們進行操作对人。8 中類型表示范圍如下:
byte:8位谣殊,最大存儲數(shù)據(jù)量是255,存放的數(shù)據(jù)范圍是-128~127之間牺弄。
short:16位姻几,最大數(shù)據(jù)存儲量是65536,數(shù)據(jù)范圍是-32768~32767之間势告。
int:32位蛇捌,最大數(shù)據(jù)存儲容量是2的32次方減1,數(shù)據(jù)范圍是負的2的31次方到正的2的31次方減1咱台。
long:64位络拌,最大數(shù)據(jù)存儲容量是2的64次方減1,數(shù)據(jù)范圍為負的2的63次方到正的2的63次方減1回溺。
float:32位春贸,數(shù)據(jù)范圍在3.4e-45~1.4e38,直接賦值時必須在數(shù)字后加上f或F遗遵。
double:64位萍恕,數(shù)據(jù)范圍在4.9e-324~1.8e308,賦值時可以加d或D也可以不加车要。
boolean:只有true和false兩個取值蝗碎。
char:16位渗磅,存儲Unicode碼祥楣,用單引號賦值脐区。
封裝類分別為Boolean, Byte, Character, Short, Integer, Long, Float, Double, Void。
既然提供了基本類型登澜,為什么還要使用封裝類呢
比如,如果想使用List來保存數(shù)值飘庄,由于List中只能添加對象脑蠕,另外,有些情況下,我們也會編寫諸如func(Object o)的這種方法
2.Switch能否用string做參數(shù)谴仙?
可以迂求,從JDK1.7開始可以。
switch(expr)中晃跺,expr可以是byte揩局、short、char掀虎、int凌盯。從1.5版開始,Java中引入了枚舉類型(enum)烹玉,expr也可以是枚舉驰怎,從JDK 1.7版開始,還可以是字符串(String)二打。長整型(long)是不可以的县忌。
- equals與==的區(qū)別。
==比較的是值(基本數(shù)據(jù)類型)或內(nèi)存地址(復(fù)合數(shù)據(jù)類型)继效; JAVA當中所有的類都是繼承于Object這個基類的症杏,在Object中的基類中定義了一個equals的方法,Object的equals方法也是用雙等號(==)進行比較的瑞信。但如String,Integer,Date在這些類當中equals有其自身的實現(xiàn)厉颤,而不再是比較類在堆內(nèi)存中的存放地址了。
*注意new()操作會開辟新的內(nèi)存地址喧伞。 - Object有哪些公用方法走芋?
Object的公用方法主要有clone(),equals(),hashCode(),getClass(),wait(),notify(),notifyAll(),toString().
- Java的四種引用,強弱軟虛潘鲫,用到的場景翁逞。
四種引用級別由高到低依次為:強引用、軟引用溉仑、弱引用和虛引用挖函。
強引用:是JVM的默認實現(xiàn),即使內(nèi)存不足垃圾回收器也不會回收浊竟;
弱引用(WeakReference):當所引用的對象在 JVM 內(nèi)不再有強引用時, GC 后weak reference 將會被自動回收怨喘;
軟引用(SoftReference):SoftReference 于 WeakReference 的特性基本一致, 最大的區(qū)別在于SoftReference 會盡可能長的保留引用直到 JVM 內(nèi)存不足時才會被回收(虛擬機保證) 振定;
虛引用:如果一個對象僅持有虛引用必怜,那么它就和沒有任何引用一樣,在任何時候都可能被垃圾回收后频。
使用場景:軟引(或弱引用)可以和一個引用隊列(ReferenceQueue)聯(lián)合使用梳庆,如果軟引用(或弱引用)所引用的對象被垃圾回收暖途,Java虛擬機就會把這個軟引用(或弱引用)加入到與之關(guān)聯(lián)的引用隊列中。虛引用主要用來跟蹤對象被垃圾回收的活動膏执。
- Hashcode的作用驻售。
hashcode方法返回該對象的哈希碼值,用于查找使用更米。
ArrayList欺栗、LinkedList、Vector的區(qū)別征峦。
ArrayList,Vector采用數(shù)組實現(xiàn)存儲迟几,允許直接按序號索引,但插入數(shù)據(jù)涉及到數(shù)組元素移動眶痰,因此索引快插入慢瘤旨。ArrayList是非安全線程,Vector是安全線程竖伯,性能通常較ArrayList差存哲。
LinkedList采用雙向鏈表實現(xiàn)數(shù)據(jù)存儲,索引需要向前或向后遍歷七婴,但插入只需要記錄本項的前后項祟偷,因此索引慢但插入快。String打厘、StringBuffer與StringBuilder的區(qū)別修肠。
String長度不可變,StringBuffer和StringBuilder長度可變户盯。StringBuilder在單線程環(huán)境下使用嵌施,沒有synchronized修飾,更高效莽鸭。Map吗伤、Set、List硫眨、Queue足淆、Stack的特點與用法。
Map(映射) 鍵值對組成的集合
Set 無序集合礁阁,元素不可重復(fù)
List 有序集合巧号,元素可以重復(fù)
Queue 隊列,先進先出
Stack 棧姥闭,后進先出
Set集合類似于一個罐子丹鸿,"丟進"Set集合里的多個對象之間沒有明顯的順序。
List集合代表元素有序棚品、可重復(fù)的集合卜高,集合中每個元素都有其對應(yīng)的順序索引弥姻。
Stack是Vector提供的一個子類,用于模擬"棧"這種數(shù)據(jù)結(jié)構(gòu)(LIFO后進先出)
Queue用于模擬"隊列"這種數(shù)據(jù)結(jié)構(gòu)(先進先出 FIFO)掺涛。
Map用于保存具有"映射關(guān)系"的數(shù)據(jù),因此Map集合里保存著兩組值
HashMap和HashTable的區(qū)別疼进。
Hashtable是基于陳舊的Dictionary類的薪缆,HashMap是Map接口的一個實現(xiàn) Hashtable的方法是線程同步的,而HashMap的方法不是伞广。 只有HashMap可以讓你將空值作為一個表的條目的key或valueHashMap和ConcurrentHashMap的區(qū)別拣帽,HashMap的底層源碼。
TreeMap嚼锄、HashMap减拭、LindedHashMap的區(qū)別。
Hashmap 是一個最常用的Map,它根據(jù)鍵的HashCode 值存儲數(shù)據(jù),根據(jù)鍵可以直接獲取它的值区丑,具有很快的訪問速度拧粪,遍歷時,取得數(shù)據(jù)的順序是完全隨機的沧侥。
LinkedHashMap保存了記錄的插入順序可霎,在用Iterator遍歷LinkedHashMap時,先得到的記錄肯定是先插入的.也可以在構(gòu)造時用帶參數(shù)宴杀,按照應(yīng)用次數(shù)排序
TreeMap取出來的是排序后的鍵值對癣朗。但如果您要按自然順序或自定義順序遍歷鍵,那么TreeMap會更好旺罢。Collection類旷余,Collection包結(jié)構(gòu),與Collections的區(qū)別扁达。
Collection是集類正卧,包含List有序列表,Set無序集合以及Map雙列集合
Collection是集合類的上級接口罩驻,子接口主要有Set 和List穗酥、Map。
Collections是針對集合類的一個幫助類惠遏,提供了操作集合的工具方法:一系列靜態(tài)方法實現(xiàn)對各種集合的搜索砾跃、排序、線程安全化等操作节吮。try catch finally抽高,try里有return,finally還執(zhí)行么透绩?
a.不管有木有出現(xiàn)異常翘骂,finally塊中代碼都會執(zhí)行 b.當try和catch中有return時壁熄,finally仍然會執(zhí)行
c.finally是在return后面的表達式運算后執(zhí)行的(此時并沒有返回運算后的值,而是先把要返回的值保存起來碳竟,管finally中的代碼怎么樣草丧,返回的值都不會改變,任然是之前保存的值)莹桅,所以函數(shù)返回值是在finally執(zhí)行前確定的
d.finally中最好不要包含return昌执,否則程序會提前退出,返回值不是try或catch中保存的返回值Excption與Error包結(jié)構(gòu)诈泼。OOM你遇到過哪些情況懂拾,SOF你遇到過哪些情況。
java.lang.OutOfMemoryError: Java heap space ------>java堆內(nèi)存溢出铐达,此種情況最常見岖赋,一般由于內(nèi)存泄露或者堆的大小設(shè)置不當引起。
java.lang.OutOfMemoryError: PermGen space ------>java永久代溢出瓮孙,即方法區(qū)溢出了唐断,一般出現(xiàn)于大量Class或者jsp頁面,或者采用cglib等反射機制的情況衷畦,因為上述情況會產(chǎn)生大量的Class信息存儲于方法區(qū)栗涂。
java.lang.StackOverflowError ------> 不會拋OOM error,但也是比較常見的Java內(nèi)存溢出祈争。JAVA虛擬機棧溢出斤程,一般是由于程序中存在死循環(huán)或者深度遞歸調(diào)用造成的,棧大小設(shè)置太小也會出現(xiàn)此種溢出菩混》奘可以通過虛擬機參數(shù)-Xss來設(shè)置棧的大小。Java面向?qū)ο蟮娜齻€特征與含義沮峡。
封裝性:它是將類的一些敏感信息隱藏在類的類部疚脐,不讓外界直接訪問到
繼承性:子類通過一種方式來接受父類所有的公有的,受保護的成員變量和成員方法
多態(tài)性:程序在運行的過程中邢疙,同一種類型在不同的條件下表現(xiàn)不同的結(jié)果Override和Overload的含義區(qū)別棍弄。
方法的重寫Overriding和重載Overloading是Java多態(tài)性的不同表現(xiàn)。重寫
Overriding是父類與子類之間多態(tài)性的一種表現(xiàn)疟游,重載Overloading是一個類中多態(tài)性的一種表現(xiàn)呼畸。如果在子類中定義某方法與其父類有相同的名稱和參數(shù),我們說該方法被重寫 (Overriding)颁虐。子類的對象使用這個方法時蛮原,將調(diào)用子類中的定義,對它而言另绩,父類中的定義如同被“屏蔽”了儒陨。如果在一個類中定義了多個同名的方法花嘶,它們或有不同的參數(shù)個數(shù)或有不同的參數(shù)類型,則稱為方法的重載(Overloading)蹦漠。Overloaded的方法是可以改變返回值的類型椭员。Interface與abstract類的區(qū)別。
接口可以多重繼承笛园,抽象類不可以
接口定義方法拆撼,不給實現(xiàn);而抽象類可以實現(xiàn)部分方法
接口中基本數(shù)據(jù)類型的數(shù)據(jù)成員喘沿,都默認為static和final,抽象類則不是Static class 與non static class的區(qū)別竭贩。
內(nèi)部靜態(tài)類不需要有指向外部類的引用蚜印。但非靜態(tài)內(nèi)部類需要持有對外部類的引用。 非靜態(tài)內(nèi)部類能夠訪問外部類的靜態(tài)和非靜態(tài)成員留量。靜態(tài)類不能訪問外部類的非靜態(tài)成員窄赋。他只能訪問外部類的靜態(tài)成員。一個非靜態(tài)內(nèi)部類不能脫離外部類實體被創(chuàng)建楼熄,一個非靜態(tài)內(nèi)部類可以訪問外部類的數(shù)據(jù)和方法忆绰,因為他就在外部類里面。java多態(tài)的實現(xiàn)原理可岂。
ⅰ.設(shè)計時多態(tài):方法【重載】實現(xiàn)的多態(tài)
ⅱ.運行時多態(tài):方法【重寫】實現(xiàn)的多態(tài)實現(xiàn)多線程的兩種方法:Thread與Runable错敢。
使用Runnable接口
實際工作中,幾乎所有的多線程應(yīng)用都用實現(xiàn)Runnable這種方式缕粹。 Runnable適合多個相同程序代碼的線程去處理同一資源的情況稚茅。把虛擬CPU(線程)同程序的代碼、數(shù)據(jù)有效的分離平斩,較好的體現(xiàn)了面向?qū)ο蟮脑O(shè)計思想亚享。
避免由于Java的單繼承特性帶來的局限性。也就是如果新建的類要繼承其他類的話,因為JAVA中不支持多繼承,就只能實現(xiàn)java.lang.Runnable接口绘面。
有利于程序的健壯性欺税,代碼能夠被多個線程共享,代碼與數(shù)據(jù)是獨立的揭璃。
繼承Thread類
不能再繼承他類了晚凿。
編寫簡單,可以直接操縱線程塘辅,無需使用Thread.currentThread()晃虫。線程同步的方法:sychronized、lock扣墩、reentrantLock等哲银。
sychronized是java中最基本同步互斥的手段,可以修飾代碼塊,方法,類扛吞,在修飾代碼塊的時候需要一個reference對象作為鎖的對象,在修飾方法的時候默認是當前對象作為鎖的對象荆责,在修飾類時候默認是當前類的Class對象作為鎖的對象. ReentrantLock除了synchronized的功能,多了三個高級功能.
等待可中斷,在持有鎖的線程長時間不釋放鎖的時候,等待的線程可以選擇放棄等待 公平鎖, 按照申請鎖的順序來一次獲得鎖稱為公平鎖.synchronized的是非公平鎖,ReentrantLock可以通過構(gòu)造函數(shù)實現(xiàn)公平鎖
綁定多個Condition. 通過多次newCondition可以獲得多個Condition對象,可以簡單的實現(xiàn)比較復(fù)雜的線程同步的功能.通過await(),signal();鎖的等級:方法鎖滥比、對象鎖、類鎖做院。
方法鎖盲泛,synchronized標記的方法
對象鎖,在方法上加了synchronized的鎖键耕,或者synchronized(this)的代碼段 類鎖寺滚,在代碼中的方法上加了static和synchronized的鎖,因為在靜態(tài)方法中加同步鎖會鎖住整個類寫出生產(chǎn)者消費者模式屈雄。
ThreadLocal的設(shè)計理念與作用村视。
ThreadLocal并不是一個Thread,而是Thread的局部變量酒奶,也許把它命名為ThreadLocalVariable更容易讓人理解一些
當使用ThreadLocal維護變量時蚁孔,ThreadLocal為每個使用該變量的線程提供獨立的變量副本,所以每一個線程都可以獨立地改變自己的副本惋嚎,而不會影響其它線程所對應(yīng)的副本杠氢。ThreadPool用法與優(yōu)勢。
線程池是為突然大量爆發(fā)的線程設(shè)計的另伍,通過有限的幾個固定線程為大量的操作服務(wù)鼻百,減少了創(chuàng)建和銷毀線程所需的時間,從而提高效率质况。
FixedThreadPool(int nThreads): 創(chuàng)建一個可重用的固定線程數(shù)的線程池愕宋,如果池中所有的nThreads個線程都處于活動狀態(tài)時提交任務(wù)(任務(wù)通常是Runnable或Callable對象), 任務(wù)將在隊列中等待, 直到池中出現(xiàn)可用線程
CachedThreadPool(): 調(diào)用此方法創(chuàng)建的線程池可根據(jù)需要自動調(diào)整池中線程的數(shù)量,執(zhí)行任務(wù)時將重用存在先前創(chuàng)建的線程(如果池中存在可用線程的話). 如果池中沒有可用線程, 將創(chuàng)建一個新的線程, 并將其添加到池中. 池中的線程超過60秒未被使用就會被銷毀, 因此長時間保持空閑的
SingleThreadExecutor(): 創(chuàng)建一個單線程的Executor. 這個Executor保證按照任務(wù)提交的順序依次執(zhí)行任務(wù).
ScheduledThreadPool(int corePoolSize): 創(chuàng)建一個可重用的固定線程數(shù)的線程池. ScheduledExecutorService是ExecutorService的子接口, 調(diào)用ScheduledExecutorService的相關(guān)方法, 可以延遲或定期執(zhí)行任務(wù).
以上靜態(tài)方法均使用默認的ThreadFactory(即Executors.defaultThreadFactory()方法的返回值)創(chuàng)建線程, 如果想要指定ThreadFactory, 可調(diào)用他們的重載方法.通過指定ThreadFactory, 可以定制新建線程的名稱, 線程組, 優(yōu)先級, 守護線程狀態(tài)等. 如果Executors提供的創(chuàng)建線程池的方法無法滿足要求, 可以使用ThreadPoolExecutor類創(chuàng)建線程池.Concurrent包里的其他東西:ArrayBlockingQueue结榄、CountDownLatch等等中贝。
wait()和sleep()的區(qū)別。
sleep指線程被調(diào)用時臼朗,占著CPU不工作邻寿,形象地說明為“占著CPU睡覺”,此時视哑,系統(tǒng)的CPU部分資源被占用绣否,其他線程無法進入,會增加時間限制挡毅。 wait指線程處于進入等待狀態(tài)蒜撮,形象地說明為“等待使用CPU”,此時線程不占用任何資源,不增加時間限制foreach與正常for循環(huán)效率對比段磨。
針對列表的 foreach的效率是最低, 耗時是普通for循環(huán)的2倍以上取逾。個人理解它的實現(xiàn)應(yīng)該和iterator相似Java IO與NIO。
Java NIO和IO之間第一個最大的區(qū)別是苹支,IO是面向流的砾隅,NIO是面向緩沖區(qū)的。 Java IO面向流意味著每次從流中讀一個或多個字節(jié)债蜜,直至讀取所有字節(jié)晴埂,它們沒有被緩存在任何地方。此外寻定,它不能前后移動流中的數(shù)據(jù)儒洛。如果需要前后移動從流中讀取的數(shù)據(jù),需要先將它緩存到一個緩沖區(qū)狼速。 Java NIO的緩沖導(dǎo)向方法略有不同晶丘。數(shù)據(jù)讀取到一個它稍后處理的緩沖區(qū),需要時可在緩沖區(qū)中前后移動唐含。這就增加了處理過程中的靈活性。但是沫浆,還需要檢查是否該緩沖區(qū)中包含所有您需要處理的數(shù)據(jù)捷枯。而且,需確保當更多的數(shù)據(jù)讀入緩沖區(qū)時专执,不要覆蓋緩沖區(qū)里尚未處理的數(shù)據(jù)淮捆。反射的作用于原理。
JAVA反射(放射)機制:Reflection本股,Java程序可以加載一個運行時才得知名稱的class攀痊,獲悉其完整構(gòu)造(但不包括methods定義),并生成其對象實體拄显、或?qū)ζ鋐ields設(shè)值苟径、或喚起其methods。
用途:Java反射機制主要提供了以下功能: 在運行時判斷任意一個對象所屬的類躬审;在運行時構(gòu)造任意一個類的對象棘街;在運行時判斷任意一個類所具有的成員變量和方法;在運行時調(diào)用任意一個對象的方法承边;生成動態(tài)代理遭殉。泛型常用特點,List<String>能否轉(zhuǎn)為List<Object>博助。
泛型险污,即“參數(shù)化類型”。一提到參數(shù)富岳,最熟悉的就是定義方法時有形參蛔糯,然后調(diào)用此方法時傳遞實參拯腮。那么參數(shù)化類型怎么理解呢?顧名思義渤闷,就是將類型由原來的具體的類型參數(shù)化疾瓮,類似于方法中的變量參數(shù),此時類型也定義成參數(shù)形式(可以稱之為類型形參)飒箭,然后在使用/調(diào)用時傳入具體的類型(類型實參)
在Java的泛型接口中 把List < String > 轉(zhuǎn)換成List < Object > 是可以的狼电。解析XML的幾種方式的原理與特點:DOM、SAX弦蹂、PULL肩碟。
Dom解析 在內(nèi)存中創(chuàng)建一個DOM樹,該結(jié)構(gòu)通常需要加載整個文檔然后才能做工作凸椿。由于它是基于信息層次的削祈,因而DOM被認為是基于樹或基于對象的,樹在內(nèi)存中是持久的脑漫,因此可以修改它以便應(yīng)用程序能對數(shù)據(jù)和結(jié)構(gòu)作出更改能隨機訪問文件內(nèi)容髓抑,也可以修改原文件內(nèi)容
SAX解析 SAX處理的優(yōu)點非常類似于流媒體的優(yōu)點。分析能夠立即開始优幸,而不是等待所有的數(shù)據(jù)被處理吨拍。SAX解析器采用了基于事件的模型,它在解析XML文檔的時候可以觸發(fā)一系列的事件网杆,當發(fā)現(xiàn)給定的tag的時候羹饰,它可以激活一個回調(diào)方法,告訴該方法制定的標簽已經(jīng)找到碳却。而且队秩,由于應(yīng)用程序只是在讀取數(shù)據(jù)時檢查數(shù)據(jù),因此不需要將數(shù)據(jù)存儲在內(nèi)存中昼浦。這對于大型文檔來說是個巨大的優(yōu)點線性解析馍资,不能隨機訪問,也無法修改原文件
http://blog.csdn.net/kukulongzai_123/article/details/7058008
- Java與C++對比关噪。
- Java1.7與1.8新特性迷帜。
如1.7 Switch中加入對String的支持,1.8中加入lambda表達式
- 設(shè)計模式:單例色洞、工廠戏锹、適配器、責任鏈火诸、觀察者等等锦针。
- JNI的使用。
JNI作為java和操作系統(tǒng)間的一個直接接口,可以通過JNI使得java直接調(diào)用操作系統(tǒng)的資源奈搜。目前JNI只能通過c/C++實現(xiàn)悉盆,因為jni只是對操作系統(tǒng)資源調(diào)用的一個橋接過程。所以理論上在windows下只要是dll文件均可以被調(diào)用馋吗。 jni一般有以下一些應(yīng)用場景
1.高性能 焕盟,在一些情況下因為處理運算量非常大,為了獲取高性能宏粤,直接使用java是不能勝任的脚翘,如:一些圖形的處理
2.調(diào)用一些硬件的驅(qū)動或者一些軟件的驅(qū)動,比如調(diào)用一些外部系統(tǒng)接口的驅(qū)動绍哎,如:讀卡器的驅(qū)動来农,OCI驅(qū)動
3.需要使用大內(nèi)存,遠遠超過jvm所能分配的內(nèi)存崇堰,如:進程內(nèi)Cache
4.調(diào)用C或者操作系統(tǒng)提供的服務(wù)沃于,如:java調(diào)用搜索服務(wù),其中搜索是由C/C++實現(xiàn)的海诲,不過這個一般可以設(shè)計成更加通用的方式繁莹,比如soa的方式
所有這些場景的前提是犧牲了java代碼的可移植性,不同的os特幔,甚至版本都需要寫不同版本的native實現(xiàn)