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