Java面試準備__Java

來源:互聯網
上載者:User

1.ArryList 、Vector、LinkedList 區別

ArrayList:當在一列資料的後面添加資料而不是在前面或中間,並且需要隨機地訪問其中的元素時,使用ArrayList會提供比較好的效能;Vector中的方法由於添加了synchronized修飾,因此Vector是安全執行緒的容器,但效能上較ArrayList差。

LinkedList:當在一列資料的前面或中間添加或刪除資料,並且按照順序訪問其中的元素時,就應該使用LinkedList了。

2.HashMap、HashTable、LinkedMap、TreeMap的區別

HashMap:訪問速度快,允許值為null,不支援線程同步,無順序。若要同步可以加synchronizedMap或者使用ConcurrentHashMap。

HashTable:不允許鍵或值為空白,線程同步,寫入速度慢。

LinkedHashMap:是HashMap的一個子類,儲存了記錄的插入順序,遍曆的時候會比HashMap慢。

TreeMap:預設是按鍵鍵的升序排序。

3.事務

https://zhidao.baidu.com/question/104479831.html

事務(Transaction)是並發控制的單位,是使用者定義的一個操作序列。這些操作要麼都做,要麼都不做,是一個不可分割的工作單位。通過事務,SQL Server能將邏輯相關的一組操作綁定在一起,以便伺服器保持資料的完整性。主要用於一些對操作過程的完整性比較高的程式。比如銀行系統,使用者在轉賬的過程中程式出現錯誤,但是這個轉賬操作沒有完成。那麼這個操作就被退回。

主要目的:保證資料的一致性和完整性。

特性

1.原子性:一個事務中所有對資料庫的操作是一個不可分割的操作序列,要麼全做要麼全不做

2.一致性:在事務執行前後,資料狀態保持一致性。資料不會因為事務的執行而遭到破壞

3.隔離性:一個事物的執行,不受其他事務的幹擾,即並發執行的事物之間互不干擾

4.持久性:一個事物一旦提交,它對資料庫的改變就是永久的


事務的實現方式:實現方式共有兩種:編碼方式;聲明式交易管理方式


基於AOP技術實現的聲明式交易管理,實質就是:在方法執行前後進行攔截,然後再目標方法開始之前建立並加入事務,執行完目標方法後根據執行情況提交或復原事務.


聲明式交易管理又有兩種實現方式:基於xml設定檔的方式;另一個實在業務方法上進行@Transaction註解,將事務規則應用到商務邏輯中


一種常見的交易管理配置:事務攔截器TransactionInterceptor和事務自動代理BeanNameAutoProxyCreator相結合的方式


4.面向切面AOP

面向切面編程,把散落在程式中的公用部分提取出來,做成切面類,這樣的好處在於,代碼的可重用,一旦涉及到該功能的需求發生變化,只要修改該代碼就行,否則,你要到處修改,如果只要修改1、2處那還可以接受,萬一有1000處呢。
AOP底層的東西就是JDK動態代理和CGLIB代理,說白了就是增強類的功能。
最常用的AOP應用在資料庫連接以及交易處理上。

AOP是面向切面編程,是通過代理的方式為程式添加統一功能,集中解決一些公用問題。
AOP的應用:Spring聲明式事務.
AOP通知的類型有:前通知,後通知,環繞通知,異常通知


5.兩個項目之間如何通訊

①使用apache的HttpClient方式。

GET請求:

String url = "......";HttpClient client = new HttpClient();HttpMethod method=new GetMethod("url");CloseableHttpResponse response = client.executeMethod(method);HttpEntity entity = response.getEntity();
POST請求:
String url = "......";HttpClient client = new HttpClient();PostMethod postMethod = new PostMethod(url);// 建立參數隊列            List<namevaluepair> formparams = new ArrayList<namevaluepair>();          formparams.add(new BasicNameValuePair("username", "admin"));          formparams.add(new BasicNameValuePair("password", "123456"));         UrlEncodedFormEntity uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8");          httppost.setEntity(uefEntity);          System.out.println("executing request " + httppost.getURI());          CloseableHttpResponse response = httpclient.execute(httppost);        HttpEntity entity = response.getEntity();  


②使用JDK內建的java.NET包下的HttpURLConnection方式。

亂碼解決:發送時:conn.setRequestProperty("charset", "UTF-8");

    接收時:reader = new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8"));

6.反射機制

反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態擷取的資訊以及動態調用對象的方法的功能稱為java語言的反射機制。

