Android面試之Java基礎筆試題

xxq2dream發表於2018-10-03

Java IO流

  • 按照資料流的方向不同可以分為:輸入流和輸出流。

  • 按照處理資料單位不同可以分為:位元組流和字元流。

    • 位元組流:一次讀入或讀出是8位二進位制,字尾是Stream是位元組流
    • 字元流:一次讀入或讀出是16位二進位制,字尾是Reader,Writer是字元流
  • 按照實現功能不同可以分為:節點流和處理流。

    • 節點流:直接與資料來源相連,讀入或讀出
    • 處理流:與節點流一塊使用,在節點流的基礎上,再套接一層,套接在節點流上的就是處理流
  • FileInputStream:位元組輸入流,屬於節點流型別

  • FileOutputStream:位元組輸出流,屬於節點流型別

編碼和位元組佔用

String s = "我 java"; 
複製程式碼

String型別裡的漢字,按照編碼格式的不同,分為2-4個位元組的佔用,UTF-8佔用3個位元組,特別的佔用4個位元組,一個漢字佔三個位元組,所以上面的字串佔用8個位元組。

計算型別的轉換

System.out.println(100%3);
System.out.println(",");
System.out.println(100%3.0);
複製程式碼

輸出為:1,1.0

“static”關鍵字是什麼意思?Java中是否可以覆蓋(override)一個private或者是static的方法?

“static”關鍵字表明一個成員變數或者是成員方法可以在沒有所屬的類的例項變數的情況下被訪問。

不能。靜態方法和私有方法在程式編譯的解析階段中就確定了唯一的呼叫版本,是執行期不可變的,不能被重寫和過載

static修飾的變數不用初始化

static int num;
System.out.println(num);
複製程式碼

結果:輸出的是0,因為static修飾的變數在類載入的準備階段會進行記憶體的分配和值的初始化,基本型別的初始值基本都是0,boolean是false,引用型別是null

抽象類和介面的區別

  • 介面中所有的方法隱含的都是抽象的。而抽象類則可以同時包含抽象和非抽象的方法
  • Java介面中的成員函式預設是public的。抽象類的成員函式可以是private,protected或者是public
  • 類可以實現很多個介面,但是隻能繼承一個抽象類
  • Java介面中宣告的變數預設都是final的。抽象類可以包含非final的變數
  • 介面是絕對抽象的,不可以被例項化。抽象類也不可以被例項化

什麼是值傳遞和引用傳遞

物件被值傳遞,意味著傳遞了物件的一個副本。因此,就算是改變了物件副本,也不會影響源物件的值。 物件被引用傳遞,意味著傳遞的並不是實際的物件,而是物件的引用。因此,外部對引用物件所做的改變會反映到所有的物件上。

移位計算

最有效率的方法算出2乘以8等於幾?

int a=2<<3
複製程式碼

String、StringBuffer與StringBuilder

  • String是不可變類,也就是說,每一次改變都會建立新的String物件,老的物件就會被回收,所以就會建立、回收這樣導致效率比較低
  • StringBuffer是執行緒安全的,很多方法可以帶有synchronized關鍵字,平時用的並不多,因為非多執行緒環境下效率就會低
  • StringBuilder不是執行緒安全的,是可變的變數,不會有頻繁的建立、回收,效能要好
  • StringBuffer與StringBuilder底層都是通過一個char的陣列來儲存資料,而StringBuffer就是在StringBuilder的基礎上一些方法加了synchronized關鍵字

String s = new String(“xyz”);建立了幾個String Object?

兩個,一個是在堆中建立的s一個是在字串常量池中建立的“xyz”。

請說出作用域public,private,protected,以及不寫時的區別

作用域 當前類 同一package 子孫類 其他package
public
protected x
friendly x x
private x x x

不寫的話預設是friendly或者是default,表示可以被同一個包裡的類訪問,包括子類;但不能被不同的包訪問,即使是子類

java裡 equals和== 區別

  • java中equals和==的區別 值型別是儲存在記憶體中的堆疊(簡稱棧),而引用型別的變數在棧中僅僅是儲存引用型別變數的地址,而其本身則儲存在堆中
  • ==操作比較的是兩個變數的值是否相等,對於引用型變數表示的是兩個變數在堆中儲存的地址是否相同,即棧中的內容是否相同
  • equals操作表示的兩個變數是否是對同一個物件的引用,即堆中的內容是否相同
  • ==比較的是2個物件的地址,而equals比較的是2個物件的內容,顯然,當equals為true時,==不一定為true。

HashMap和Hashtable有什麼區別?

  • HashMap和Hashtable都實現了Map介面,因此很多特性非常相似
  • HashMap允許鍵和值是null,而Hashtable不允許鍵或者值是null
  • Hashtable是同步的,而HashMap不是。因此,HashMap更適合於單執行緒環境,而Hashtable適合於多執行緒環境
  • HashMap提供了可供應用迭代的鍵的集合,因此,HashMap是快速失敗的。另一方面,Hashtable提供了對鍵的列舉(Enumeration)

ArrayList和LinkedList有什麼區別?

  • ArrayList和LinkedList都實現了List介面
  • ArrayList是基於索引的資料介面,它的底層是陣列。它可以以O(1)時間複雜度對元素進行隨機訪問。與此對應,LinkedList是以元素連結串列的形式儲存它的資料,每一個元素都和它的前一個和後一個元素連結在一起,在這種情況下,查詢某個元素的時間複雜度是O(n)
  • 相對於ArrayList,LinkedList的插入,新增,刪除操作速度更快
  • LinkedList比ArrayList更佔記憶體,因為LinkedList為每一個節點儲存了兩個引用,一個指向前一個元素,一個指向下一個元素

參考文章


                      歡迎關注我的微信公眾號,和我一起每天進步一點點!
複製程式碼

AntDream

相關文章