java小記
1 面向對象的特徵
1 封裝 繼承 多態
封裝:1.將不需要對外提供的內容都隱藏起來;
2.把屬性都隱藏起來,提供公共方法對其訪問;
繼承: 1.父類是具有共同特徵的一些方法或屬性,我們單獨把它拿出來放入一個類;
2.繼承是越子類越具體,越父類越共性;
3.可以實現代碼重用;
多態:父類的引用指向了的子類對象;
方法上的多態:方法重載
2 override與overload
1 override 重寫 父類與子類之間 1 方法名 參數 返回類型一致
2 修飾符權限大於或等於父類:不能小於- 如:如果子類使用private 多態使用時就無法調用到方法
3 異常小於等於父類
2 overload 重載 同類方法之間 1 方法名 一致 ,參數順序或者是類型,個數不一致 ,不能通過返回值不同來實現重載
3 抽象類與接口
1 抽象類可以實現方法,接口不能有實現方法
2 接口可以實現多個,抽象類單繼承
3 抽象類可以有構造方法,接口不能有
4 接口中的變量都是publi static final
共同點:1 它們都不能 new
4 string與stringbuffter StringBuilder
1 String 是 final類,爲了安全 不可變的 ,靜態分配內存,字符串拼接會開闢一塊新的內存
String s="abc"; s="xxx"
2 StringBuffer 可變的 使用同一塊內存,所以字符串相加比String效率較好
3 StringBuffer StringBuilder StringBuilder 線程不安全 效率高
它們3者都是final不可以被繼承
5 說出ArrayList,Vector, LinkedList ,HashMap 和Hashtable,set的區別,講講他們的底層實現
list 元素 有序的可以重複的
set 元素:無序不可重複:使用HashMap的鍵存儲,把hashmap的鍵作爲set的元素所以不可重複
map:鍵值對形式 鍵不能重複
ArrayList Vector :底層都是數組
ArrayList線程不安全 效率高;vector是同步的,線程安全
ArrayList LinkedList:
ArrayList:底層使用數組 LinkedList使用鏈表
數組查詢速度快 增加刪除慢 鏈表反之
HashMap 和Hashtable
1 HashMap線程不安全 效率高
2 HashMap允許使用NULL當做鍵
3 Contains api改變 :hashMap中沒有了此方法 他們都有containsKey() containsValue()
HashMap:底層實現:數組+鏈表,即數組裏的元素是鏈表,key算出它的hashcode作爲數組的下標,鏈表中元素entry(key,value),
因爲hashcode有可能重複,如果hashcode一樣,在對應的下標,再看key是否一致,如果一致就是修改,
如果不一致,就是添加到鏈尾。
根據key拿到你的值get(key)
set :使用HashMap的鍵存儲,把hashmap的鍵作爲set的元素
6 xml的解析方式
dom sax(推式解析) stax(拉式解析)
1 dom document object model 文檔對象模型
2 sax simple api for xml
3 stax Stream API for XML
DOM解析: 將xml以樹結構的方式一次性加載進內存,簡單易用,修改方便,功能強大,但是更佔內存。
不適應於大文件,一般情況下用它即可應付大多數應用。
SAX解析: 基於推模式的事件驅動的方式來解析xml,較少佔用內存,速度比DOM解析更快,適應於大文件。
事件驅動:每讀一個節點觸發的事件:開始節點,結束節點。。。
STAX解析:基於拉模式的事件流的方式來解析xml,在3種解析方式中速度是最快的,可操作性也是最好的。
拉與推區別:
推觸發的事件是固定(事件名固定的),在固定的事件中編寫我們的代碼
拉把觸發的事件轉化成int類型,根據int類型對應的事件自己編寫代碼,控制事件比較靈活
7 說說一下final與static finally finalize
1 final 類 不能被繼承
final 方法 不能被重寫
final 變量 值不能被修改 如果修飾的是引用變量,引用不能改, 引用所指向的對象內容是可以被修改的
2 finally :
try catch finally finally 不管有無異常最後都會執行,有一種情況不執行,在代碼中調用了system.exit(0);
如果try catch中有return 也會先finally 後return
3 finalize:垃圾回收該對象時 要執行的方法 ,類似servlet要死之前調用destroy
4 static : 定義的方法或屬性不用new 直接通過類名使用,只執行一次
1 限制變量的作用域 全局
2 指定變量的存儲域 存儲在靜態區
8 多線程有幾種實現方法,如何同步,有哪些類型的線程
1 繼承thread 2 實現Runnable
區別 1 單繼承 多實現 2 實現Runnable 資源共享(new 一個 就可以傳給thread)
2 如何同步
1 Synchronized
2 wait(等待下一個線程) notify(喚醒一個正在等待同步鎖的線程) notifyAll(喚醒所有)生產者與消費者
這些方法是Object中的方法,也叫線程之間的通訊
3 有精靈線程(守護線程 後臺 比如垃圾回收線程)和用戶線程(普通線程)
應用程序是否退出,只要沒有用戶線程在運行了, 應用程序就退出,但是有精靈線程在運行(垃圾回收機制一直在運行)
精靈線程不具備生命週期,隨着虛擬機的結束而結束;如果想把線程轉爲精靈線程,必須在start之前調用
setDaemon(boolean)方法,一旦線程變爲精靈線程就不能變成用戶線程了
4 用戶線程的生命週期:新建---就緒--運行---(阻塞)---死亡
9 講講線程池和連接池
1 爲什麼要用線程池? 以空間換時間的做法
如果創建和銷燬線程各需要3秒,而使用的時間只有1秒,
即:在創建和銷燬線程上花費的時間和消耗的系統資源要比花在處理實際的用戶請求的時間和資源更多
沒必要每次都創建,這時可以使用線程池 創建幾個線程放入池中,使用時取一個出來執行,執行完後扔回池中,重複利用.
1.減少在創建和銷燬線程上所花的時間以及系統資源的開銷
2.如不使用線程池,有可能造成系統創建大量線程而導致消耗完系統內存以及”過度切換”。
2 那麼如何創建線程池 使用Executors中的方法創建線程池ExecutorService
newFixedThreadPool創建固定大小的線程池
newCachedThreadPool 創建一個可緩存的線程池
newScheduledThreadPool(int corePoolSize) :創建一個給定大小的定期執行的線程池
ExecutorService pool=Executors.newFixedThreadPool(5);
pool.execute(線程);
pool.shutdown
常見的連接池:DBCP,C3P0,PROX001
10 java中有幾種類型的流?請說出一些io類?
方向上劃分 :相對於程序而言,分爲輸入流和輸出流
單位劃分:字節流與字符流
功能劃分:節點流和過濾流(包裝流)
常用的io流:
FileInputStream 文件流
ObjectInputStream 對象流
BuffedInputStream 緩衝流
ByteArrayInputStream(內存流)
PipedInputStream(管道流)
DataInpuStream(讀取八大基本數據類型,網絡中讀數據)
轉換流是適配器模式;過濾流是裝飾器模式
11 JAVA的異常類型,如何進行異常處理,關鍵字:throws,throw,try,catch,finally 分別代表什麼意義
1 異常類型
Throwable 類
/ \
error 類 exception類
/ \
unchecked異常 checked異常(必須捕獲或者拋出)
(運行時異常,系統異常) 編譯時異常,普通異常
運行時異常直接或間接繼承runtimeException
error 導致應用退出 內存溢出 斷電
unchecked異常與 checked異常區別:
checked異常必須捕獲或者拋出,否則編譯通不過
unchecked異常:nullPointerExcption ArrayIndexOutOfExcption ClassCastException
ArithmeticException 算術異常 NoSuchMethodError找不到方法
ArrayStoreException 數組存儲異常
ClassNotFoundException
IOException FileNotFoundException
2 try,catch,finally try 必須要有,catch,finally兩者的組合
3 throws 方法聲明上 throw方法內部拋出異常對象
12 jvm原理
1 .java(源程序)---編譯器---.class字節碼文件----類加載器載入內存----字節碼校驗器(安全檢查)---解釋器(解釋成
操作系統識別的指令)--操作系統--cpu
類加載器;java中有3種類型的類加載器
1 應用程序類AppClassLoader 加載我們應用程序類路徑下的class
2 擴展類加載器 ExtClassLoader 加載jdk下的 jre/lib/ext
3 Bootstrap類加載器 加載jdk下的jre/lib
加載機制是用類的委託機制加載
首先AppClassLoader類加載器---父類---父類,最頂層的父類加載器進行加載,如果找不到class,由子類去加載,原路返回,最後
所有的類加載器都找完了所有的路徑還是找不到類,會拋出ClassNotFoundException
13 java修飾符作用域public,protected,默認的,private
當前類 當前包 子類 其他包
public y y y y
protected y y y n
默認的 y y n n
private y n n n
14 java序列化
Serializable是一個標識性接口,它的作用是
1.在網絡上傳輸對象;
2.保存數據到硬盤;
15 java集合框架的uml圖
Collection
/ | \
List AbstractCollection Set
\ / \ /
abstractList abstractSet
/ | \ / \
ArrayList Vector abstractSquentialList HashSet TreeSet
| |
stack LinkedList
Map Dictionary
/ \ /
AbstractMap HashTable
/ \ |
HashMap TreeMap properties
16 講一下反射
1 反射 就是獲得自身信息的一組類以及api,這組api可以獲取類及其父類的 屬性 或者方法 調用方法等 有關於類的api Class
屬性的api Field 和方法的api Method
2 Filed
getDeclaredFields 本類所有的屬性(包括private修飾的)
getFields 本類以及父類的所有的public屬性
3 Method
getDeclaredMethods:本類的方法
getMethods:本類以及所有父類的方法
//調用類的方法 方法(method).invoke(實例,參數列表); //原來 實例.方法(參數列表)
private static void invokeMethod() {
Class c=Domain.class;
Method methods[]=c.getDeclaredMethods();
Method method=null;
for (int i = 0; i < methods.length; i++) {
if (methods[i].getName().equals("setName")) {
method=methods[i];
}
}
Domain d=(Domain) c.newInstance();
method.invoke(d, "aaa");
System.out.println(d.getName());
}
17 java中如何實現多態
1 父類引用指向子類實例
2 方法的重載
18 排序 冒泡
for(int i=0;i<a.length;i++) {
for(int j=i+1;j<a.length-1;j++) {
if(a[i]<a[j]) {
int temp=a[i]
a[i]=a[j]
a[j]=temp
}
}
}
19 繼承類執行順序結果
類的委託機制
首先AppClassLoader類加載器---父類(ExtClassLoader)---父類(BootStrap),最頂層的父類加載器進行加載,如果
找不到class,由子類去加載,原路返回,最後所有的類加載器都找完了所有的路徑還是找不到類,會拋出ClassNoFoundException
20 局部變量使用前必須初始化
public class Foo{
public static void main(String args[]){
String s;
System.out.println("s="+s);
}
}
what is the result?
21 可變與不可變 傳值與傳引用
傳值:八大基本類型都爲傳值,就是把實參複製一份給形參;
傳引用:把實參的內存地址引用給參數,引用不可變,引用指向的內容是可變的
public class Test{
public static void stringReplace(String text){
text=text.replace('j','l');
}
public static void bufferReplace(StringBuffer text){
text=text.append("c");
}
public static void main(String args[]){
String textString=new String("java");
StringBuffer textBuffer=new StringBuffer("java");
StringReplace(textString);
bufferReplace(textBuffer);
System.out.println(textString+textBuffer);
}
}
what is the output?
java javac
22 得到Class的三種方式是什麼?
類名.class 對象.getClass
Class.forName("Cma.A") 把.class文件讀入內存
23 socket與udp
socket : 三次握手 相當於打電話 安全的
udp: 無狀態的 不安全的 相當於郵寄
socket: 分爲服務端與客戶端
服務端
ServerSocket ServerSocket=new ServerSocket(1099)//在1099端口號啓動服務
Socket socket=ServerSockeet.accept()//對客戶進行監聽,返回一個客戶端的socket
socket.getInputStream
客戶端 Socket socket=new Socket("ip地址",1099);
socket.getOutputStream().write(“輸出信息”)
即:通過io流進行通訊 以輸入流接受信息,以輸出流發送信息
udp :點對點通信,不需要服務器中轉,誰都可以是服務器,也都可以是客戶端
24 java有內存泄露嗎
內存泄露:當一個對象在程序中沒有被使用,但是又無法被垃圾回收站回收,這種現象就稱爲內存泄露,經常發生在
長生命週期的變量引用短生命週期的變量
Object o1=new Object();
Object o2=o1;
o1=null;//
比如棧在彈出元素時,如果我們不在彈出元素的同時從數組刪除該元素就會發生內存泄露;
25 如何讀取一個大文件如4GB文件
1 分段讀取,先處理對進來的數據(比如先讀100m,先入庫),再把這個100m佔用的資源釋放掉,接着往下讀
while ((str = br.readLine()) != null) {
i++;
app=app+str;
if(i %100 ==0){//假設讀取100行
// 這裏你先對這100行操作,然後繼續讀
app=null;
}
}
br.close();
}
2 nio 按照塊的方式讀取 高效率讀取大文件
26 super與this
1 this表示當前對象,也就是當前類對象,super表示當前類的父類
注意點:
1 調用super()必須寫在子類構造方法的第一行,否則編譯不通過。每個子類構造方法的第一條語句,都是隱含地調用
super(),如果父類沒有這種形式的構造函數,那麼在編譯的時候就會報錯。
2)super()和this()類似,區別是,super從子類中調用父類的構造方法,this()在同一類內調用其它構造方法。
3)super()和this()均需放在構造方法內第一行。
4)儘管可以用this調用一個構造器,但卻不能調用兩個。
5)this和super不能同時出現在一個構造函數裏面,因爲this必然會調用其它的構造函數,其它的構造函數必然也會有super語句的存在,
所以在同一個構造函數裏面有相同的語句,就失去了語句的意義,編譯器也不會通過。
6)this()和super()都指的是對象,所以,均不可以在static環境中使用。包括:static變量,static方法,static語句塊。
27 ==與equals
基本數據類型只能用"=="來比較,比較的是值;
引用類型用"=="比較的是內存地址,equals比較的是值
Object 中的equals與 == 一樣的
String重寫了equals方法,比的是內容
StringBuffer沒有重寫equals方法,比的是內存地址
comparable是接口 java.lang 自然排序 compareTo自然比較方法
comparator是接口 java.util 整體排序
自己添加的:
1 內存分配:
1 棧:局部變量,形參,基本數據類型,引用
2 堆:對象,數組,this
3 數據區(常量池):字符串常量,static變量
4 代碼區:代碼
1 封裝 繼承 多態
封裝:1.將不需要對外提供的內容都隱藏起來;
2.把屬性都隱藏起來,提供公共方法對其訪問;
繼承: 1.父類是具有共同特徵的一些方法或屬性,我們單獨把它拿出來放入一個類;
2.繼承是越子類越具體,越父類越共性;
3.可以實現代碼重用;
多態:父類的引用指向了的子類對象;
方法上的多態:方法重載
2 override與overload
1 override 重寫 父類與子類之間 1 方法名 參數 返回類型一致
2 修飾符權限大於或等於父類:不能小於- 如:如果子類使用private 多態使用時就無法調用到方法
3 異常小於等於父類
2 overload 重載 同類方法之間 1 方法名 一致 ,參數順序或者是類型,個數不一致 ,不能通過返回值不同來實現重載
3 抽象類與接口
1 抽象類可以實現方法,接口不能有實現方法
2 接口可以實現多個,抽象類單繼承
3 抽象類可以有構造方法,接口不能有
4 接口中的變量都是publi static final
共同點:1 它們都不能 new
4 string與stringbuffter StringBuilder
1 String 是 final類,爲了安全 不可變的 ,靜態分配內存,字符串拼接會開闢一塊新的內存
String s="abc"; s="xxx"
2 StringBuffer 可變的 使用同一塊內存,所以字符串相加比String效率較好
3 StringBuffer StringBuilder StringBuilder 線程不安全 效率高
它們3者都是final不可以被繼承
5 說出ArrayList,Vector, LinkedList ,HashMap 和Hashtable,set的區別,講講他們的底層實現
list 元素 有序的可以重複的
set 元素:無序不可重複:使用HashMap的鍵存儲,把hashmap的鍵作爲set的元素所以不可重複
map:鍵值對形式 鍵不能重複
ArrayList Vector :底層都是數組
ArrayList線程不安全 效率高;vector是同步的,線程安全
ArrayList LinkedList:
ArrayList:底層使用數組 LinkedList使用鏈表
數組查詢速度快 增加刪除慢 鏈表反之
HashMap 和Hashtable
1 HashMap線程不安全 效率高
2 HashMap允許使用NULL當做鍵
3 Contains api改變 :hashMap中沒有了此方法 他們都有containsKey() containsValue()
HashMap:底層實現:數組+鏈表,即數組裏的元素是鏈表,key算出它的hashcode作爲數組的下標,鏈表中元素entry(key,value),
因爲hashcode有可能重複,如果hashcode一樣,在對應的下標,再看key是否一致,如果一致就是修改,
如果不一致,就是添加到鏈尾。
根據key拿到你的值get(key)
set :使用HashMap的鍵存儲,把hashmap的鍵作爲set的元素
6 xml的解析方式
dom sax(推式解析) stax(拉式解析)
1 dom document object model 文檔對象模型
2 sax simple api for xml
3 stax Stream API for XML
DOM解析: 將xml以樹結構的方式一次性加載進內存,簡單易用,修改方便,功能強大,但是更佔內存。
不適應於大文件,一般情況下用它即可應付大多數應用。
SAX解析: 基於推模式的事件驅動的方式來解析xml,較少佔用內存,速度比DOM解析更快,適應於大文件。
事件驅動:每讀一個節點觸發的事件:開始節點,結束節點。。。
STAX解析:基於拉模式的事件流的方式來解析xml,在3種解析方式中速度是最快的,可操作性也是最好的。
拉與推區別:
推觸發的事件是固定(事件名固定的),在固定的事件中編寫我們的代碼
拉把觸發的事件轉化成int類型,根據int類型對應的事件自己編寫代碼,控制事件比較靈活
7 說說一下final與static finally finalize
1 final 類 不能被繼承
final 方法 不能被重寫
final 變量 值不能被修改 如果修飾的是引用變量,引用不能改, 引用所指向的對象內容是可以被修改的
2 finally :
try catch finally finally 不管有無異常最後都會執行,有一種情況不執行,在代碼中調用了system.exit(0);
如果try catch中有return 也會先finally 後return
3 finalize:垃圾回收該對象時 要執行的方法 ,類似servlet要死之前調用destroy
4 static : 定義的方法或屬性不用new 直接通過類名使用,只執行一次
1 限制變量的作用域 全局
2 指定變量的存儲域 存儲在靜態區
8 多線程有幾種實現方法,如何同步,有哪些類型的線程
1 繼承thread 2 實現Runnable
區別 1 單繼承 多實現 2 實現Runnable 資源共享(new 一個 就可以傳給thread)
2 如何同步
1 Synchronized
2 wait(等待下一個線程) notify(喚醒一個正在等待同步鎖的線程) notifyAll(喚醒所有)生產者與消費者
這些方法是Object中的方法,也叫線程之間的通訊
3 有精靈線程(守護線程 後臺 比如垃圾回收線程)和用戶線程(普通線程)
應用程序是否退出,只要沒有用戶線程在運行了, 應用程序就退出,但是有精靈線程在運行(垃圾回收機制一直在運行)
精靈線程不具備生命週期,隨着虛擬機的結束而結束;如果想把線程轉爲精靈線程,必須在start之前調用
setDaemon(boolean)方法,一旦線程變爲精靈線程就不能變成用戶線程了
4 用戶線程的生命週期:新建---就緒--運行---(阻塞)---死亡
9 講講線程池和連接池
1 爲什麼要用線程池? 以空間換時間的做法
如果創建和銷燬線程各需要3秒,而使用的時間只有1秒,
即:在創建和銷燬線程上花費的時間和消耗的系統資源要比花在處理實際的用戶請求的時間和資源更多
沒必要每次都創建,這時可以使用線程池 創建幾個線程放入池中,使用時取一個出來執行,執行完後扔回池中,重複利用.
1.減少在創建和銷燬線程上所花的時間以及系統資源的開銷
2.如不使用線程池,有可能造成系統創建大量線程而導致消耗完系統內存以及”過度切換”。
2 那麼如何創建線程池 使用Executors中的方法創建線程池ExecutorService
newFixedThreadPool創建固定大小的線程池
newCachedThreadPool 創建一個可緩存的線程池
newScheduledThreadPool(int corePoolSize) :創建一個給定大小的定期執行的線程池
ExecutorService pool=Executors.newFixedThreadPool(5);
pool.execute(線程);
pool.shutdown
常見的連接池:DBCP,C3P0,PROX001
10 java中有幾種類型的流?請說出一些io類?
方向上劃分 :相對於程序而言,分爲輸入流和輸出流
單位劃分:字節流與字符流
功能劃分:節點流和過濾流(包裝流)
常用的io流:
FileInputStream 文件流
ObjectInputStream 對象流
BuffedInputStream 緩衝流
ByteArrayInputStream(內存流)
PipedInputStream(管道流)
DataInpuStream(讀取八大基本數據類型,網絡中讀數據)
轉換流是適配器模式;過濾流是裝飾器模式
11 JAVA的異常類型,如何進行異常處理,關鍵字:throws,throw,try,catch,finally 分別代表什麼意義
1 異常類型
Throwable 類
/ \
error 類 exception類
/ \
unchecked異常 checked異常(必須捕獲或者拋出)
(運行時異常,系統異常) 編譯時異常,普通異常
運行時異常直接或間接繼承runtimeException
error 導致應用退出 內存溢出 斷電
unchecked異常與 checked異常區別:
checked異常必須捕獲或者拋出,否則編譯通不過
unchecked異常:nullPointerExcption ArrayIndexOutOfExcption ClassCastException
ArithmeticException 算術異常 NoSuchMethodError找不到方法
ArrayStoreException 數組存儲異常
ClassNotFoundException
IOException FileNotFoundException
2 try,catch,finally try 必須要有,catch,finally兩者的組合
3 throws 方法聲明上 throw方法內部拋出異常對象
12 jvm原理
1 .java(源程序)---編譯器---.class字節碼文件----類加載器載入內存----字節碼校驗器(安全檢查)---解釋器(解釋成
操作系統識別的指令)--操作系統--cpu
類加載器;java中有3種類型的類加載器
1 應用程序類AppClassLoader 加載我們應用程序類路徑下的class
2 擴展類加載器 ExtClassLoader 加載jdk下的 jre/lib/ext
3 Bootstrap類加載器 加載jdk下的jre/lib
加載機制是用類的委託機制加載
首先AppClassLoader類加載器---父類---父類,最頂層的父類加載器進行加載,如果找不到class,由子類去加載,原路返回,最後
所有的類加載器都找完了所有的路徑還是找不到類,會拋出ClassNotFoundException
13 java修飾符作用域public,protected,默認的,private
當前類 當前包 子類 其他包
public y y y y
protected y y y n
默認的 y y n n
private y n n n
14 java序列化
Serializable是一個標識性接口,它的作用是
1.在網絡上傳輸對象;
2.保存數據到硬盤;
15 java集合框架的uml圖
Collection
/ | \
List AbstractCollection Set
\ / \ /
abstractList abstractSet
/ | \ / \
ArrayList Vector abstractSquentialList HashSet TreeSet
| |
stack LinkedList
Map Dictionary
/ \ /
AbstractMap HashTable
/ \ |
HashMap TreeMap properties
16 講一下反射
1 反射 就是獲得自身信息的一組類以及api,這組api可以獲取類及其父類的 屬性 或者方法 調用方法等 有關於類的api Class
屬性的api Field 和方法的api Method
2 Filed
getDeclaredFields 本類所有的屬性(包括private修飾的)
getFields 本類以及父類的所有的public屬性
3 Method
getDeclaredMethods:本類的方法
getMethods:本類以及所有父類的方法
//調用類的方法 方法(method).invoke(實例,參數列表); //原來 實例.方法(參數列表)
private static void invokeMethod() {
Class c=Domain.class;
Method methods[]=c.getDeclaredMethods();
Method method=null;
for (int i = 0; i < methods.length; i++) {
if (methods[i].getName().equals("setName")) {
method=methods[i];
}
}
Domain d=(Domain) c.newInstance();
method.invoke(d, "aaa");
System.out.println(d.getName());
}
17 java中如何實現多態
1 父類引用指向子類實例
2 方法的重載
18 排序 冒泡
for(int i=0;i<a.length;i++) {
for(int j=i+1;j<a.length-1;j++) {
if(a[i]<a[j]) {
int temp=a[i]
a[i]=a[j]
a[j]=temp
}
}
}
19 繼承類執行順序結果
類的委託機制
首先AppClassLoader類加載器---父類(ExtClassLoader)---父類(BootStrap),最頂層的父類加載器進行加載,如果
找不到class,由子類去加載,原路返回,最後所有的類加載器都找完了所有的路徑還是找不到類,會拋出ClassNoFoundException
20 局部變量使用前必須初始化
public class Foo{
public static void main(String args[]){
String s;
System.out.println("s="+s);
}
}
what is the result?
21 可變與不可變 傳值與傳引用
傳值:八大基本類型都爲傳值,就是把實參複製一份給形參;
傳引用:把實參的內存地址引用給參數,引用不可變,引用指向的內容是可變的
public class Test{
public static void stringReplace(String text){
text=text.replace('j','l');
}
public static void bufferReplace(StringBuffer text){
text=text.append("c");
}
public static void main(String args[]){
String textString=new String("java");
StringBuffer textBuffer=new StringBuffer("java");
StringReplace(textString);
bufferReplace(textBuffer);
System.out.println(textString+textBuffer);
}
}
what is the output?
java javac
22 得到Class的三種方式是什麼?
類名.class 對象.getClass
Class.forName("Cma.A") 把.class文件讀入內存
23 socket與udp
socket : 三次握手 相當於打電話 安全的
udp: 無狀態的 不安全的 相當於郵寄
socket: 分爲服務端與客戶端
服務端
ServerSocket ServerSocket=new ServerSocket(1099)//在1099端口號啓動服務
Socket socket=ServerSockeet.accept()//對客戶進行監聽,返回一個客戶端的socket
socket.getInputStream
客戶端 Socket socket=new Socket("ip地址",1099);
socket.getOutputStream().write(“輸出信息”)
即:通過io流進行通訊 以輸入流接受信息,以輸出流發送信息
udp :點對點通信,不需要服務器中轉,誰都可以是服務器,也都可以是客戶端
24 java有內存泄露嗎
內存泄露:當一個對象在程序中沒有被使用,但是又無法被垃圾回收站回收,這種現象就稱爲內存泄露,經常發生在
長生命週期的變量引用短生命週期的變量
Object o1=new Object();
Object o2=o1;
o1=null;//
比如棧在彈出元素時,如果我們不在彈出元素的同時從數組刪除該元素就會發生內存泄露;
25 如何讀取一個大文件如4GB文件
1 分段讀取,先處理對進來的數據(比如先讀100m,先入庫),再把這個100m佔用的資源釋放掉,接着往下讀
while ((str = br.readLine()) != null) {
i++;
app=app+str;
if(i %100 ==0){//假設讀取100行
// 這裏你先對這100行操作,然後繼續讀
app=null;
}
}
br.close();
}
2 nio 按照塊的方式讀取 高效率讀取大文件
26 super與this
1 this表示當前對象,也就是當前類對象,super表示當前類的父類
注意點:
1 調用super()必須寫在子類構造方法的第一行,否則編譯不通過。每個子類構造方法的第一條語句,都是隱含地調用
super(),如果父類沒有這種形式的構造函數,那麼在編譯的時候就會報錯。
2)super()和this()類似,區別是,super從子類中調用父類的構造方法,this()在同一類內調用其它構造方法。
3)super()和this()均需放在構造方法內第一行。
4)儘管可以用this調用一個構造器,但卻不能調用兩個。
5)this和super不能同時出現在一個構造函數裏面,因爲this必然會調用其它的構造函數,其它的構造函數必然也會有super語句的存在,
所以在同一個構造函數裏面有相同的語句,就失去了語句的意義,編譯器也不會通過。
6)this()和super()都指的是對象,所以,均不可以在static環境中使用。包括:static變量,static方法,static語句塊。
27 ==與equals
基本數據類型只能用"=="來比較,比較的是值;
引用類型用"=="比較的是內存地址,equals比較的是值
Object 中的equals與 == 一樣的
String重寫了equals方法,比的是內容
StringBuffer沒有重寫equals方法,比的是內存地址
comparable是接口 java.lang 自然排序 compareTo自然比較方法
comparator是接口 java.util 整體排序
自己添加的:
1 內存分配:
1 棧:局部變量,形參,基本數據類型,引用
2 堆:對象,數組,this
3 數據區(常量池):字符串常量,static變量
4 代碼區:代碼
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.