反射是什麼呢。當我們的程式在運行時,需要動態載入一些類這些類可能之前用不到所以不用載入到jvm,舉個例子我們的項目底層有時是用mysql,有時用oracle,需要動態地根據實際情況載入驅動類,這個時候反射就有用了,假設 com.dbtest.myqlConnection,com.dbtest.oracleConnection這兩個類我們要用,這時候我們的程式就寫得比較動態化,通過Class tc = Class.forName("com.dbtest.myqlConnection");通過類的全類名讓jvm在伺服器中找到並載入這個類,而如果是oracle則傳入的參數就變成另一個了。這時候就可以看到反射的好處了,這個動態性就體現出java的特性了。


《深度解析Java遊戲伺服器開發》:

看了下目錄,沒啥乾貨,大篇幅講安裝環境的,還有很多介紹架構的。

本書從遊戲的行業分析、Java技術、遊戲邏輯、資料庫技術、網路理論、伺服器技術、架構分析、系統最佳化等方面對遊戲伺服器開發做了全面解析。



web伺服器和遊戲伺服器的區別:

1.從第三方支援來說,web後台有很多成熟的第三方架構,開發人員不需要關心底層控制器跳轉的實現,只需要一個或幾個設定檔,就能完成核心控制器的部分,而開發人員只需要關注web自身的商務邏輯,將邏輯與架構融合即可,使用架構一方面簡化控制層代碼,一方面很好的實現了商務邏輯的分層。而遊戲後台開發中,因為各種遊戲的需求差異性很大,從網路層,到商務邏輯層,各方面都必鬚根據自己遊戲需求搭建適合自己的架構,因此很難有一些通用的東西能提煉出來一款成熟的架構,遊戲後台開發基本上需要自己搭建適合自己的架構。
2.從商務邏輯層面來說,web後台基本上邏輯都是大同小異的,或許這一套系統,稍微改改,另一套系統就能用,而遊戲就不同了,每個遊戲都有自己的特色,根據策劃的不同需求而實現不同的邏輯,不過也會有一些通用的模組,但整體上差異性還是很大的。
3.從資料持久化來說,web的資料基本上是很規整的,表與表之間關係很明確,並且以後也不會有太大的變化,而遊戲中的資料多種多樣,隨著開服之後,資料的變化也是多種多樣,甚至傳統的關係型資料庫根本無法滿足遊戲資料持久化的需求,遊戲中有很多狀態和資料是需要伺服器來儲存的,我個人認為,在遊戲開發中,nosql比關係型資料庫更實用。
4.從通訊層來說,web中的使用者都是一個個獨立的個體,而遊戲中是多人線上的一個遊戲世界,在這個遊戲世界中,玩家與玩家之間需要進行互動,這就需要伺服器即時的向所有線上玩家進行訊息廣播,這一點很損耗伺服器效能的,在這方面,遊戲後台要比web做更多的處理,遊戲伺服器是一個IO密集的伺服器類型。


多線程

建立三個線程,A線程列印10次A,B線程列印10次B,C線程列印10次C,要求線程同時運行,交替列印10次ABC。這個問題用Object的wait(),notify()就可以很方便的解決。代碼如下:

/**  * wait用法  * @author DreamSea   * @time 2015.3.9   */  package com.multithread.wait;  public class MyThreadPrinter2 implements Runnable {                 private String name;         private Object prev;         private Object self;             private MyThreadPrinter2(String name, Object prev, Object self) {             this.name = name;             this.prev = prev;             this.self = self;         }             @Override        public void run() {             int count = 10;             while (count > 0) {                 synchronized (prev) {                     synchronized (self) {                         System.out.print(name);                         count--;                                              self.notify();                     }                     try {                         prev.wait();                     } catch (InterruptedException e) {                         e.printStackTrace();                     }                 }                 }         }             public static void main(String[] args) throws Exception {             Object a = new Object();             Object b = new Object();             Object c = new Object();             MyThreadPrinter2 pa = new MyThreadPrinter2("A", c, a);             MyThreadPrinter2 pb = new MyThreadPrinter2("B", a, b);             MyThreadPrinter2 pc = new MyThreadPrinter2("C", b, c);                                       new Thread(pa).start();          Thread.sleep(100);  //確保按順序A、B、C執行          new Thread(pb).start();          Thread.sleep(100);            new Thread(pc).start();             Thread.sleep(100);            }     }    


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.