日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

各种面试题(二)

發布時間:2023/12/3 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 各种面试题(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載自??各種面試題(二)

1、面向對象的特征有哪些方面?

封裝:通常認為封裝是把數據和操作數據的方法綁定起來,對數據的訪問只能通過已定義的接口。

多態性:多態性是指允許不同子類型的對象對同一消息作出不同的響應。簡單的說就是用同樣的對象引用調用同樣的方法但是做了不同的事情。多態性分為編譯時的多態性和運行時的多態性。方法重載(overload)實現的是編譯時的多態性(也稱為前綁定),而方法重寫(override)實現的是運行時的多態性(也稱為后綁定)。

?

2、訪問修飾符public,private,protected,以及不寫(默認)時的區別?

作用域????當前類??同包?子類?其他

public????????√????????√???????√??????√

protected??√????????√???????√??????×

default???????√???????√???????×??????×

private???????√????????×??????×??????×

類的成員不寫訪問修飾時默認為default。默認對于同一個包中的其他類相當于公開 (public),對于不是同一個包中的其他類相當于私有(private)。受保護 (protected)對子類相當于公開,對不是同一包中的沒有父子關系的類相當于私有。

3、構造器(constructor)是否可被重寫(override?

答:構造器不能被繼承,因此不能被重寫,但可以被重載。

4、兩個對象值相同(x.equals(y)?==?true),但卻可有不同的hash?code,這句話對不對?

答:不對,如果兩個對象xy滿足x.equals(y)?==?true,它們的哈希碼(hash?code)應當相同。Java對于eqauls方法和hashCode方法是這樣規定的:(1)如果兩個對象相同(equals方法返回true),那么它們的hashCode值一定要相同;(2)如果兩個對象的hashCode相同,它們并不一定相同。

5、抽象類(abstract?class)和接口(interface)有什么異同?

答:抽象類和接口都不能夠實例化,但可以定義抽象類和接口類型的引用。一個類如果繼承了某個抽象類或者實現了某個接口都需要對其中的抽象方法全部進?行實現,否則該類仍然需要被聲明為抽象類。接口比抽象類更加抽象,因為抽象類中可以定義構造器,可以有抽象方法和具體方法,而接口中不能定義構造器而且其?中的方法全部都是抽象方法。抽象類中的成員可以是private、默認、protectedpublic的,而接口中的成員全都是public的。抽象?類中可以定義成員變量,而接口中定義的成員變量實際上都是常量。有抽象方法的類必須被聲明為抽象類,而抽象類未必要有抽象方法。抽象類和接口中都可以包含靜態成員變量。

6、抽象的(abstract)方法是否可同時是靜態的(static,是否可同時是本地方法(native),是否可同時被synchronized修飾?

答:都不能。抽象方法需要子類重寫,而靜態的方法是無法被重寫的,因此二者是矛盾的。本地方法是由本地代碼(如C代碼)實現的方法,而抽象方法是沒有實現的,也是矛盾的。synchronized和方法的實現細節有關,抽象方法不涉及實現細節,因此也是相互矛盾的。

7、接口是否可繼承(extends)接口??抽象類是否可實現(implements)接口??抽象類是否可繼承具體類(concrete?class?

答:接口可以繼承接口。抽象類可以實現(implements)接口,抽象類可繼承具體類,但前提是具體類必須有明確的構造函數。

8Anonymous?Inner?Class(匿名內部類)是否可以繼承其它類?是否可以實現接口?

答:可以繼承其他類或實現其他接口,在Swing編程中常用此方式來實現事件監聽和回調。

9、數據類型之間的轉換:

1)如何將字符串轉換為基本數據類型?

2)如何將基本數據類型轉換為字符串?

1)調用基本數據類型對應的包裝類中的方法parseXXX(String)valueOf(String)即可返回相應基本類型;?Integer.parseInt(a)???Integer.valueOf(a)

2)一種方法是將基本數據類型與空字符串(””)連接(+)即可獲得其所對應的字符串;另一種方法是調用String?類中的valueOf(…)方法返回相應字符串?String.valueOf(int)???Integer.toString?

10、如何實現字符串的反轉及替換??

答:方法很多,可以自己寫實現也可以使用StringStringBuffer?/?StringBuilder中的方法。有一道很常見的面試題是用遞歸實現字符串反轉,代碼如下所示:

[java]?view plain?copy

