阿里一面準備工作

1.java中所有類的父類是什麼?他都有什麼方法?
是object。
clone()創建並返回此對象的一個副本。
boolean equals(Object obj)指示其他某個對象是否與此對象“相等”。
protected void finalize()當垃圾回收器確定不存在對該對象的更多引用時,由對象的垃圾回收器調用此方法。

Class<?> getClass()

返回此 Object 的運行時類。
int hashCode()返回該對象的哈希碼值。
void notify()喚醒在此對象監視器上等待的單個線程。
void notifyAll()喚醒在此對象監視器上等待的所有線程。
String toString()返回該對象的字符串表示。
void wait()在其他線程調用此對象的 notify() 方法或 notifyAll() 方法前,導致當前線程等待。
void wait(long timeout)在其他線程調用此對象的 notify() 方法或 notifyAll() 方法,或者超過指定的時間量前,導致當前線程等待。
void wait(long timeout, int nanos)在其他線程調用此對象的 notify() 方法或 notifyAll() 方法,或者其他某個線程中斷當前線程,或者已超過某個實際時間量前,導致當前線程等待。
2.java中IO包下面的inputstream運用了什麼設計模式?請簡述你知道的設計模式?
適配器和裝飾者模式。
適配器模式:例如 InputStreamReader和OutputStreamWriter做了 InputStream/OutputStream字節流類到Reader/Writer之間的轉換。
裝飾者模式(無處不在):例如 BufferedInputStream bis = new BufferedInputStream(new FileInputStream());
工廠模式和單例模式
工廠模式 。是用工廠方法代替new操作的一種模式。比如有一個統一接口 A ,這個A接口是一個標準 。如果有類 B 和 C 那麼 BC必須實現A接口 。我們在以往的 方法生成這種對象的時候 A b=new B() ; A c=new C() ;這樣的方式來的 .但是如果不同的類需要不同的初始化的時候我們如果全部放在構造方法完成那麼就嚴重破壞了 面向對象的概念。我們想要的就是一個工廠 Factory ,也就是一個代理 我們通過它的唯一接口來 產生不同類型的產品 。
單例模式:
單例模式是一種常用的軟件設計模式。在它的核心結構中只包含一個被稱爲單例的特殊類。通過單例模式可以保證系統中一個類只有一個實例而且該實例易於外界訪問,從而方便對實例個數的控制並節約系統資源。
3.ArrayList跟LinkedList的區別詳細說出?
arraylist類似數組,linkedlist類似鏈表,數組的優勢是讀取訪問時可以根據索引直接找到,所以在讀取的時候相比linkedlist快,但是刪除需要逐個移動,而linkedlist再刪除的時候只需要修改下指針然後釋放掉要刪除的內容就可以了,所以一般用arrayList用作讀取比較多的時候,而linkedList用在刪除比較多的時候。
4.session和cookie的區別?
《1、cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。
《2、cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙
考慮到安全應當使用session。
《3、session會在一定時間內保存在服務器上。當訪問增多,會比較佔用你服務器的性能
考慮到減輕服務器性能方面,應當使用COOKIE。
《4、單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie。

