java 基礎總結
-
面向對象的特征有哪些犀填?
- 封裝 隱藏一切可隱藏的東西哗伯,只向外提供簡單的編程接口
- 繼承
- 多態(tài):方法重載和重寫
- 抽象:只關注有哪些行為和屬性苇瓣,不關注細節(jié)
-
public匠楚,private捷沸,protected以及default的區(qū)別摊沉?
橫坐標:當前類>>同包>>子類>>其它包
縱坐標:public>>protected>>default>>private
-
java的數據類型
- 基本類型
- int,double,byte,boolean,long,float,short,char
- 引用類型
- eg:String
- 枚舉類型(java 5以後)
- 基本類型
-
java的自動拆箱與裝箱機制
其實就是基本數據類型與引用類型的自動轉換
-
IntegerCache的範圍
-128~127
-
&和&&的區(qū)別
&是按位于;&&是邏輯與痒给;按位與的作用通常作用是對某些位清零或保留某些位说墨。
-
stack,heap和meathod area 的用法
首先明確堆和棧存放的東西是什麼。
- 棧:基本數據類型的變量苍柏,一個對象的引用尼斧,函數調用的現場保存
- 堆:new 或構造器創(chuàng)建的對象,堆是垃圾收集器管理的主要區(qū)域
- 方法區(qū):方法區(qū)和堆都是各個線程共享的內存區(qū)域序仙。用於存儲已經被jvm加載的類信息突颊,常量,靜態(tài)變量登數據潘悼。字面量如"hello",100等是放在常量池中律秃,jdk1.7以前常量池是方法區(qū)的一部分,1.7以後常量池在堆中治唤。
他們的特點是什麼棒动?
棧後進先出,空間小宾添,操作起來速度快船惨,大量的對象存在堆空間,他們的大小可通過jvm的啟動參數來調整缕陕,椓蝗瘢空間用光了,會引發(fā)StackOverflowError扛邑,而堆和常量池空間不足會引發(fā)OutofMemoryError
-
java四捨五入的原理是什麼怜浅?
加0.5然後向下取整。
-
switch可以作用在哪些類型的變量上蔬崩?
java5以前:byte,short,char,int.
java5:引入枚舉類型
java7:引入String類型 -
==和equal的區(qū)別
==看看左右是不是一個東西恶座,equal是看左右是否長的一樣。
若x,y滿足x.equals(y)==true,則他們的hash code 一定相同沥阳,反過來不成立跨琳。
有關==和equals的更詳細總結,可參考這裡 -
java到底是值傳遞還是引用傳遞桐罕?
值傳遞脉让。首先明確值傳遞和引用傳遞的概念:
- 值傳遞:表示方法接收的是調用者提供的值
- 引用傳遞:表示方法接收的是調用者提供的變量地址
方法得到是所有參數值得一個拷貝,方法不能修改任何傳遞給它的參數變量的內容
因此功炮,在java中溅潜,
- 一個方法不能修改一個基本數據類型的參數(針對參數為基本數據類型)
- 一個方法不能讓對象參數引用一個新對象(針對參數為引用類型)
下面的方法解釋為什麼java中不存在引用傳遞。
Employee a = new Employee("tom",20);
Employee b = new Employee("jack",19);
public static void swap(Employee x,Employee y){
Employee temp=x;
x=y;
y=temp;
}
如果是引用傳遞死宣,swap可以實現交換兩個對象值得效果伟恶,然而最終結果是swap并沒有改變存儲在a和b中的對象引用,x和y被初始化位兩個對象引用的拷貝毅该。
-
String博秫、StringBuilder、StringBuffer的區(qū)別
String只讀眶掌。其餘兩種可對字符串進行修改挡育,StringBuilder(1.5引入)和StringBuffer完全相同,區(qū)別在於StringBuilder線程不安全朴爬,效率比StringBuffer高即寒。
-
重載和重寫的區(qū)別
重載發(fā)生在同一個類中,重寫發(fā)生在子類與父類之間,前者是編譯時多態(tài)性母赵,(編譯時就知道要調用哪一個方法)逸爵,後者是運行時多態(tài)性。
-
JVM加載class文件的原理機制
類的裝載有類加載器(ClassLoader)和它的子類實現凹嘲。過程如下:
加載:把.class文件中的數據讀到內存中
??|
??|連接:(驗證师倔、準備、解析)為靜態(tài)變量分配內存周蹭,并設置默認的初始值趋艘,將符號引用替換為直接引用。
??|
??|初始化:
- 如果類存在直接的父類且這個父類還未初始化凶朗,則先初始化父類
- 如果類中存在初始化語句則依次執(zhí)行
-
如何實現對象的克隆
此處列舉深度克隆的方式瓷胧。
public static <T extends Serializable> T clone(T obj) throws Exception(){
//將對象寫入流中
ByteOutputStream bout = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStram(bout);
oos.write(obj);
//從流中讀取對象
ByteInputStream bin = new ByteArrayInputStream(bout.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bin);
return (T)ois.readObject();
}
參考 實現對象克隆的兩種方式
-
常見的異常分類
關於Exception更多詳細信息點擊這裡
-
闡述ArrayList、Vector棚愤、LinkedList的存儲性能和特性
ArrayList和Vector都是使用數組的方式來存儲數據搓萧,查詢速度快,插入數據慢遇八。
Vector的方法有synchronized 修飾矛绘,性能上比ArrayList差。
LinkedList使用雙向鏈錶實現存儲刃永。插入速度快货矮。
Vector,Hashtable,Dictionary,BitSet,Stack,Properties是遺留容器,不推薦使用斯够。
ArrayList和LinkedList都是非線程安全的囚玫,可用Collections中synchronizedList方法變?yōu)榫€程安全的
-
Colledtion和Collections的區(qū)別
Collection是Set,List登容器的父接口;Collections是一個工具類读规,提供靜態(tài)方法來輔助容器操作抓督。
-
TreeMap和TreeSet在排序時如何比較元素?Collections工具類中的sort()方法如何比較元素束亏?
簡單記:
實現Comparable接口铃在,重寫compareTo方法
採用Collections中sort方法,如下
//obj為要排序的對象碍遍,第二個參數為自定義的排序規(guī)則
Collections.sort(obj,new Comparator<Object>(){
public int compare(Object o1,Object o2){
return o1.hashCode()-o2.hashCode();
}
}
-
Thread類的sleep()方法和對象的wait()方法都可以讓線程暫停執(zhí)行定铜,它們有什麼區(qū)別?
它們的共同點是調用此方法會讓當前線程暫停執(zhí)行制定的時間怕敬。
- sleep方法是Thread類的靜態(tài)方法揣炕,但對象鎖依然保持。
- wait()方法是Object類的方法东跪,調用后會放棄當前對象的鎖畸陡,進入對象的等待池鹰溜,只有調用對象的nodify()或notifYAll()才能喚醒等待池中的線程進入等鎖池,如果線程重新獲得對象的鎖就可以進入就緒狀態(tài)丁恭。
-
sleep方法和yield方法有什麼區(qū)別曹动?
- sleep給其它線程運行時會不考慮線程優(yōu)先級,會給底優(yōu)先級線程以運行的機會涩惑,yield只能把機會給相同優(yōu)先級或更高優(yōu)先級的線程
- 線程執(zhí)行sleep后進入阻塞狀態(tài)仁期,執(zhí)行yield方法后進入就緒狀態(tài)
- sleep方法需要拋出InterruptedException
- sleep方法比yield(跟操作系統(tǒng)的cpu有關)具有更好的移植性
-
請說出與線程同步以及線程調度相關的方法
- wait():使一個線程處於阻塞狀態(tài)桑驱,並且釋放對象所持有的鎖竭恬;
- sleep():讓線程進入睡眠狀態(tài)
- notify():喚醒一個處於等待狀態(tài)的線程,但不能確切的喚醒某一個等待的線程熬的,而是有JVM確定
- notifyAll():喚醒所有處於等待狀態(tài)的線程痊硕,該方法並不是將對象的鎖給所有線程,而是讓他們去競爭押框,只有獲得鎖的線程才能進入就緒狀態(tài)岔绸。
-
編寫多線程有幾種實現方法
java5以前有兩種:
- 繼承Thread類
- 實現Runnable接口
兩種方式都需要通過重寫run()方法來定義線程的行為,後者更加靈活
java5以後還可以通過:實現Callable和ExecutorService等來創(chuàng)建(待補充)橡伞。
-
什麼是線程池盒揉?
“池化技術”產生的原因:盡可能的減少對象創(chuàng)建和銷毀的次數,從而減少資源的消耗兑徘。如線程池刚盈,數據庫連接池。
線程池就是事先創(chuàng)建若干個可執(zhí)行的線程放入一個容器中挂脑,需要的時候從池中獲取而不需要自行創(chuàng)建藕漱,使用完放回池中。
線程工具類Executors提供一些靜態(tài)工廠方法崭闲,生成一些常用的線程池肋联。- newSingleThreadExecutor:單線程線程池,該線程池保證所有任務的執(zhí)行順序按照任務的提交順序執(zhí)行刁俭。一個不行了另一個接著上橄仍。
- newFixedThreadPool:創(chuàng)建固定大小的線程池,線程池大小一旦達到最大值就保持不變牍戚。
- newCachedThreadPool:可緩存的線程池侮繁。當線程池大小超過處理任務所需線程數,則回收空閒線程翘魄,若不夠用鼎天,則新建線程來補充 ,最終線程池大小取決於jvm能夠創(chuàng)建的最大線程數
- newScheduledThreadPool:創(chuàng)建一個大小無線的線程池暑竟。該線程池支持定時以及週期性執(zhí)行任務的需求斋射。
-
線程的基本狀態(tài)以及狀態(tài)之間的關係
![](https://coding.net/u/sukianata/p/ImgRepository/git/raw/master/java/Thread.png)
(若圖片加載失敗育勺,訪問https://coding.net/u/sukianata/p/ImgRepository/git/raw/master/java/Thread.png)
說明:Blocked in Object's Wait Pool 對象等待池 Blocked in Object's Lock Pool 等鎖池 Runnable 就緒狀態(tài) Running 運行狀態(tài) Blocked 阻塞狀態(tài)
-
synchronized和java.util.concurrent.locks.Lock的異同
Lock能完成synchronized所實現的所有功能。主要不同點:Lock有比synchronized更精確的線程語義和更好的性能罗岖,而且不強制性的要求一定要獲得鎖涧至。synchronized會自動釋放鎖,而Lock一定要求程序員手工釋放桑包。
java中有幾種類型的流
字節(jié)流和字符流南蓬。字節(jié)流繼承于InputStream,OutputStream,字符流繼承與Reader,Writer。
編程實現文件拷貝哑了,此處列出NIO的形式赘方。
public static void fileCopyNIO(String soure,String target) throws IOException{
try(FileInputStram in =new FileInputStream(source)){
try(FileOutputStream out = new FileOutputStream(target)){
FileChannel inChannel = in.getChannel();
FileChannel outChannel =out.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(4096);
while(inChannel.read(buffer) !=-1){
buffer.flip();
outChannel.write(buffer);
buffer.clear();
}
}
}
}
此處用到了java7的新特性try...with..resource格式。