軟通動力面試題

軟通動力

1.面向對象的四大特性

答:(1)抽象:就是將一類對象的共同特徵總結出來構造類的過程,包括包括數據抽象和行爲抽象兩方面。抽象只關注對象有哪些屬性和行爲,並不關注這些行爲的細節是什麼。
(2)封裝:通常認爲封裝就是把數據和操作數據的方法綁定起來,對數據的訪問只能通過以定義的接口,面向對象的實質就是將現實世界描繪成一系列自治,封閉的對象。我們在類中編寫的方法就是對實現細節的一種封裝;我們編寫的一個類就是數據和數據操作的封裝。可以說,封裝就是隱藏一切可隱藏的東西,只向外界提供最簡單的編程接口。
(3)繼承:繼承是從已有的類得到繼承信息創建新類的過程。繼承信息的類被稱爲父類;得到繼承信息的類被稱爲子類。繼承讓變化的軟件有了一定的延續性,同時繼承也是封裝程序中可變因素的重要手段。
(4)多態:多態就是允許不同子類型的對象對同一消息做出不同的響應,多態分爲編譯時多態和運行時多態,方法重載(overload)實現的是編譯時的多態性(也稱爲前綁定),而方法重寫(override)實現的是運行時的多態性(也稱爲後綁定)。運行時的多態是面向對象最精髓的東西,要實現多態需要做兩件事:1. 方法重寫(子類繼承父類並重寫父類中已有的或抽象的方法);2. 對象造型(用父類型引用引用子類型對象,這樣同樣的引用調用同樣的方法就會根據子類對象的不同而表現出不同的行爲)。

2.string,stringbuffer,stringbuilder的區別

在這裏插入圖片描述
答:String:不可變字符串,適用於少量的字符串操作的情況
  StringBuilder:可變字符串,效率高,適用於單線程下在字符緩衝區進行大量操作的情況
  StringBuffer:可變字符串,效率低,適用多線程下在字符緩衝區進行大量操作的情況
參考資料:https://docs.oracle.com/javase/tutorial/java/data/buffers.html

3.在項目上新之後,如果項目出現了內存溢出,應該如何查看

內存溢出是指應用系統中存在無法回收的內存或使用的內存過多,最終使得程序運行要用到的內存大於虛擬機能提供的最大內存。

引起內存溢出的原因有很多種,常見的有以下幾種:
  1.內存中加載的數據量過於龐大,如一次從數據庫取出過多數據;
  2.集合類中有對對象的引用,使用完後未清空,使得JVM不能回收;
  3.代碼中存在死循環或循環產生過多重複的對象實體;
  4.使用的第三方軟件中的BUG;
  5.啓動參數內存值設定的過小;

內存溢出的解決方案:
第一步,修改JVM啓動參數,直接增加內存。(-Xms,-Xmx參數一定不要忘記加。)

第二步,檢查錯誤日誌,查看“OutOfMemory”錯誤前是否有其它異常或錯誤。

第三步,對代碼進行走查和分析,找出可能發生內存溢出的位置。

重點排查以下幾點:
1.檢查對數據庫查詢中,是否有一次獲得全部數據的查詢。一般來說,如果一次取十萬條記錄到內存,就可能引起內存溢出。這個問題比較隱蔽,在上線前,數據庫中數據較少,不容易出問題,上線後,數據庫中數據多了,一次查詢就有可能引起內存溢出。因此對於數據庫查詢儘量採用分頁的方式查詢。

2.檢查代碼中是否有死循環或遞歸調用。

3.檢查是否有大循環重複產生新對象實體。

4.檢查對數據庫查詢中,是否有一次獲得全部數據的查詢。一般來說,如果一次取十萬條記錄到內存,就可能引起內存溢出。這個問題比較隱蔽,在上線前,數據庫中數據較少,不容易出問題,上線後,數據庫中數據多了,一次查詢就有可能引起內存溢出。因此對於數據庫查詢儘量採用分頁的方式查詢。

5.檢查List、MAP等集合對象是否有使用完後,未清除的問題。List、MAP等集合對象會始終存有對對象的引用,使得這些對象不能被GC回收。

第四步,使用內存查看工具動態查看內存使用情況。
參考地址: http://baike.baidu.com/view/79183.htm
4.書寫一段代碼,當輸入數組或者集合abc時,輸出cba

//當爲數組時
public class test {
    public static void main(String[] args) {
        String[] str = {"a", "b", "c", "d"};
        for (int i = str.length - 1; i >= 0; i--) {//倒序輸出
            System.out.print(str[i] + "\t");
        }
    }
}
//輸出的結果爲dcba
//當爲集合時
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class test {
    public static void main(String[] args) {
      List<String> list=new ArrayList();
      list.add("a");
      list.add("b");
      list.add("c");
          Collections.reverse(list);
        for (String str:list){
            System.out.print(str);
        }
    }
}
發佈了44 篇原創文章 · 獲贊 15 · 訪問量 4246
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章