cookie 和session 的聯繫:
《1.session是通過cookie來工作的
《2.session和cookie之間是通過COOKIE[PHPSESSID] _COOKIE[‘PHPSESSID’]可以知道session的id,從而獲取到其他的信息。在購物網站中通常將用戶加入購物車的商品聯通session_id記錄到數據庫中,當用戶再次訪問是,通過sessionid就可以查找到用戶上次加入購物車的商品。因爲sessionid是唯一的,記錄到數據庫中就可以根據這個查找了。
5.說一下快速排序的原理?
快速排序是對冒泡排序的一種改進。它的基本思想是:通過一躺排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按次方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。
5.簡述AOP,及其作用?
aop是面向切面的編程。 它可以通過預編譯方式和運行期動態代理實現在不修改源代碼的情況下給程序動態統一添加功能的一種技術。
6.簡述下多線程?
多線程(英語:multithreading),是指從軟件或者硬件上實現多個線程併發執行的技術。ava NIO和IO之間第一個最大的區別是,IO是面向流的,NIO是面向緩衝區的。 Java IO面向流意味着每次從流中讀一個或多個字節,直至讀取所有字節,它們沒有被緩存在任何地方。此外,它不能前後移動流中的數據。如果需要前後移動從流中讀取的數據,需要先將它緩存到一個緩衝區。 Java NIO的緩衝導向方法略有不同。數據讀取到一個它稍後處理的緩衝區,需要時可在緩衝區中前後移動。這就增加了處理過程中的靈活性。但是,還需要檢查是否該緩衝區中包含所有您需要處理的數據。而且,需確保當更多的數據讀入緩衝區時,不要覆蓋緩衝區裏尚未處理的數據。
7.java有些類中爲什麼需要實現Serializable接口?
一個對象序列化的接口,一個類只有實現了Serializable接口,它的對象才能被序列化
什麼是序列化?
將對象的狀態信息轉換爲可以存儲或傳輸的形式的過程,在序列化期間,對象將其當前狀態寫入到臨時存儲區或持久性存儲區,之後,便可以通過從存儲區中讀取或反序列化對象的狀態信息,來重新創建該對象
什麼情況下需要序列化?
當我們需要把對象的狀態信息通過網絡進行傳輸,或者需要將對象的狀態信息持久化,以便將來使用時都需要把對象進行序列化
8.hashmap,hashtable的區別?以及如何使用,以及他的一些方法?
HashMap是Hashtable的輕量級實現(非線程安全的實現),他們都完成了Map接口,主要區別在於HashMap允許空(null)鍵值(key),由於非線程安全,效率上可能高於Hashtable。
9.設計題,利用hashmap對蘋果的重量進行排序?

Map<String, Integer> map = new HashMap<String, Integer>();
map.put("d", 2);
map.put("c", 1);
map.put("b", 1);
map.put("a", 3);

List<Map.Entry<String, Integer>> infoIds =
    new ArrayList<Map.Entry<String, Integer>>(map.entrySet());
//排序前
for (int i = 0; i < infoIds.size(); i++) {
    String id = infoIds.get(i).toString();
    System.out.println(id);
}
//d 2
//c 1
//b 1
//a 3
//排序
Collections.sort(infoIds, new Comparator<Map.Entry<String, Integer>>() {   
    public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {      
        //return (o2.getValue() - o1.getValue()); 
        return (o1.getKey()).toString().compareTo(o2.getKey());
    }
}); 
//排序後
for (int i = 0; i < infoIds.size(); i++) {
    String id = infoIds.get(i).toString();
    System.out.println(id);
}

10.異常的相關問題?error和exception具體?
首先從繼承方面來說,Error和Exception都是Throwable的子類。所以從根本上你可以理解他們是差不多的,程序出了問題就拋出。然後一般意義來講,區別就是Error比Exception更嚴重,不易通過後續代碼處理和修復,不應該被代碼catch到的錯誤。而Exception是指嚴重程度較輕的程序問題,相較於Error更容易被後續代碼處理和修復的,有些需要通過try catch代碼處理,有些不建議通過try catch代碼處理。
11.問了一些關於collections的方法?
1、java.util.Collection 是一個集合接口。它提供了對集合對象進行基本操作的通用接口方法。Collection接口在Java 類庫中有很多具體的實現。Collection接口的意義是爲各種具體的集合提供了最大化的統一操作方式。
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
2、java.util.Collections 是一個包裝類。它包含有各種有關集合操作的靜態多態方法。此類不能實例化,就像一個工具類,服務於Java的Collection框架。
Java代碼 收藏代碼
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class TestCollections {
public static void main(String args[]) {
//注意List是實現Collection接口的
List list = new ArrayList();
double array[] = { 112, 111, 23, 456, 231 };
for (int i = 0; i < array.length; i++) {
list.add(new Double(array[i]));
}
Collections.sort(list);
for (int i = 0; i < array.length; i++) {
System.out.println(list.get(i));
}
// 結果:23.0 111.0 112.0 231.0 456.0
}
}
12.set和list的區別,一些個實現類,繼承關係等等?
《1、List,Set都是繼承自Collection接口
《2、List特點:元素有放入順序,元素可重複 ,Set特點:元素無放入順序,元素不可重複(注意:元素雖然無放入順序,但是元素在set中的位置是有該元素的HashCode決定的,其位置其實是固定的)
《3、List接口有三個實現類:LinkedList,ArrayList,Vector ,Set接口有兩個實現類:HashSet(底層由HashMap實現),LinkedHashSet
13.JVM內存heap and stack
<1.heap是堆,stack是棧。
<2.stack的空間由操作系統自動分配和釋放,heap的空間是手動申請和釋放的,heap常用new關鍵字來分配。
<3.stack空間有限,heap的空間是很大的自由區。
在Java中,若只是聲明一個對象,則先在棧內存中爲其分配地址空間,若再new一下,實例化它,則在堆內存中爲其分配地址。
舉例:
數據類型 變量名;這樣定義的東西在棧區。
如:Object a =null; 只在棧內存中分配空間
new 數據類型();或者malloc(長度); 這樣定義的東西就在堆區
如:Object b =new Object(); 則在堆內存中分配空間
14.HTTP報文包含內容?
1、請求報文介紹一個HTTP請求報文由請求行(request
line)、請求頭部(header)、空行和請求數據4個部分組成,下圖給出了請求報文的一般格式。
(1)請求行
請求行由請求方法字段、URL字段和HTTP協議版本字段3個字段組成,它們用空格分隔。例如,GET /index.html
HTTP/1.1。
HTTP協議的請求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。這裏介紹最常用的GET方法和POST方法。
GET:當客戶端要從服務器中讀取文檔時,使用GET方法。GET方法要求服務器將URL定位的資源放在響應報文的數據部分,回送給客戶端。使用GET方法時,請求參數和對應的值附加在URL後面,利用一個問號(“?”)代表URL的結尾與請求參數的開始,傳遞參數長度受限制。例如,/index.jsp?id=100&op=bind。
POST:當客戶端給服務器提供信息較多時可以使用POST方法。POST方法將請求參數封裝在HTTP請求數據中,以名稱/值的形式出現,可以傳輸大量數據。

