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.”); }}
- 堆棧
第一塊: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é)序列的過程稱為對象的序列化魂爪。
把字節(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; 完全負責序列化和恢復(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盘榨。可以推出obj1.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)存不夠加載老厌,怎么辦