1. 程式人生 > >剛從華為公司面試出來的被問到的10道題拿出來分享

剛從華為公司面試出來的被問到的10道題拿出來分享

1.char型變數中能不能儲存一箇中文漢字 為什麼?

char型別可以儲存一箇中文漢字 因為Java中使用的編碼是Unicode(不選擇任何特定的編碼 之間使用字元在字符集中的編號 這是統一的唯一方法)一個char型別佔2個位元組(16位元)所以放一箇中文是沒問題的

2.抽象類 abstract class 和介面 interface有什麼異同?

抽象類和介面都不能夠例項化,但可以定義抽象類和介面型別的引用。一個類如果繼承了某個抽象類或者實現了某個介面都需要對其中的抽象方法全部進行實現,否則該類仍然需要被宣告為抽象類。介面比抽象類更加抽象,因為抽象類中可以定義構造器,可以有抽象方法和具體方法 而介面中不能定義構造器而且其中的方法全部都是抽象方法 抽象類中的成員可以是 private 預設 protected public的而介面中的成員全部都是public的,抽象類中可以定義成員變數,而介面中定義的成員變數實際上都是常量,有抽象方法的類必須被宣告為抽象類,而抽象類未必要有抽象方法。

3.Java中會存在記憶體洩漏嗎?請簡單描述

理論上Java因為有垃圾回收機制GC 不會存在記憶體洩漏問題 這也是Java被廣泛適用於伺服器程式設計的一個重要原因;然而在實際開發中,可能會存在無用但可達的物件,這些物件不能被GC回收,因此也會導致記憶體洩漏的發生,例如Hibernate的Sssion(一級快取)中的物件屬於持久態,垃圾回收器是不會回收這些物件的,然而這些物件中可能存在無用的垃圾物件,如果不及時關閉close或清空flush 一級快取就可能導致記憶體洩露

4.抽象的方法是否可同時是靜態的 是否可同時是本地方法 是否可同時被synchronized修飾

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

5.闡述靜態變數和例項變數的區別?

靜態變數是被static修飾符修飾的也稱為類變數 它屬於類 不屬於類的任何一個物件 一個類不管建立多少個物件 靜態變數在記憶體中有且僅有一個拷貝 例項變數必須依存於某一個例項 需要先建立物件然後通過物件才能訪問到他靜態變數可以實現讓多個物件共享記憶體

6.是否可以從一個靜態static 方法內部發出對非靜態方法的呼叫?

不可以 靜態方法只能訪問靜態成員 因為非靜態方法的呼叫要先建立物件 在呼叫靜態方法時可能物件並沒有被初始化

7.日期和時間

如何取得年月日 小時分鐘秒

如何取得從1970年1月1日0時0分0秒到現在的毫秒數

如何取得某月的最後一天?

如何格式化日期?

問題1. 建立 java.util.Calendar例項,呼叫其get()方法傳入不同的引數即可獲得引數所對應的值.Java 8中可以使用java.time.LocalDateTime來獲取,程式碼如下所示。

public class DateTimeTest{

  public static void main(String[] args){

    Calendar cal=Calendar.getInstance();

        System.out.println(cal.get(Calendar.YEAR));         System.out.println(cal.get(Calendar.MONTH));    // 0 - 11         System.out.println(cal.get(Calendar.DATE));         System.out.println(cal.get(Calendar.HOUR_OF_DAY));         System.out.println(cal.get(Calendar.MINUTE));         System.out.println(cal.get(Calendar.SECOND));

      // Java 8         LocalDateTime dt = LocalDateTime.now();         System.out.println(dt.getYear());         System.out.println(dt.getMonthValue());     // 1 - 12         System.out.println(dt.getDayOfMonth());         System.out.println(dt.getHour());         System.out.println(dt.getMinute());         System.out.println(dt.getSecond());

}

}

問題 2:以下方法均可獲得該毫秒數

Calendar.getInstance().getTimeInMilis();

System.currentTimeMillis();

Clock.systemDefaultZone().nukkus();//Java 8

問題3:程式碼如下所示

Calendar time = Calendar.getInstance(); time.getActualMaximum(Calendar.DAY_OF_MONTH);

問 題4:利用java.text.DataFormat 的子類(如SimpleDateFormat類)中的format(Date)方法可將日期格式化。Java 8中可以用java.time.format.DateTimeFormatter來格式化時間日期,程式碼如下所示。

import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.Date; class DateFormatTest {     public static void main(String[] args) {         SimpleDateFormat oldFormatter = new SimpleDateFormat("yyyy/MM/dd");         Date date1 = new Date();         System.out.println(oldFormatter.format(date1));         // Java 8         DateTimeFormatter newFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");         LocalDate date2 = LocalDate.now();         System.out.println(date2.format(newFormatter));     } }

  補充:Java的時間日期API一直以來都是被詬病的東西,為了解決這一問題,Java 8中引入了新的時間日期API,其中包括LocalDate、LocalTime、LocalDateTime、Clock、Instant等類,這些的 類的設計都使用了不變模式,因此是執行緒安全的設計。