(2)請求頭部

請求頭部由關鍵字/值對組成,每行一對,關鍵字和值用英文冒號“:”分隔。請求頭部通知服務器有關於客戶端請求的信息,典型的請求頭有:

User-Agent:產生請求的瀏覽器類型。

Accept:客戶端可識別的內容類型列表。

Host:請求的主機名,允許多個域名同處一個IP地址,即虛擬主機。

(3)空行

最後一個請求頭之後是一個空行,發送回車符和換行符,通知服務器以下不再有請求頭。

(4)請求數據

請求數據不在GET方法中使用,而是在POST方法中使用。POST方法適用於需要客戶填寫表單的場合。與請求數據相關的最常使用的請求頭是Content-Type和Content-Length。

2、詳解

HTTP請求由三部分組成,分別是:請求行、消息報頭、請求正文。

請求行以一個方法符號開頭,以空格分開,後面跟着請求的URI和協議的版本,格式如下:

Method Request-URI HTTP-Version CRLF。

其中 Method表示請求方法;Request-URI是一個統一資源標識符;HTTP-Version表示請求的HTTP協議版本;CRLF表示回車和換行(除了作爲結尾的CRLF外,不允許出現單獨的CR或LF字符)。

請求方法(所有方法全爲大寫)有多種,各個方法的解釋如下。

GET:請求獲取Request-URI所標識的資源。

POST:在Request-URI所標識的資源後附加新的數據。

HEAD:請求獲取由Request-URI所標識的資源的響應消息報頭。

PUT:請求服務器存儲一個資源,並用Request-URI作爲其標識。

Delete:請求服務器刪除Request-URI所標識的資源。

TRACE:請求服務器回送收到的請求信息,主要用於測試或診斷。

CONNECT:保留將來使用。

OPTIONS:請求查詢服務器的性能,或者查詢與資源相關的選項和需求。

方法名稱是區分大小寫的。當某個請求所針對的資源不支持對應的請求方法的時候,服務器應當返回狀態碼405(Method Not Allowed);當服務器不認識或者不支持對應的請求方法的時候,應當返回狀態碼501(Not Implemented)。HTTP服務器至少應該實現GET和HEAD方法,其他方法都是可選的。當然,所有的方法支持的實現都應當符合下述方法各自的語義定義。此外,除了上述方法,特定的HTTP服務器還能夠擴展自定義的方法。

3、 HTTP響應報文

HTTP響應也由三個部分組成,分別是:狀態行、消息報頭、響應正文。

狀態行格式如下:

HTTP-Version Status-Code Reason-Phrase CRLF

