java
- 舉例說明多態(tài)和重載區(qū)別
多態(tài)性就是父類引用時被賦予不同的子類對象引用,從而表現(xiàn)出不同的行為,多態(tài)性為程序提供更好的可擴展性和代碼重用。
如果在子類中定義了于其父類同名的成員方法,成為 重寫;
如果在一個類中定義了兩個或兩個以上的具有不同參數(shù)列表(參數(shù)個數(shù)不同或參數(shù)類型不同)的同名方法,成為重載;
class Triangle extends Shape { public int getSides() //重寫 { return 3; } } class Rectangle extends Shape { public int getSides(int i) //重載 { return i; } } public class Shape { public boolean isSharp(){ return true; } public int getSides(){ return 0 ; } public int getSides(Triangle tri){ return 3 ; } //重載 public int getSides(Rectangle rec){ return 4 ; }//重載 public static void main(String[] args) { Triangle tri = new Triangle(); System.out.println(“Triangle is a type of sharp? ” + tri.isSharp()); Shape shape = new Triangle(); //多態(tài) System.out.println(“My shape has ” + shape.getSides() + ” sides.”); }} - 堆棧
JVM內(nèi)存結(jié)構(gòu)圖
第一塊:PC寄存器
PC寄存器是用于存儲每個線程下一步將執(zhí)行的JVM指令,如該方法為native的,則PC寄存器中不存儲任何信息。
第二塊:JVM棧
JVM棧是線程私有的,每個線程創(chuàng)建的同時都會創(chuàng)建JVM棧,JVM棧中存放的為當前線程中局部基本類型的變量(java中定義的八種基本類型:boolean、char、byte、short、int、long、float、double)、部分的返回結(jié)果以及Stack Frame,非基本類型的對象在JVM棧上僅存放一個指向堆上的地址
第三塊:堆(Heap)
它是JVM用來存儲對象實例以及數(shù)組值的區(qū)域,可以認為Java中所有通過new創(chuàng)建的對象的內(nèi)存都在此分配,Heap中的對象的內(nèi)存需要等待GC進行回收。
(1) 堆是JVM中所有線程共享的,因此在其上進行對象內(nèi)存的分配均需要進行加鎖,這也導(dǎo)致了new對象的開銷是比較大的
(2) Sun Hotspot JVM為了提升對象內(nèi)存分配的效率,對于所創(chuàng)建的線程都會分配一塊獨立的空間TLAB(Thread Local Allocation Buffer),其大小由JVM根據(jù)運行的情況計算而得,在TLAB上分配對象時不需要加鎖,因此JVM在給線程的對象分配內(nèi)存時會盡量的在TLAB上分配,在這種情況下JVM中分配對象內(nèi)存的性能和C基本是一樣高效的,但如果對象過大的話則仍然是直接使用堆空間分配
(3) TLAB僅作用于新生代的Eden Space,因此在編寫Java程序時,通常多個小的對象比大的對象分配起來更加高效。
第四塊:方法區(qū)域(Method Area)
(1)在Sun JDK中這塊區(qū)域?qū)?yīng)的為PermanetGeneration,又稱為持久代。
(2)方法區(qū)域存放了所加載的類的信息(名稱、修飾符等)、類中的靜態(tài)變量、類中定義為final類型的常量、類中的Field信息、類中的方法信息,當開發(fā)人員在程序中通過Class
對象中的getName、isInterface等方法來獲取信息時,這些數(shù)據(jù)都來源于方法區(qū)域,同時方法區(qū)域也是全局共享的,在一定的條件下它也會被GC,當方法區(qū)域需要使用的內(nèi)存超過其允許的大小時,會拋出OutOfMemory的錯誤信息。
第五塊:運行時常量池(Runtime Constant Pool)
存放的為類中的固定的常量信息、方法和Field的引用信息等,其空間從方法區(qū)域中分配。
第六塊:本地方法堆棧(Native Method Stacks)
JVM采用本地方法堆棧來支持native方法的執(zhí)行,此區(qū)域用于存儲每個native方法調(diào)用的狀態(tài)。 - 垃圾回收
GC的基本原理:**將內(nèi)存中不再被使用的對象進行回收,GC中用于回收的方法稱為收集器,由于GC需要消耗一些資源和時間,Java在對對象的生命周期特征進行分析后,按照新生代、舊生代的方式來對對象進行收集,以盡可能的縮短GC對應(yīng)用造成的暫停
(1)對新生代的對象的收集稱為minor GC;
(2)對舊生代的對象的收集稱為Full GC;
(3)程序中主動調(diào)用System.gc()強制執(zhí)行的GC為Full GC。
**不同的對象引用類型, GC會采用不同的方法進行回收,JVM對象的引用分為了四種類型:
(1)強引用:默認情況下,對象采用的均為強引用(這個對象的實例沒有其他對象引用,GC時才會被回收)
(2)軟引用:軟引用是Java中提供的一種比較適合于緩存場景的應(yīng)用(只有在內(nèi)存不夠用的情況下才會被GC)
(3)弱引用:在GC時一定會被GC回收
(4)虛引用:由于虛引用只是用來得知對象是否被GC - Final,finally,finalize
final用于聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。
finally是異常處理語句結(jié)構(gòu)的一部分,表示總是執(zhí)行。
finalize是Object類的一個方法,在垃圾收集器執(zhí)行的時候會調(diào)用被回收對象的此方法,供垃圾收集時的其他資源回收,例如關(guān)閉文件等。 - 序列化反序列化,為什么要有自定義序列化
把對象轉(zhuǎn)換為字節(jié)序列的過程稱為對象的序列化?! ?br> 把字節(jié)序列恢復(fù)為對象的過程稱為對象的反序列化。
對象的序列化主要有兩種用途:
1). 把對象的字節(jié)序列永久地保存到硬盤上,通常存放在一個文件中。
在很多應(yīng)用中,需要對某些對象進行序列化,讓它們離開內(nèi)存空間,入住物理硬盤,以便長期保存。比如最常見的是Web服務(wù)器中的Session對象,當有 10萬用戶并發(fā)訪問,就有可能出現(xiàn)10萬個Session對象,內(nèi)存可能吃不消,于是Web容器就會把一些seesion先序列化到硬盤中,等要用了,再把保存在硬盤中的對象還原到內(nèi)存中。
2). 在網(wǎng)絡(luò)上傳送對象的字節(jié)序列。
當兩個進程在進行遠程通信時,彼此可以發(fā)送各種類型的數(shù)據(jù)。無論是何種類型的數(shù)據(jù),都會以二進制序列的形式在網(wǎng)絡(luò)上傳送。發(fā)送方需要把這個Java對象轉(zhuǎn)換為字節(jié)序列,才能在網(wǎng)絡(luò)上傳送;接收方則需要把字節(jié)序列再恢復(fù)為Java對象。
想將父類對象也序列化,就需要讓父類也實現(xiàn)Serializable 接口。如果父類不實現(xiàn)的話的,就 需要有默認的無參的構(gòu)造函數(shù)。在父類沒有實現(xiàn) Serializable 接口時,虛擬機是不會序列化父對象的,而一個 Java 對象的構(gòu)造必須先有父對象,才有子對象,反序列化也不例外。所以反序列化時,為了構(gòu)造父對象,只能調(diào)用父類的無參構(gòu)造函數(shù)作為默認的父對象。
如果子類實現(xiàn)了java.io.Serializable,但父類沒有實現(xiàn)此接口,子類的值域保留下來了,但是父類的值域丟失了,這對jvm 來說是正常的,因為父類不可序列化。為了解決這個問題,只能自定義序列化行為,在序列化的默認動作之后將父類里值域?qū)懭肓骰驅(qū)懗隽?,順序要一致?br>
自定義序列化有兩種:
1).實現(xiàn)java.io.Serializable,重寫private void writeObject(ObjectOutputStream os) throws IOException
private void readObject(ObjectInputStream is) throws IOException, ClassNotFoundException ,執(zhí)行默認序列化外( 先調(diào)用outputStream.defaultWriteObject();或 inputStream.defaultReadObject();),可以控制聲明為static或transient的數(shù)據(jù)成員。
2).實現(xiàn)java.io.Externalizable,要有無參數(shù)的默認構(gòu)造函數(shù),重寫void writeExternal(ObjectOutput out) throws IOException;
void readExternal(ObjectInput in) throws IOException, ClassNotFoundException; 完全負責(zé)序列化和恢復(fù)數(shù)據(jù)成員,除了頭以外,根本沒有自動序列化。實現(xiàn)了這個接口就不會調(diào)用1中的兩個方法。
- Java的靈活性體現(xiàn)在什么機制上
JVM ? 反射? - Jdk1.5到1.7有什么新特性
自行百度 - 排序算法
自行百度 - 無序數(shù)組ab,每個數(shù)組有一次循環(huán)遍歷的機會,找出a有b沒有的數(shù)字(不能使用外部東西)
public class SearchArray { public static void main(String[] args) { // TODO Auto-generated method stub int a[] = { 5, 9, -4 }; int b[] = { 10, 8, 4, 5, -3 }; Arrays.sort(a); Arrays.sort(b); search(a, a.length, b, b.length); } private static void search(int a[], int lenA, int b[], int lenB) { int pa = 0, pb = 0; while (pa < lenA && pb < lenB) { if (a[pa] == b[pb]) { ++pa; continue; } else if (a[pa] < b[pb]) { System.out.println(a[pa]); ++pa; } else { ++pb; } } while (pa < lenA) { System.out.println(a[pa]); ++pa; } } }
- Hashtable和hashmap
他們都實現(xiàn)了Map接口
區(qū)別:
1).HashTable是java早期版本中Dictionary的子類
2).HashTable的方法是同步的,兒HashMap不是同步的。
3).HashTable不允許null值作為Key和 value;HashMap中null值可以作為Key,但是這樣的Key必須只有一個,Value可以有多個null。 - Hashcode是怎么得到的
Java中的hashCode方法就是根據(jù)一定的規(guī)則將與對象相關(guān)的信息(比如對象的存儲地址,對象的字段等)映射成一個數(shù)值,這個數(shù)值稱作為散列值。即在散列集合包括HashSet、HashMap以及HashTable里,對每一個存儲的桶元素都有一個唯一的"塊編號",即它在集合里面的存儲地址;當你調(diào)用contains方法的時候,它會根據(jù)hashcode找到塊的存儲地址從而定位到該桶元素。
詳情查看http://www.importnew.com/13384.html - 線程和進程
進程:程序的一次執(zhí)行,是資源的集合
線程:CPU的基本調(diào)度單位
其他解釋都是扯淡,這個是最核心的抽象! - sleep和wait區(qū)別
1).sleep屬于Thread類,wait屬于Object類
2).sleep沒有釋放鎖;wait釋放了鎖,使其他線程可以使用同步控制塊或者同步方法
3).wait(),notify(),notifyAll()只能在同步控制方法或者同步塊中使用;sleep可以在任何地方使用
4).sleep必須捕獲異常,wait不需要。 - 二叉平衡樹,滿二叉樹
滿二叉樹:除了葉結(jié)點外每一個結(jié)點都有左右子葉且葉結(jié)點都處在最底層的二叉樹
二叉平衡樹:又稱AVL樹。它或者是一棵空樹,或者是具有下列性質(zhì)的二叉樹:它的左子樹和右子樹都是平衡二叉樹,且左子樹和右子樹的高度之差的絕對值不超過1 - Object有哪些基本的方法
1.clone方法
保護方法,實現(xiàn)對象的淺復(fù)制,只有實現(xiàn)了Cloneable接口才可以調(diào)用該方法,否則拋出CloneNotSupportedException異常。
2.getClass方法
final方法,獲得運行時類型。
3.toString方法
該方法用得比較多,一般子類都有覆蓋。
4.finalize方法
該方法用于釋放資源。因為無法確定該方法什么時候被調(diào)用,很少使用。
5.equals方法
該方法是非常重要的一個方法。一般equals和==是不一樣的,但是在Object中兩者是一樣的。子類一般都要重寫這個方法。
6.hashCode方法
該方法用于哈希查找,重寫了equals方法一般都要重寫hashCode方法。這個方法在一些具有哈希功能的Collection中用到。
一般必須滿足obj1.equals(obj2)==true??梢酝瞥鰋bj1.hashCode()==obj2.hashCode(),但是hashCode相等不一定就滿足equals。不過為了提高效率,應(yīng)該盡量使上面兩個條件接近等價。
7.wait方法
wait方法就是使當前線程等待該對象的鎖,當前線程必須是該對象的擁有者,也就是具有該對象的鎖。wait()方法一直等待,直到獲得鎖或者被中斷。wait(long timeout)設(shè)定一個超時間隔,如果在規(guī)定時間內(nèi)沒有獲得鎖就返回。
調(diào)用該方法后當前線程進入睡眠狀態(tài),直到以下事件發(fā)生。
(1)其他線程調(diào)用了該對象的notify方法。
(2)其他線程調(diào)用了該對象的notifyAll方法。
(3)其他線程調(diào)用了interrupt中斷該線程。
(4)時間間隔到了。
此時該線程就可以被調(diào)度了,如果是被中斷的話就拋出一個InterruptedException異常。
8.notify方法
該方法喚醒在該對象上等待的某個線程。
9.notifyAll方法
該方法喚醒在該對象上等待的所有線程。
Io和nio
寫一個單例模式的例子
Socket
Exception
有向圖和無向圖什么區(qū)別
Linux基本命令
數(shù)組和鏈表
深克隆,淺克隆
Java的引用類型有哪些,在垃圾回收的時候有什么表現(xiàn)
數(shù)據(jù)庫
1.ACID
Group by
Distinct
Where條件的執(zhí)行順序是從前往后還是從后往前,還是其他什么順序
網(wǎng)絡(luò)
1.你知道什么網(wǎng)絡(luò)協(xié)議,解釋一下
2.post和get區(qū)別
3.OSI參考模型
4.get的參數(shù)是跟在url后面,那post的參數(shù)是加在什么地方
5.斷點重傳
6.PC端的網(wǎng)絡(luò)連接和移動端有什么區(qū)別?
7.定位需要幾顆衛(wèi)星
8.Gps和agps定位有什么區(qū)別
Android
橫豎屏切換的差別
Activity生命周期
什么時候會用到activity生命周期
Scroll中有l(wèi)istview,出現(xiàn)什么問題,如何解決
消息推送的方法
有一個比較大的圖片,如果內(nèi)存不夠加載,怎么辦