?1.public?static?String?reverse(String?originStr)?{????

  • ?2.????????if(originStr?==?null?||?originStr.length()?<=?1)?????
  • ?3.????????????return?originStr;????
  • ?4.????????return?reverse(originStr.substring(1))?+?originStr.charAt(0);????
  • ?5.????}????
  • ?

    11、列出一些你常見的運行時異常??

    答:

    ArithmeticException(算術異常)

    ClassCastException?(類轉換異常)

    IllegalArgumentException?(非法參數異常)

    IndexOutOfBoundsException?(下表越界異常)

    NullPointerException?(空指針異常)

    SecurityException?(安全異常)

    12ListMapSet三個接口存取元素時,各有什么特點??

    答:List以特定索引來存取元素,可以有重復元素。Set不能存放重復元素(用對象的equals()方法來區分元素是否重復)。Map保存鍵值對?key-value?pair)映射,映射關系可以是一對一或多對一。SetMap容器都有基于哈希存儲和排序樹的兩種實現版本,基于哈希存儲的版本理論存取時間復雜度為?O(1),而基于排序樹版本的實現在插入或刪除元素時會按照元素或元素的鍵(key)構成排序樹從而達到排序和去重的效果。

    13、什么是進程,什么是線程?為什么需要多線程編程?

    進程是具有一定獨立功能的程序關于某個數據集合上的一次運行活動,是操作系統進行資源分配和調度的一個獨立單位;

    線程是進程的一個實體,是CPU調度和分?派的基本單位,是比進程更小的能獨立運行的基本單位。

    線程的劃分尺度小于進程,這使得多線程程序的并發性高;進程在執行時通常擁有獨立的內存單元,而線程之間可以共享內存。使用多線程的編程通常能夠帶來更好的性能和用戶體驗,但是多線程的程序對于其他程序是不友好的,因為它占用了更多的CPU資源。

    14.闡述JDBC操作數據庫的步驟?

    答:下面的代碼以連接本機的Oracle數據庫為例,演示JDBC操作數據庫的步驟。

    1.?加載驅動。

    [java]?view plain?copy

    ?Class.forName("oracle.jdbc.driver.OracleDriver");??

    ?

    2.?創建連接。

    [java]?view plain?copy

    ?Connection?con?=?DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl",?"scott",?"tiger");??

    ?

    3.?創建語句。?

    [java]?view plain?copy

    ?PreparedStatement?ps?=?con.prepareStatement("select?*?from?emp?where?sal?between???and??");?????

    ??ps.setInt(1,?1000);????

    ??ps.setInt(2,?3000);??

    4.?執行語句。

    [java]?view plain?copy

    ?ResultSet?rs?=?ps.executeQuery();??

    ?

    5.?處理結果。

    [java]?view plain?copy

    ?while(rs.next())?{?????

    ?????System.out.println(rs.getInt("empno")?+?"?-?"?+?rs.getString("ename"));????}??

    6.?關閉資源。

    [java]?view plain?copy

    ?finally?{??????

    ?????if(con?!=?null)?{????????

    ???????try?{???????????????

    ????con.close();????????????

    ???}?catch?(SQLException?e)?{????????????????e.printStackTrace();????????????

    ???}????????

    ???}?????

    ??}??

    15.StatementPreparedStatement有什么區別?哪個性能更好??

    Statement相比

    ①PreparedStatement接口代表預編譯的語句,它主要的優勢在于可以減少SQL的編譯錯誤并增加SQL的安全性(減少SQL注射攻擊的可能性)

    ②PreparedStatement中的SQL語句是可以帶參數的,避免了用字符串連接拼接SQL語句的麻煩和不安全;

    當批量處理SQL或頻繁執行相同的查詢時,PreparedStatement有明顯的性能上的優勢,由于數據庫可以將編譯優化后的SQL語句緩存起來,下次執行相同結構的語句時就會很快(不用再次編譯和生成執行計劃)。

    16、在進行數據庫編程時,連接池有什么作用??

    ????由于創建連接和釋放連接都有很大的開銷(尤其是數據庫服務器不在本地時,每次建立連接都需要進行TCP的三次握手,釋放連接需要進行TCP四次握手,造成的開銷是不可忽視的),為了提升系統訪問數據庫的性能,可以事先創建若干連接置于連接池中,需要時直接從連接池獲取,使用結束時歸還連接池而不必關閉連接,從而避免頻繁創建和釋放連接所造成的開銷,這是典型的用空間換取時間的策略(浪費了空間存儲連接,但節省了創建和釋放連接的時間)。池化技術在Java開發中是很常見的,在使用線程時創建線程池的道理與此相同。

    17Java中是如何支持正則表達式操作的??

    答:Java中的String類提供了支持正則表達式操作的方法,包括:matches()replaceAll()replaceFirst()split()。此外,Java中可以用Pattern類表示正則表達式對象,它提供了豐富的API進行各種正則表達式操作,請參考下面面試題的代碼。

    面試題:?-?如果要從字符串中截取第一個英文左括號之前的字符串,例如:北京市(朝陽區)(西城區)(海淀區),截取結果為:北京市,那么正則表達式怎么寫?

    [java]?view plain?copy

    ?import?java.util.regex.Matcher;??

    ?import?java.util.regex.Pattern;??

    ?class?RegExpTest?{?????

    ??public?static?void?main(String[]?args){??

    ?String?str?=?"北京市(朝陽區)(西城區)(海淀區)";???????

    ????Pattern?p?=?Pattern.compile(".*?(?=\\()");????????

    ???Matcher?m?=?p.matcher(str);????????

    ???if(m.find())?{??????????

    ?????System.out.println(m.group());????????}????

    ???}??

    ?}??

    18、獲得一個類的類對象有哪些方式??

    答:?

    -?方法1:類型.class,例如:String.class?

    -?方法2:對象.getClass(),例如:"hello".getClass()?

    -?方法3Class.forName(),例如:Class.forName("java.lang.String")

    19、如何通過反射創建對象??

    答:?

    -?方法1:通過類對象調用newInstance()方法,例如:String.class.newInstance()?

    -?方法2:通過類對象的getConstructor()getDeclaredConstructor()方法獲得構造器(Constructor)對象并調用其newInstance()方法創建對象,例如:String.class.getConstructor(String.class).newInstance("Hello");

    20、如何通過反射調用對象的方法??

    答:請看下面的代碼:

    [java]?view plain?copy

    ?import?java.lang.reflect.Method;??

    ?class?MethodInvokeTest?{?????

    ??public?static?void?main(String[]?args)?throws?Exception?{??????

    ?????String?str?=?"hello";?????????

    ??Method?m?=?str.getClass().getMethod("toUpperCase");???????

    ????System.out.println(m.invoke(str));??

    ???//?HELLO?????

    ??}??

    ?}??

    21、簡述一下面向對象的"六原則一法則"?

    答:?

    1)單一職責原則:一個類只做它該做的事情。(單一職責原則想表達的就是"高內聚",寫代碼最終極的原則只有六個字"高內聚、低耦合"

    2)開閉原則:軟件實體應當對擴展開放,對修改關閉。(在理想的狀態下,當我們需要為一個軟件系統增加新功能時,只需要從原來的系統派生出一些新類就可以,不需要修改原來的任何一行代碼。要做到開閉有兩個要點:抽象是關鍵,一個系統中如果沒有抽象類或接口系統就沒有擴展點;封裝可變性,將系統中的各種可變因素封裝到一個繼承結構中,如果多個可變因素混雜在一起,系統將變得復雜而換亂)?

    3)依賴倒轉原則:面向接口編程。(該原則說得直白和具體一些就是聲明方法的參數類型、方法的返回類型、變量的引用類型時,盡可能使用抽象類型而不用具體類型,因為抽象類型可以被它的任何一個子類型所替代)?

    4)里氏替換原則:任何時候都可以用子類型替換掉父類型。(子類一定是增加父類的能力而不是減少父類的能力,因為子類比父類的能力更多,把能力多的對象當成能力少的對象來用當然沒有任何問題。)?

    5)接口隔離原則:接口要小而專,絕不能大而全。(臃腫的接口是對接口的污染,既然接口表示能力,那么一個接口只應該描述一種能力,接口也應該是高度內聚的。Java中的接口代表能力、代表約定、代表角色,能否正確的使用接口一定是編程水平高低的重要標識。)?

    6)合成聚合復用原則:優先使用聚合或合成關系復用代碼。(通過繼承來復用代碼是面向對象程序設計中被濫用得最多的東西,記住:任何時候都不要繼承工具類,工具是可以擁有并可以使用的,而不是拿來繼承的。)?

    迪米特法則:迪米特法則又叫最少知識原則,一個對象應當對其他對象有盡可能少的了解。(迪米特法則簡單的說就是如何做到"低耦合",門面模式和調停者模式就是對迪米特法則的踐行。Java?Web開發中作為前端控制器的ServletFilter不就是一個門面嗎,瀏覽器對服務器的運作方式一無所知,但是通過前端控制器就能夠根據你的請求得到相應的服務。調停者模式也可以舉一個簡單的例子來說明,例如一臺計算機,CPU、內存、硬盤、顯卡、聲卡各種設備需要相互配合才能很好的工作。迪米特法則用通俗的話來將就是不要和陌生人打交道,如果真的需要,找一個自己的朋友,讓他替你和陌生人打交道。)

    22.簡述一下你了解的設計模式

    -工廠模式:工廠類可以根據條件生成不同的子類實例,這些子類有一個公共的抽象父類并且實現了相同的方法,但是這些方法針對不同的數據進行了不同的操作(多態方法)。當得到子類的實例后,開發人員可以調用基類中的方法而不必考慮到底返回的是哪一個子類的實例。?

    -?代理模式:給一個對象提供一個代理對象,并由代理對象控制原對象的引用。實際開發中,按照使用目的的不同,代理可以分為:遠程代理、虛擬代理、保護代理、Cache代理、防火墻代理、同步化代理、智能引用代理。?

    -?適配器模式:把一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無法在一起使用的類能夠一起工作。?

    -?模板方法模式:提供一個抽象類,將部分邏輯以具體方法或構造器的形式實現,然后聲明一些抽象方法來迫使子類實現剩余的邏輯。不同的子類可以以不同的方式實現這些抽象方法(多態實現),從而實現不同的業務邏輯。?

    23、用Java寫一個單例類。?

    餓漢式單例

    [java]?view plain?copy

    ?public?class?Singleton?{??

    ?????private?Singleton(){}?????

    ??private?static?Singleton?instance?=?new?Singleton();?????

    ??public?static?Singleton?getInstance(){????????return?instance;?????

    ??}??

    ?}??

    懶漢式單例

    [java]?view plain?copy

    ?public?class?Singleton?{??

    ?private?Singleton()?{}????

    ???private?static?Singleton?instance?=?null;??????

    ?????public?static?synchronized?Singleton?getInstance(){??????

    ?????if?(instance?==?null)??

    ??instance??new?Singleton();????????

    ???return?instance;?????

    ??}??

    ?}??

    注意:實現一個單例有兩點注意事項,將構造器私有,不允許外界通過構造器創建對象;通過公開的靜態方法向外界返回類的唯一實例。這里有一個問題可以思考:springIoC容器可以為普通的類創建單例,它是怎么做到的呢?

    24.什么是DAO模式?

    答:DAODataAccess?Object)顧名思義是一個為數據庫或其他持久化機制提供了抽象接口的對象,在不暴露數據庫實現細節的前提下提供了各種數據操作。將所有對數據源的訪問操作進行抽象化后封裝在一個公共API中。在這個應用程序中,當需要和數據源進行交互的時候則使用這個接口,并且編寫一個單獨的類來實現這個接口,在邏輯上該類對應一個特定的數據存儲。DAO模式實際上包含了兩個模式,一是Data?Accessor(數據訪問器),二是Data?Object(數據對象),前者要解決如何訪問數據的問題,而后者要解決的是如何用對象封裝數據。

    ?

    25.Servlet的生命周期

    Web容器加載Servlet并將其實例化后,Servlet生命周期開始,容器運行其init()方法進行Servlet的初始化;請求到達時調用Servletservice方法,service方法會調用與請求對應的doGetdoPost等方法;當服務器關閉會項目被卸載時服務器會將Servlet實例銷毀,此時會調用Servletdestroy方法。

    26.轉發(forward)和重定向(redirect)的區別?

    1forward是容器中控制權的轉向,是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL?的響應內容讀取過來,然后把這些內容再發給瀏覽器,瀏覽器根本不知道服務器發送的內容是從哪兒來的,所以它的地址欄中還是原來的地址。

    2redirect就是服務器端根據邏輯,發送一個狀態碼,告訴瀏覽器重新去請求那個地址,因此從瀏覽器的地址欄中可以看到跳轉后的鏈接地址。

    3)前者更加高效,在前者可以滿足需要時,盡量使用轉發(通過RequestDispatcher對象的forward方法,RequestDispatcher對象可以通過ServletRequest對象的getRequestDispatcher方法獲得),并且,這樣也有助于隱藏實際的鏈接;在有些情況下,比如,需要跳轉到一個其它服務器上的資源,則必須使用重定向(通過HttpServletResponse對象調用其sendRedirect方法)。

    27.getpost請求的區別?

    ①get請求用來從服務器上獲得資源,而post是用來向服務器提交數據;

    ②get將表單中數據按照name=value的形式,添加到action?所指向的URL?后面,并且兩者使用“?”連接,而各個變量之間使用“&”連接;post是將表單中的數據放在HTML頭部(header),傳遞到action所指向URL

    ③get傳輸的數據要受到URL長度限制(1024字節);而post可以傳輸大量的數據,上傳文件只能使用post方式;

    使用get時參數會顯示在地址欄上,如果這些數據不是敏感數據,那么可以使用get;對于敏感數據還是應用使用post

    28JSP?Servlet?有有什么關系?

    答:其實這個問題在上面已經闡述過了,Servlet是一個特殊的Java程序,它運行于服務器的JVM中,能夠依靠服務器的支持向瀏覽器提供顯示內容。??

    JSP本質上是Servlet的一種簡易形式,?JSP會被服務器處理成一個類似于ServletJava程序,可以簡化頁面內容的生成。

    ServletJSP最主要的不同點在于,Servlet?的應用邏輯是在Java?文件中,并且完全從表示層中的HTML分離開來。而JSP的情況是JavaHTML可以組合成一個擴展名為.jsp?的文件(有人說,Servlet就是在Java中寫HTML,而JSP就是在HTML中寫Java代碼,當然,這個說法還是很片面的)。

    JSP側重于視圖,Servlet更側重于控制邏輯,在MVC架構模式中,JSP適合充當視圖(view)而Servlet適合充當控制器(controller)。

    29JSP中的四種作用域?

    答:pagerequestsessionapplication,具體如下:

    ①page?代表與一個頁面相關的對象和屬性。

    ②request?代表與Web客戶機發出的一個請求相關的對象和屬性。一個請求可能跨越多個頁面,涉及多個Web?組件;需要在頁面顯示的臨時數據可以置于此作用域

    ③session代表與某個用戶與服務器建立的一次會話相關的對象和屬性。跟某個用戶相關的數據應該放在用戶自己的session

    ④application代表與整個Web應用程序相關的對象和屬性,它實質上是跨越整個Web應用程序,包括多個頁面、請求和會話的一個全局作用域。

    30.實現會話跟蹤的技術有哪些?

    答:由于HTTP協議本身是無狀態的,服務器為了區分不同的用戶,就需要對用戶會話進行跟蹤,簡單的說就是為用戶進行登記,為用戶分配唯一的ID,下一次用戶在請求中包含此ID,服務器據此判斷到底是哪一個用戶。

    ①URL?重寫:在URL中添加用戶會話的信息作為請求的參數,或者將唯一的會話ID添加到URL結尾以標識一個會話。

    設置表單隱藏域:將和會話跟蹤相關的字段添加到隱式表單域中,這些信息不會在瀏覽器中顯示但是提交表單時會提交給服務器。

    ③cookiecookie當用戶通過瀏覽器和服務器建立一次會話后,會話ID就會隨響應信息返回存儲在基于窗口的cookie中,那就意味著只要瀏覽器沒有關閉,會話沒有超時,下一次請求時這個會話ID又會提交給服務器讓服務器識別用戶身份。會話中可以為用戶保存信息。會話對象是在服務器內存中的,而基于窗口的cookie是在客戶端內存中的。

    ④HttpSession:在所有會話跟蹤技術中,HttpSession對象是最強大也是功能最多的。當一個用戶第一次訪問某個網站時會自動創建HttpSession,每個用戶可以訪問他自己的HttpSession。與上面三種方式不同的是,HttpSession放在服務器的內存中

    31.JSP中的靜態包含和動態包含有什么區別??

    答:靜態包含是通過JSPinclude指令包含頁面,動態包含是通過JSP標準動作<jsp:forward>包含頁面。靜態包含是編譯時包含,如果包含的頁面不存在則會產生編譯錯誤,而且兩個頁面的"contentType"屬性應保持一致,因為兩個頁面會合二為一,只產生一個class文件,因此被包含頁面發生的變動再包含它的頁面更新前不會得到更新。動態包含是運行時包含,可以向被包含的頁面傳遞參數,包含頁面和被包含頁面是獨立的,會編譯出兩個class文件,如果被包含的頁面不存在,不會產生編譯錯誤,也不影響頁面其他部分的執行。代碼如下所示:

    <%--?靜態包含?--%><%@?include?file="..."?%>?<%--?動態包含?--%><jsp:include?page="...">????<jsp:param?name="..."?value="..."?/></jsp:include>

    32、什么是Web?ServiceWeb服務)??

    答:從表面上看,Web?Service就是一個應用程序,它向外界暴露出一個能夠通過Web進行調用的API。例如可以創建一個提供天氣預報的Web?Service,那么無論你用哪種編程語言開發的應用都可以通過調用它的API并傳入城市信息來獲得該城市的天氣預報。

    補充:這里必須要提及的一個概念是SOAService-Oriented?Architecture,面向服務的架構)顯然,Web?ServiceSOA的一種較好的解決方案,它更多的是一種標準,而不是一種具體的技術。

    33hashmaphashtable區別

    ???1.hashMap去掉了HashTable?contains方法,但是加上了containsValue()和containsKey()方法。

    ???2.hashTable同步的,而HashMap是非同步的,效率上逼hashTable要高。

    ???3.hashMap允許空鍵值,而hashTable不允許。

    ?

    34Socket的通信機制?

    套接字(socket)是通信的基石,是支持TCP/IP協議的網絡通信的基本操作單元。它是網絡通信過程中端點的抽象表示,包含進行網絡通信必須的五種信息:連接使用的協議,本地主機的IP地址,本地進程的協議端口,遠地主機的IP地址,遠地進程的協議端口。

    ?

    應用層通過傳輸層進行數據通信時,TCP會遇到同時為多個應用程序進程提供并發服務的問題。多個TCP連接或多個應用程序進程可能需要通過同一個?

    TCP協議端口傳輸數據。為了區別不同的應用程序進程和連接,許多計算機操作系統為應用程序與TCPIP協議交互提供了套接字(Socket)接口。應用層可以和傳輸層通過Socket接口,區分來自不同應用程序進程或網絡連接的通信,實現數據傳輸的并發服務。

    建立Socket連接至少需要一對套接字,其中一個運行于客戶端,稱為ClientSocket?,另一個運行于服務器端,稱為ServerSocket?

    套接字之間的連接過程分為三個步驟:服務器監聽,客戶端請求,連接確認。

    ?

    服務器監聽:服務器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態,實時監控網絡狀態,等待客戶端的連接請求。

    ?

    客戶端請求:指客戶端的套接字提出連接請求,要連接的目標是服務器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務器的套接字,指出服務器端套接字的地址和端口號,然后就向服務器端套接字提出連接請求。

    ?

    連接確認:當服務器端套接字監聽到或者說接收到客戶端套接字的連接請求時,就響應客戶端套接字的請求,建立一個新的線程,把服務器端套接字的描述發給客戶端,一旦客戶端確認了此描述,雙方就正式建立連接。而服務器端套接字繼續處于監聽狀態,繼續接收其他客戶端套接字的連接請求。

    35Http的通信機制?

    HTTP協議即超文本傳送協議(Hypertext?Transfer?Protocol?

    ),是Web聯網的基礎,也是手機聯網常用的協議之一,HTTP協議是建立在TCP協議之上的一種應用。

    ?

    HTTP連接最顯著的特點是客戶端發送的每次請求都需要服務器回送響應,在請求結束后,會主動釋放連接。從建立連接到關閉連接的過程稱為一次連接

    ?

    1)在HTTP?1.0中,客戶端的每次請求都要求建立一次單獨的連接,在處理完本次請求后,就自動釋放連接。

    ?

    2)在HTTP?

    1.1中則可以在一次連接中處理多個請求,并且多個請求可以重疊進行,不需要等待一個請求結束后再發送下一個請求。

    ?

    由于HTTP在每次請求結束后都會主動釋放連接,因此HTTP連接是一種短連接,要保持客戶端程序的在線狀態,需要不斷地向服務器發起連接請求。通常的做法是即時不需要獲得任何數據,客戶端也保持每隔一段固定的時間向服務器發送一次保持連接的請求,服務器在收到該請求后對客戶端進行回復,表明知道客戶端在線。若服務器長時間無法收到客戶端的請求,則認為客戶端下線,若客戶端長時間無法收到服務器的回復,則認為網絡已經斷開。

    由于通常情況下Socket連接就是TCP連接,因此Socket連接一旦建立,通信雙方即可開始相互發送數據內容,直到雙方連接斷開。但在實際網絡應用中,客戶端到服務器之間的通信往往需要穿越多個中間節點,例如路由器、網關、防火墻等,大部分防火墻默認會關閉長時間處于非活躍狀態的連接而導致?

    Socket?連接斷連,因此需要通過輪詢告訴網絡,該連接處于活躍狀態。

    ?

    HTTP連接使用的是請求響應的方式,不僅在請求時需要先建立連接,而且需要客戶端向服務器發出請求后,服務器端才能回復數據。

    ?

    很多情況下,需要服務器端主動向客戶端推送數據,保持客戶端與服務器數據的實時與同步。此時若雙方建立的是Socket連接,服務器就可以直接將數據傳送給客戶端;若雙方建立的是HTTP連接,則服務器需要等到客戶端發送一次請求后才能將數據傳回給客戶端,因此,客戶端定時向服務器端發送連接請求,不僅可以保持在線,同時也是在詢問服務器是否有新的數據,如果有就將數據傳給客戶端。

    ?

    36HttpServlet容器響應Web客戶請求流程?

    1Web客戶向Servlet容器發出Http請求;

    2Servlet容器解析Web客戶的Http請求;

    3Servlet容器創建一個HttpRequest對象,在這個對象中封裝Http請求信息;

    4Servlet容器創建一個HttpResponse對象;

    5Servlet容器調用HttpServletservice方法,這個方法中會根據requestMethod來判斷具體是執行doGet還是doPost,把HttpRequestHttpResponse對象作為service方法的參數傳給HttpServlet對象;

    6HttpServlet調用HttpRequest的有關方法,獲取HTTP請求信息;

    7HttpServlet調用HttpResponse的有關方法,生成響應數據;

    8Servlet容器把HttpServlet的響應結果傳給Web客戶

    ?

    37hibernateSessionloadget方法的區別是什么??

    答:主要有以下三項區別:?

    ①?如果沒有找到符合條件的記錄,get方法返回nullload方法拋出異常。?

    ②?get方法直接返回實體類對象,load方法返回實體類對象的代理。?

    ③?Hibernate?3之前,get方法只在一級緩存中進行數據查找,如果沒有找到對應的數據則越過二級緩存,直接發出SQL語句完成數據讀取;load方法則可以從二級緩存中獲取數據;從Hibernate?3開始,get方法不再是對二級緩存只寫不讀,它也是可以訪問二級緩存的。

    說明:對于load()方法Hibernate認為該數據在數據庫中一定存在可以放心的使用代理來實現延遲加載,如果沒有數據就拋出異常,而通過get()方法獲取的數據可以不存在。

    38、如何理解Hibernate的延遲加載機制

    答:延遲加載就是并不是在讀取的時候就把數據加載進來,而是等到使用時再加載。Hibernate使用了虛擬代理機制實現延遲加載。返回給用戶的并不是實體本身,而是實體對象的代理。代理對象在用戶調用getter方法時就會去數據庫加載數據。

    39、簡述Hibernate常見優化策略。

    制定合理的緩存策略

    ②?采用合理的Session管理機制

    ③?盡量使用延遲加載特性

    如果可以,?選用基于version的樂觀鎖替代悲觀鎖

    在開發過程中,?開啟hibernate.show_sql選項查看生成的SQL,?從而了解底層的狀況;開發完成后關閉此選項

    40、什么是IoCDIDI是如何實現的??

    答:IoC叫控制反轉,是Inversion?of?Control的縮寫,控制反轉是把傳統上由程序代碼直接操控的對象的調用權交給容器,通過容器來實現對象組件的裝配和管理。所謂的"控制反轉"就是對組件對象控制權的轉移,從程序代碼本身轉移到了外部容器,由容器來創建對象并管理對象之間的依賴關系。

    控制反轉——Spring通過一種稱作控制反轉(IoC)的技術促進了松耦合。當應用了IoC,一個對象依賴的其它對象會通過被動的方式傳遞進來,而不是這個對象自己創建或者查找依賴對象,是容器在對象初始化時不等對象請求就主動將依賴傳遞給它。通過IOC反轉控制DI依賴注入完成各個層之間的注入,使得層與層之間實現完全脫耦,增加運行效率利于維護。

    ?

    41、解釋一下什么叫AOP(面向切面編程)??

    答:

    ????springAOP面向切面編程,實現在不改變代碼的情況下完成對方法的增強。比較常用的就是spring的聲明式事務管理,底層通過AOP實現,避免了我們每次都要手動開啟事物,提交事務的重復性代碼,使得開發邏輯更加清晰。

    ???簡單點解釋,比方說你想在你的service層所有類中都加上一個打印你好的功能這你經可以用aop思想來做,你先寫個類寫個方法,方法經實現打印你好然后你Ioc這個類?ref“service.*”讓每個類都注入。

    ???aop就是面向切面的編程。比如說你每做一次對數據庫操作,都要生成一句日志。如果,你對數據庫的操作有很多類,那你每一類中都要寫關于日志的方法。但是如果你用aop,那么你可以寫一個方法,在這個方法中有關于數據庫操作的方法,每一次調用這個方法的時候,就加上生成日志的操作。

    ?

    42、選擇使用Spring框架的原因(Spring框架為企業級開發帶來的好處)?

    答:可以從以下幾個方面作答:

    1.?IoC容器:IoC容器幫助應用程序管理對象以及對象之間的依賴關系,對象之間的依賴關系如果發生了改變只需要修改配置文件而不是修改代碼,因為代碼的修改可能意味著項目的重新構建和完整的回歸測試。有了IoC容器,程序員再也不需要自己編寫工廠、單例,這一點特別符合Spring的精神不要重復的發明輪子

    2.?AOP:面向切面編程,將所有的橫切關注功能封裝到切面(aspect)中,通過配置的方式將橫切關注功能動態添加到目標代碼上,進一步實現了業務邏輯和系統服務之間的分離。另一方面,有了AOP程序員可以省去很多自己寫代理類的工作。

    3.?MVCSpringMVC框架是非常優秀的,從各個方面都可以甩Struts?2幾條街,為Web表示層提供了更好的解決方案。

    4.?事務管理:Spring以寬廣的胸懷接納多種持久層技術,并且為其提供了聲明式的事務管理,在不需要任何一行代碼的情況下就能夠完成事務管理。

    ?43?簡述攔截器的工作原理以及你在項目中使用過哪些自定義攔截器

    答:Struts?2中定義了攔截器的接口以及默認實現,實現了Interceptor接口或繼承了AbstractInterceptor的類可以作為攔截器。接口中的init()方法在攔截器被創建后立即被調用,它在攔截器的生命周期內只被調用一次,可以在該方法中對相關資源進行必要的初始化。每攔截一個請求,intercept()方法就會被調用一次。destory()方法將在攔截器被銷毀之前被調用,?它在攔截器的生命周期內也只被調用一次。

    項目中使用過的有權限攔截器、執行時間攔截器、令牌攔截器等。

    44、談一下攔截器和過濾器的區別

    答:攔截器和過濾器都可以用來實現橫切關注功能,其區別主要在于:

    1、攔截器是基于java反射機制的,而過濾器是基于函數回調的。

    2、過濾器依賴于servlet容器,而攔截器不依賴于servlet容器。

    3、攔截器只能對Action請求起作用,而過濾器則可以對幾乎所有請求起作用。

    4、攔截器可以訪問Action上下文、值棧里的對象,而過濾器不能。

    5、在Action的生命周期中,攔截器可以多次調用,而過濾器只能在容器初始化時被調用一次。

    ?過濾器,是在java?web中,你傳入的request,response提前過濾掉一些信息,或者提前設置一些參數,然后再傳入servlet或者struts?action進行業務邏輯,比如過濾掉非法url(不是login.do的地址請求,如果用戶沒有登陸都過濾掉),或者在傳入servlet或者strutsaction前統一設置字符集,或者去除掉一些非法字符.

    ??攔截器,是在面向切面編程的就是在你的service或者一個方法,前調用一個方法,或者在方法后調用一個方法比如動態代理就是攔截器的簡單實現,在你調用方法前打印出字符串(或者做其它業務邏輯的操作),也可以在你調用方法后打印出字符串,甚至在你拋出異常的時候做業務邏輯的操作。

    執行順序:過濾前?-?攔截前?-?Action處理?-?攔截后?-?過濾后。

    個人認為過濾是一個橫向的過程,首先把客戶端提交的內容進行過濾(例如未登錄用戶不能訪問內部頁面的處理);過濾通過后,攔截器將檢查用戶提交數據的驗證,做一些前期的數據處理,接著把處理后的數據發給對應的ActionAction處理完成返回后,攔截器還可以做其他過程(還沒想到要做啥),再向上返回到過濾器的后續操作。

    ?

    45struts1.2struts2.0的區別?

    ???struts1.2struts2.0的對比

    ???aAction類:

    ??????struts1.2要求Action類繼承一個基類。struts2.0?Action要求繼承ActionSupport基類

    ???b、線程模式

    ??????struts1.2?Action是單例模式的并且必須是線程安全的,因為僅有一個Action的實例來處理所有的請求。?struts2.0?Action為每一個請求產生一個實例,因此沒有線程安全問題。

    ???cServlet依賴

    ??????struts1.2?Action依賴于Servlet?API,因為當一個Action被調用時HttpServletRequestHttpServletResponse被傳遞給execut方法。?struts2.0?Action不依賴于容器,允許Action脫離容器單獨測試。

    ?

    46、常見的網絡協議有哪些?

    ????1.IP協議:互聯網協議

    主要用于負責IP尋址、路由選擇和IP數據包的分割和組裝。通常我們所說的IP地址可以理解為符合IP協議的地址。

    ????2.TCP協議:傳輸控制協議

    ????該協議主要用于在主機間建立一個虛擬連接,以實現高可靠性的數據包交換。IP協議可以進行IP數據包的分割和組裝,但是通過IP協議并不能清楚地了解到數據包是否順利地發送給目標計算機。而使用TCP協議就不同了,在該協議傳輸模式中在將數據包成功發送給目標計算機后,TCP會要求發送一個確認;如果在某個時限內沒有收到確認,那么TCP將重新發送數據包。另外,在傳輸的過程中,如果接收到無序、丟失以及被破壞的數據包,TCP還可以負責恢復。

    ????3.FTPFile?Transfer?Protocol):遠程文件傳輸協議,允許用戶將遠程主機上的文件拷貝到自己的計算機上。

    ????4.HTTP超文本傳輸協議HTTPHyperText?Transfer?Protocol)互聯網上應用最為廣泛的一種網絡協議。所有的WWW文件都必須遵守這個標準。設計HTTP最初的目的是為了提供一種發布和接收HTML頁面的方法。

    ????5.ARP協議:AddressResolutionProtocol地址解析協議

    簡單地說,ARP協議主要負責將局域網中的32IP地址轉換為對應的48位物理地址,即網卡的MAC地址。

    ?

    47計算機網絡分層,每層所用協議,協議所占端口

    1)應用層:與其他計算機進行通訊的一個應用,它是對應應用程序的通信服務的。示例:telnetHTTP,FTP,WWW,NFS,SMTP等。?

    ????2)表示層:這一層的主要功能是定義數據格式及加密。示例:加密,ASII等。?

    ????3)會話層:他定義了如何開始、控制和結束一個會話,包括對多個雙向小時的控制和管理,以便在只完成連續消息的一部分時可以通知應用,從而使表示層看到的數據是連續的。示例:RPCSQL等。?

    ???4)傳輸層:這層的功能包括是否選擇差錯恢復協議還是無差錯恢復協議,及在同一主機上對不同應用的數據流的輸入進行復用,還包括對收到的順序不對的數據包的重新排序功能。示例:TCPUDPSPX?

    ???5)網絡層:這層對端到端的包傳輸進行定義,他定義了能夠標識所有結點的邏輯地址,還定義了路由實現的方式和學習的方式。。示例:IP,IPX等。?

    ???6)數據鏈路層:他定義了在單個鏈路上如何傳輸數據。

    ???7)物理層:OSI的物理層規范是有關傳輸介質的特性標準,這些規范通常也參考了其他組織制定的標準。

    ?

    48html訪問全過程

    A)解析Web頁面的URL,得到Web服務器的域名

    ????B)通過DNS服務器獲得Web服務器的IP地址

    I)與Web服務器建立TCP連接

    ????E)與Web服務器建立HTTP連接

    C)從Web服務器獲得URL指定的文檔

    ????G)瀏覽器解釋頁面文檔,并顯示在屏幕

    ?

    49classloader原理

    ????1classLoader的介紹及加載過程

    與普通程序不同的是,Java程序(class文件)并不是本地的可執行程序。當運行Java程序時,首先運行JVMJava虛擬機),然后再把Java?class加載到JVM里頭運行,負責加載Java?class的這部分就叫做Class?Loader。所以classLoader的目的在于把class文件裝入到jvm中。

    那么classLoader又在那里的啦?又由誰調用呢?其實classLoader只是jvm的一個實現的一部分。Jvm提供的一個頂級的classLoaderbootStrap?classLoader),bootStrap?classLoader負責加載java核心的API以滿足java程序最基本的需求。Jvm還提供的兩個classLoader,其中Extension?ClassLoader負責加載擴展的Java?classApplication?ClassLoader負責加載應用程序自身的類。而Extension?ClassLoaderApplication?ClassLoader則由bootStrap?classLoader加載。

    2classLoader加載的基本流程

    ???當運行一個程序的時候,JVM啟動,運行bootstrap?classloader,該ClassLoader加載java核心APIExtClassLoaderAppClassLoader也在此時被加載),然后調用ExtClassLoader加載擴展API,最后AppClassLoader加載CLASSPATH目錄下定義的Class,這就是一個程序最基本的加載流程。

    3classLoader加載的方式

    ???其實classLoader在加載class文件的時候就采用的雙親委托模式。每一個自定義ClassLoader都必須繼承ClassLoader這個抽象類,而每個ClassLoader都會有一個parent?ClassLoader,我們可以看一下ClassLoader這個抽象類中有一個getParent()方法,這個方法用來返回當前ClassLoaderparent

    ?

    50、快速排序原理

    ?原理:

    ????快速排序也是分治法思想的一種實現,他的思路是使數組中的每個元素與基準值(Pivot,通常是數組的首個值,A[0])比較,數組中比基準值小的放在基準值的左邊,形成左部;大的放在右邊,形成右部;接下來將左部和右部分別遞歸地執行上面的過程:選基準值,小的放在左邊,大的放在右邊。。。直到排序結束。

    ?步驟:

    1.找基準值,設Pivot?=?a[0]?

    2.分區(Partition):比基準值小的放左邊,大的放右邊,基準值(Pivot)放左部與右部的之間。

    3.進行左部(a[0]?-?a[pivot-1])的遞歸,以及右部(a[pivot+1]?-?a[n-1])的遞歸,重復上述步驟。

    //快速排序 void quick_sort(int s[], int l, int r) { if (l < r) { //Swap(s[l], s[(l + r) / 2]); //將中間的這個數和第一個數交換 參見注1 int i = l, j = r, x = s[l]; while (i < j) { while(i < j && s[j] >= x) // 從右向左找第一個小于x的數 j--; if(i < j) s[i++] = s[j]; while(i < j && s[i] < x) // 從左向右找第一個大于等于x的數 i++; if(i < j) s[j--] = s[i]; } s[i] = x; quick_sort(s, l, i - 1); // 遞歸調用 quick_sort(s, i + 1, r); } }

    51、各種集合類之間的區別

    1ArrayList:?元素單個,效率高,多用于查詢

    2Vector:??元素單個,線程安全,多用于查詢

    3LinkedList:元素單個,多用于插入和刪除

    4HashMap:??元素成對,元素可為空

    5HashTable:?元素成對,線程安全,元素不可為空

    ?

    52、內存溢出和內存泄漏

    ????內存溢出是指已有的數據超過了其獲得到的內存所能存儲的范圍,比如用一個字節存放1000這個數字就屬于內存溢出。比如說你申請了一個integer,但給它存了long才能存下的數,那就是內存溢出。

    ????Java內存泄漏就是沒有及時清理內存垃圾,導致系統無法再給你提供內存資源(內存資源耗盡)。Java內存泄露是說程序邏輯問題,造成申請的內存無法釋放.這樣的話無論多少內存,早晚都會被占用光的.最簡單的例子就是死循環了.由于程序判斷錯誤導經常發生此事。

    ?

    53jvm布局

    ????以下是JVM的一個基本架構圖,在這個基本架構圖中,棧有兩部份,Java線程棧以及本地方法棧

    ?

    ?


    JVM中堆空間劃分如下圖所示

    ?

    ?

    ?

    上圖中,刻畫了Java程序運行時的堆空間,可以簡述成如下2

    1.JVM中堆空間可以分成三個大區,新生代、老年代、永久代

    2.新生代可以劃分為三個區,Eden區,兩個幸存區

    Jvm主要包括下面兩面方面:

    ·?Java代碼編譯和執行的整個過程

    ·?JVM內存管理及垃圾回收機制

    54、在瀏覽器中輸入www.baidu.com后執行的全部過程

    1、客戶端瀏覽器通過DNS解析到www.baidu.comIP地址220.181.27.48,通過這個IP地址找到客戶端到服務器的路徑。客戶端瀏覽器發起一個HTTP會話到220.161.27.48,然后通過TCP進行封裝數據包,輸入到網絡層。

    2、在客戶端的傳輸層,把HTTP會話請求分成報文段,添加源和目的端口,如服務器使用80端口監聽客戶端的請求,客戶端由系統隨機選擇一個端口如5000,與服務器進行交換,服務器把相應的請求返回給客戶端的5000端口。然后使用IP層的IP地址查找目的端。

    3、客戶端的網絡層不用關系應用層或者傳輸層的東西,主要做的是通過查找路由表確定如何到達服務器,期間可能經過多個路由器,這些都是由路由器來完成的工作,我不作過多的描述,無非就是通過查找路由表決定通過那個路徑到達服務器。

    4、客戶端的鏈路層,包通過鏈路層發送到路由器,通過鄰居協議查找給定IP地址的MAC地址,然后發送ARP請求查找目的地址,如果得到回應后就可以使用ARP的請求應答交換的IP數據包現在就可以傳輸了,然后發送IP數據包到達服務器的地址。


    總結

    以上是生活随笔為你收集整理的各种面试题(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。