其中,HTTP-Version表示服務器HTTP協議的版本;Status-Code表示服務器發回的響應狀態代碼;Reason-Phrase表示狀態代碼的文本描述。狀態代碼由三位數字組成,第一個數字定義了響應的類別,且有五種可能取值。

1xx:指示信息–表示請求已接收,繼續處理。

2xx:成功–表示請求已被成功接收、理解、接受。

3xx:重定向–要完成請求必須進行更進一步的操作。

4xx:客戶端錯誤–請求有語法錯誤或請求無法實現。

5xx:服務器端錯誤–服務器未能實現合法的請求。

常見狀態代碼、狀態描述的說明如下。

200 OK:客戶端請求成功。

400 Bad Request:客戶端請求有語法錯誤,不能被服務器所理解。

401 Unauthorized:請求未經授權,這個狀態代碼必須和WWW-Authenticate報頭域一起使用。

403 Forbidden:服務器收到請求,但是拒絕提供服務。

404 Not Found:請求資源不存在,舉個例子:輸入了錯誤的URL。

500 Internal Server Error:服務器發生不可預期的錯誤。

503 Server Unavailable:服務器當前不能處理客戶端的請求,一段時間後可能恢復正常,舉個例子:HTTP/1.1 200
OK(CRLF)。
29.TCP/IP三次握手?
第一次握手:建立連接時,客戶端發送syn包(syn=j)到服務器,並進入SYN_SEND狀態,等待服務器確認;
第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;
第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。
完成三次握手,客戶端與服務器開始傳送數據,在上述過程中,還有一些重要的概念:
未連接隊列:在三次握手協議中,服務器維護一個未連接隊列,該隊列爲每個客戶端的SYN包(syn=j)開設一個條目,該條目表明服務器已收到SYN包,並向客戶發出確認,正在等待客戶的確認包。這些條目所標識的連接在服務器處於Syn_RECV狀態,當服務器收到客戶的確認包時,刪除該條目,服務器進入ESTABLISHED狀態。
Backlog參數:表示未連接隊列的最大容納數目。
SYN-ACK 重傳次數 服務器發送完SYN-ACK包,如果未收到客戶確認包,服務器進行首次重傳,等待一段時間仍未收到客戶確認包,進行第二次重傳,如果重傳次數超過系統規定的最大重傳次數,系統將該連接信息從半連接隊列中刪除。注意,每次重傳等待的時間不一定相同。
半連接存活時間:是指半連接隊列的條目存活的最長時間,也即服務從收到SYN包到確認這個報文無效的最長時間,該時間值是所有重傳請求包的最長等待時間總和。有時我們也稱半連接存活時間爲Timeout時間、SYN_RECV存活時間。
30.垃圾回收?
垃圾回收能自動釋放內存空間,減輕編程的負擔。這使Java 虛擬機具有一些優點。首先,它能使編程效率提高。在沒有垃圾回收機制的時候,可能要花許多時間來解決一個難懂的存儲器問題。在用Java語言編程的時候,靠垃圾回收機制可大大縮短時間。其次是它保護程序的完整性, 垃圾回收是Java語言安全性策略的一個重要部份。
Java語言規範沒有明確地說明JVM使用哪種垃圾回收算法,但是任何一種垃圾回收算法一般要做2件基本的事情:
(1)發現無用信息對象;(2)回收被無用對象佔用的內存空間,使該空間可被程序再次使用。
 2.1. 引用計數法(Reference Counting Collector)
  引用計數法是唯一沒有使用根集的垃圾回收的法,該算法使用引用計數器來區分存活對象和不再使用的對象。一般來說,堆中的每個對象對應一個引用計數器。當每一次創建一個對象並賦給一個變量時,引用計數器置爲1。當對象被賦給任意變量時,引用計數器每次加1當對象出了作用域後(該對象丟棄不再使用),引用計數器減1,一旦引用計數器爲0,對象就滿足了垃圾收集的條件。
  2.2. tracing算法(Tracing Collector)
  tracing算法是爲了解決引用計數法的問題而提出,它使用了根集的概念。基於tracing算法的垃圾收集器從根集開始掃描,識別出哪些對象可達,哪些對象不可達,並用某種方式標記可達對象,例如對每個可達對象設置一個或多個位。在掃描識別過程中,基於tracing算法的垃圾收集也稱爲標記和清除(mark-and-sweep)垃圾收集器.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章