J2SE基礎
- 九種基本數據類型的大小,以及他們的封裝類。
Java基本類型共有八種,基本類型可以分為三類,字符類型char,布爾類型boolean以及數值類型byte、short、int、long、float、double。數值類型又可以分為整數類型byte、short、int、long和浮點數類型float、double。JAVA中的數值類型不存在無符號的,它們的取值范圍是固定的,不會隨著機器硬件環境或者操作系統的改變而改變。實際上,JAVA中還存在另外一種基本類型void,它也有對應的包裝類 java.lang.Void,不過我們無法直接對它們進行操作。8 中類型表示范圍如下:
byte:8位,最大存儲數據量是255,存放的數據范圍是-128~127之間。
short:16位,最大數據存儲量是65536,數據范圍是-32768~32767之間。
int:32位,最大數據存儲容量是2的32次方減1,數據范圍是負的2的31次方到正的2的31次方減1。
long:64位,最大數據存儲容量是2的64次方減1,數據范圍為負的2的63次方到正的2的63次方減1。
float:32位,數據范圍在3.4e-45~1.4e38,直接賦值時必須在數字后加上f或F。
double:64位,數據范圍在4.9e-324~1.8e308,賦值時可以加d或D也可以不加。
boolean:只有true和false兩個取值。
char:16位,存儲Unicode碼,用單引號賦值。
封裝類分別為Boolean, Byte, Character, Short, Integer, Long, Float, Double, Void。
既然提供了基本類型,為什么還要使用封裝類呢
比如,如果想使用List來保存數值,由于List中只能添加對象,另外,有些情況下,我們也會編寫諸如func(Object o)的這種方法
2.Switch能否用string做參數?
可以,從JDK1.7開始可以。
switch(expr)中,expr可以是byte、short、char、int。從1.5版開始,Java中引入了枚舉類型(enum),expr也可以是枚舉,從JDK 1.7版開始,還可以是字符串(String)。長整型(long)是不可以的。
- equals與==的區別。
==比較的是值(基本數據類型)或內存地址(復合數據類型); JAVA當中所有的類都是繼承于Object這個基類的,在Object中的基類中定義了一個equals的方法,Object的equals方法也是用雙等號(==)進行比較的。但如String,Integer,Date在這些類當中equals有其自身的實現,而不再是比較類在堆內存中的存放地址了。
*注意new()操作會開辟新的內存地址。 - Object有哪些公用方法?
Object的公用方法主要有clone(),equals(),hashCode(),getClass(),wait(),notify(),notifyAll(),toString().
- Java的四種引用,強弱軟虛,用到的場景。
四種引用級別由高到低依次為:強引用、軟引用、弱引用和虛引用。
強引用:是JVM的默認實現,即使內存不足垃圾回收器也不會回收;
弱引用(WeakReference):當所引用的對象在 JVM 內不再有強引用時, GC 后weak reference 將會被自動回收;
軟引用(SoftReference):SoftReference 于 WeakReference 的特性基本一致, 最大的區別在于SoftReference 會盡可能長的保留引用直到 JVM 內存不足時才會被回收(虛擬機保證) ;
虛引用:如果一個對象僅持有虛引用,那么它就和沒有任何引用一樣,在任何時候都可能被垃圾回收。
使用場景:軟引(或弱引用)可以和一個引用隊列(ReferenceQueue)聯合使用,如果軟引用(或弱引用)所引用的對象被垃圾回收,Java虛擬機就會把這個軟引用(或弱引用)加入到與之關聯的引用隊列中。虛引用主要用來跟蹤對象被垃圾回收的活動。
- Hashcode的作用。
hashcode方法返回該對象的哈希碼值,用于查找使用。
ArrayList、LinkedList、Vector的區別。
ArrayList,Vector采用數組實現存儲,允許直接按序號索引,但插入數據涉及到數組元素移動,因此索引快插入慢。ArrayList是非安全線程,Vector是安全線程,性能通常較ArrayList差。
LinkedList采用雙向鏈表實現數據存儲,索引需要向前或向后遍歷,但插入只需要記錄本項的前后項,因此索引慢但插入快。String、StringBuffer與StringBuilder的區別。
String長度不可變,StringBuffer和StringBuilder長度可變。StringBuilder在單線程環境下使用,沒有synchronized修飾,更高效。Map、Set、List、Queue、Stack的特點與用法。
Map(映射) 鍵值對組成的集合
Set 無序集合,元素不可重復
List 有序集合,元素可以重復
Queue 隊列,先進先出
Stack 棧,后進先出
Set集合類似于一個罐子,"丟進"Set集合里的多個對象之間沒有明顯的順序。
List集合代表元素有序、可重復的集合,集合中每個元素都有其對應的順序索引。
Stack是Vector提供的一個子類,用于模擬"棧"這種數據結構(LIFO后進先出)
Queue用于模擬"隊列"這種數據結構(先進先出 FIFO)。
Map用于保存具有"映射關系"的數據,因此Map集合里保存著兩組值
HashMap和HashTable的區別。
Hashtable是基于陳舊的Dictionary類的,HashMap是Map接口的一個實現 Hashtable的方法是線程同步的,而HashMap的方法不是。 只有HashMap可以讓你將空值作為一個表的條目的key或valueHashMap和ConcurrentHashMap的區別,HashMap的底層源碼。
TreeMap、HashMap、LindedHashMap的區別。
Hashmap 是一個最常用的Map,它根據鍵的HashCode 值存儲數據,根據鍵可以直接獲取它的值,具有很快的訪問速度,遍歷時,取得數據的順序是完全隨機的。
LinkedHashMap保存了記錄的插入順序,在用Iterator遍歷LinkedHashMap時,先得到的記錄肯定是先插入的.也可以在構造時用帶參數,按照應用次數排序
TreeMap取出來的是排序后的鍵值對。但如果您要按自然順序或自定義順序遍歷鍵,那么TreeMap會更好。Collection類,Collection包結構,與Collections的區別。
Collection是集類,包含List有序列表,Set無序集合以及Map雙列集合
Collection是集合類的上級接口,子接口主要有Set 和List、Map。
Collections是針對集合類的一個幫助類,提供了操作集合的工具方法:一系列靜態方法實現對各種集合的搜索、排序、線程安全化等操作。try catch finally,try里有return,finally還執行么?
a.不管有木有出現異常,finally塊中代碼都會執行 b.當try和catch中有return時,finally仍然會執行
c.finally是在return后面的表達式運算后執行的(此時并沒有返回運算后的值,而是先把要返回的值保存起來,管finally中的代碼怎么樣,返回的值都不會改變,任然是之前保存的值),所以函數返回值是在finally執行前確定的
d.finally中最好不要包含return,否則程序會提前退出,返回值不是try或catch中保存的返回值Excption與Error包結構。OOM你遇到過哪些情況,SOF你遇到過哪些情況。
java.lang.OutOfMemoryError: Java heap space ------>java堆內存溢出,此種情況最常見,一般由于內存泄露或者堆的大小設置不當引起。
java.lang.OutOfMemoryError: PermGen space ------>java永久代溢出,即方法區溢出了,一般出現于大量Class或者jsp頁面,或者采用cglib等反射機制的情況,因為上述情況會產生大量的Class信息存儲于方法區。
java.lang.StackOverflowError ------> 不會拋OOM error,但也是比較常見的Java內存溢出。JAVA虛擬機棧溢出,一般是由于程序中存在死循環或者深度遞歸調用造成的,棧大小設置太小也會出現此種溢出。可以通過虛擬機參數-Xss來設置棧的大小。Java面向對象的三個特征與含義。
封裝性:它是將類的一些敏感信息隱藏在類的類部,不讓外界直接訪問到
繼承性:子類通過一種方式來接受父類所有的公有的,受保護的成員變量和成員方法
多態性:程序在運行的過程中,同一種類型在不同的條件下表現不同的結果Override和Overload的含義區別。
方法的重寫Overriding和重載Overloading是Java多態性的不同表現。重寫
Overriding是父類與子類之間多態性的一種表現,重載Overloading是一個類中多態性的一種表現。如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫 (Overriding)。子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被“屏蔽”了。如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型,則稱為方法的重載(Overloading)。Overloaded的方法是可以改變返回值的類型。Interface與abstract類的區別。
接口可以多重繼承,抽象類不可以
接口定義方法,不給實現;而抽象類可以實現部分方法
接口中基本數據類型的數據成員,都默認為static和final,抽象類則不是Static class 與non static class的區別。
內部靜態類不需要有指向外部類的引用。但非靜態內部類需要持有對外部類的引用。 非靜態內部類能夠訪問外部類的靜態和非靜態成員。靜態類不能訪問外部類的非靜態成員。他只能訪問外部類的靜態成員。一個非靜態內部類不能脫離外部類實體被創建,一個非靜態內部類可以訪問外部類的數據和方法,因為他就在外部類里面。java多態的實現原理。
ⅰ.設計時多態:方法【重載】實現的多態
ⅱ.運行時多態:方法【重寫】實現的多態實現多線程的兩種方法:Thread與Runable。
使用Runnable接口
實際工作中,幾乎所有的多線程應用都用實現Runnable這種方式。 Runnable適合多個相同程序代碼的線程去處理同一資源的情況。把虛擬CPU(線程)同程序的代碼、數據有效的分離,較好的體現了面向對象的設計思想。
避免由于Java的單繼承特性帶來的局限性。也就是如果新建的類要繼承其他類的話,因為JAVA中不支持多繼承,就只能實現java.lang.Runnable接口。
有利于程序的健壯性,代碼能夠被多個線程共享,代碼與數據是獨立的。
繼承Thread類
不能再繼承他類了。
編寫簡單,可以直接操縱線程,無需使用Thread.currentThread()。線程同步的方法:sychronized、lock、reentrantLock等。
sychronized是java中最基本同步互斥的手段,可以修飾代碼塊,方法,類,在修飾代碼塊的時候需要一個reference對象作為鎖的對象,在修飾方法的時候默認是當前對象作為鎖的對象,在修飾類時候默認是當前類的Class對象作為鎖的對象. ReentrantLock除了synchronized的功能,多了三個高級功能.
等待可中斷,在持有鎖的線程長時間不釋放鎖的時候,等待的線程可以選擇放棄等待 公平鎖, 按照申請鎖的順序來一次獲得鎖稱為公平鎖.synchronized的是非公平鎖,ReentrantLock可以通過構造函數實現公平鎖
綁定多個Condition. 通過多次newCondition可以獲得多個Condition對象,可以簡單的實現比較復雜的線程同步的功能.通過await(),signal();鎖的等級:方法鎖、對象鎖、類鎖。
方法鎖,synchronized標記的方法
對象鎖,在方法上加了synchronized的鎖,或者synchronized(this)的代碼段 類鎖,在代碼中的方法上加了static和synchronized的鎖,因為在靜態方法中加同步鎖會鎖住整個類寫出生產者消費者模式。
ThreadLocal的設計理念與作用。
ThreadLocal并不是一個Thread,而是Thread的局部變量,也許把它命名為ThreadLocalVariable更容易讓人理解一些
當使用ThreadLocal維護變量時,ThreadLocal為每個使用該變量的線程提供獨立的變量副本,所以每一個線程都可以獨立地改變自己的副本,而不會影響其它線程所對應的副本。ThreadPool用法與優勢。
線程池是為突然大量爆發的線程設計的,通過有限的幾個固定線程為大量的操作服務,減少了創建和銷毀線程所需的時間,從而提高效率。
FixedThreadPool(int nThreads): 創建一個可重用的固定線程數的線程池,如果池中所有的nThreads個線程都處于活動狀態時提交任務(任務通常是Runnable或Callable對象), 任務將在隊列中等待, 直到池中出現可用線程
CachedThreadPool(): 調用此方法創建的線程池可根據需要自動調整池中線程的數量,執行任務時將重用存在先前創建的線程(如果池中存在可用線程的話). 如果池中沒有可用線程, 將創建一個新的線程, 并將其添加到池中. 池中的線程超過60秒未被使用就會被銷毀, 因此長時間保持空閑的
SingleThreadExecutor(): 創建一個單線程的Executor. 這個Executor保證按照任務提交的順序依次執行任務.
ScheduledThreadPool(int corePoolSize): 創建一個可重用的固定線程數的線程池. ScheduledExecutorService是ExecutorService的子接口, 調用ScheduledExecutorService的相關方法, 可以延遲或定期執行任務.
以上靜態方法均使用默認的ThreadFactory(即Executors.defaultThreadFactory()方法的返回值)創建線程, 如果想要指定ThreadFactory, 可調用他們的重載方法.通過指定ThreadFactory, 可以定制新建線程的名稱, 線程組, 優先級, 守護線程狀態等. 如果Executors提供的創建線程池的方法無法滿足要求, 可以使用ThreadPoolExecutor類創建線程池.Concurrent包里的其他東西:ArrayBlockingQueue、CountDownLatch等等。
wait()和sleep()的區別。
sleep指線程被調用時,占著CPU不工作,形象地說明為“占著CPU睡覺”,此時,系統的CPU部分資源被占用,其他線程無法進入,會增加時間限制。 wait指線程處于進入等待狀態,形象地說明為“等待使用CPU”,此時線程不占用任何資源,不增加時間限制foreach與正常for循環效率對比。
針對列表的 foreach的效率是最低, 耗時是普通for循環的2倍以上。個人理解它的實現應該和iterator相似Java IO與NIO。
Java NIO和IO之間第一個最大的區別是,IO是面向流的,NIO是面向緩沖區的。 Java IO面向流意味著每次從流中讀一個或多個字節,直至讀取所有字節,它們沒有被緩存在任何地方。此外,它不能前后移動流中的數據。如果需要前后移動從流中讀取的數據,需要先將它緩存到一個緩沖區。 Java NIO的緩沖導向方法略有不同。數據讀取到一個它稍后處理的緩沖區,需要時可在緩沖區中前后移動。這就增加了處理過程中的靈活性。但是,還需要檢查是否該緩沖區中包含所有您需要處理的數據。而且,需確保當更多的數據讀入緩沖區時,不要覆蓋緩沖區里尚未處理的數據。反射的作用于原理。
JAVA反射(放射)機制:Reflection,Java程序可以加載一個運行時才得知名稱的class,獲悉其完整構造(但不包括methods定義),并生成其對象實體、或對其fields設值、或喚起其methods。
用途:Java反射機制主要提供了以下功能: 在運行時判斷任意一個對象所屬的類;在運行時構造任意一個類的對象;在運行時判斷任意一個類所具有的成員變量和方法;在運行時調用任意一個對象的方法;生成動態代理。泛型常用特點,List<String>能否轉為List<Object>。
泛型,即“參數化類型”。一提到參數,最熟悉的就是定義方法時有形參,然后調用此方法時傳遞實參。那么參數化類型怎么理解呢?顧名思義,就是將類型由原來的具體的類型參數化,類似于方法中的變量參數,此時類型也定義成參數形式(可以稱之為類型形參),然后在使用/調用時傳入具體的類型(類型實參)
在Java的泛型接口中 把List < String > 轉換成List < Object > 是可以的。解析XML的幾種方式的原理與特點:DOM、SAX、PULL。
Dom解析 在內存中創建一個DOM樹,該結構通常需要加載整個文檔然后才能做工作。由于它是基于信息層次的,因而DOM被認為是基于樹或基于對象的,樹在內存中是持久的,因此可以修改它以便應用程序能對數據和結構作出更改能隨機訪問文件內容,也可以修改原文件內容
SAX解析 SAX處理的優點非常類似于流媒體的優點。分析能夠立即開始,而不是等待所有的數據被處理。SAX解析器采用了基于事件的模型,它在解析XML文檔的時候可以觸發一系列的事件,當發現給定的tag的時候,它可以激活一個回調方法,告訴該方法制定的標簽已經找到。而且,由于應用程序只是在讀取數據時檢查數據,因此不需要將數據存儲在內存中。這對于大型文檔來說是個巨大的優點線性解析,不能隨機訪問,也無法修改原文件
http://blog.csdn.net/kukulongzai_123/article/details/7058008
- Java與C++對比。
- Java1.7與1.8新特性。
如1.7 Switch中加入對String的支持,1.8中加入lambda表達式
- 設計模式:單例、工廠、適配器、責任鏈、觀察者等等。
- JNI的使用。
JNI作為java和操作系統間的一個直接接口,可以通過JNI使得java直接調用操作系統的資源。目前JNI只能通過c/C++實現,因為jni只是對操作系統資源調用的一個橋接過程。所以理論上在windows下只要是dll文件均可以被調用。 jni一般有以下一些應用場景
1.高性能 ,在一些情況下因為處理運算量非常大,為了獲取高性能,直接使用java是不能勝任的,如:一些圖形的處理
2.調用一些硬件的驅動或者一些軟件的驅動,比如調用一些外部系統接口的驅動,如:讀卡器的驅動,OCI驅動
3.需要使用大內存,遠遠超過jvm所能分配的內存,如:進程內Cache
4.調用C或者操作系統提供的服務,如:java調用搜索服務,其中搜索是由C/C++實現的,不過這個一般可以設計成更加通用的方式,比如soa的方式
所有這些場景的前提是犧牲了java代碼的可移植性,不同的os,甚至版本都需要寫不同版本的native實現