20個高級Java面試題彙總

這是一個高級Java面試系列題中的第一部分。這一部分論述了可變參數,斷言,垃圾回收,初始化器,令牌化,日期,日曆等等Java核心問題。程序員

  1. 什麼是可變參數?編程

  2. 斷言的用途?bash

  3. 何時使用斷言?ide

  4. 什麼是垃圾回收?函數

  5. 用一個例子解釋垃圾回收?spa

  6. 何時運行垃圾回收?命令行

  7. 垃圾回收的最佳作法?rest

  8. 什麼是初始化數據塊?

  9. 什麼是靜態初始化器?

  10. 什麼是實例初始化塊?

  11. 什麼是正則表達式?

  12. 什麼是令牌化?

  13. 給出令牌化的例子?

  14. 如何使用掃描器類(Scanner Class)令牌化?

  15. 如何添加小時(hour)到一個日期對象(Date Objects)?

  16. 如何格式化日期對象?

  17. Java中日曆類(Calendar Class)的用途?

  18. 如何在Java中獲取日曆類的實例?

  19. 解釋一些日曆類中的重要方法?

  20. 數字格式化類(Number Format Class)的用途?

什麼是可變參數?

可變參數容許調用參數數量不一樣的方法。請看下面例子中的求和方法。此方法能夠調用1個int參數,或2個int參數,或多個int參數。

 //int(type) followed ... (three dot's) is syntax of a variable argument. 
    public int sum(int... numbers) {
        //inside the method a variable argument is similar to an array.
        //number can be treated as if it is declared as int[] numbers;
        int sum = 0;
        for (int number: numbers) {
            sum += number;
        }
        return sum;
    }

    public static void main(String[] args) {
        VariableArgumentExamples example = new VariableArgumentExamples();
        //3 Arguments
        System.out.println(example.sum(1, 4, 5));//10
        //4 Arguments
        System.out.println(example.sum(1, 4, 5, 20));//30
        //0 Arguments
        System.out.println(example.sum());//0
    }

斷言的用途?

斷言是在Java 1.4中引入的。它能讓你驗證假設。若是斷言失敗(即返回false),就會拋出AssertionError(若是啓用斷言)。基本斷言以下所示。

private int computerSimpleInterest(int principal, float interest, int years) {
    assert(principal > 0);
    return 100;
}

何時使用斷言?

斷言不該該用於驗證輸入數據到一個public方法或命令行參數。IllegalArgumentException會是一個更好的選擇。在public方法中,只用斷言來檢查它們根本不該該發生的狀況。

什麼是垃圾回收?

垃圾回收是Java中自動內存管理的另外一種叫法。垃圾回收的目的是爲程序保持儘量多的可用堆(heap)。 JVM會刪除堆上再也不須要從堆引用的。

用一個例子解釋垃圾回收?

比方說,下面這個方法就會從函數調用。

void method() {
    Calendar calendar = new GregorianCalendar(2000, 10, 30);
    System.out.println(calendar);
}

經過函數第一行代碼中參考變量calendar,在堆上建立了GregorianCalendar類的一個對象。

函數結束執行後,引用變量calendar再也不有效。所以,在方法中沒有建立引用到對象。

JVM認識到這一點,會從堆中刪除對象。這就是所謂的垃圾回收。

何時運行垃圾回收?

垃圾回收在JVM突發奇想和心血來潮時運行(沒有那麼糟糕)。運行垃圾收集的可能狀況是:

  • 堆可用內存不足

  • CPU空閒

垃圾回收的最佳作法?

用編程的方式,咱們能夠要求(記住這只是一個請求——不是一個命令)JVM經過調用System.gc()方法來運行垃圾回收。

當內存已滿,且堆上沒有對象可用於垃圾回收時,JVM可能會拋出OutOfMemoryException。

對象在被垃圾回收,即在堆上被刪除以前,會運行finalize()方法。咱們建議不要用finalize()方法寫任何代碼。

什麼是初始化數據塊?

初始化數據塊——當建立對象加載類時運行的代碼。

有兩種類型的初始化數據塊:

靜態初始化器:加載類時運行的的代碼。

實例初始化器:建立新對象時運行的代碼。

什麼是靜態初始化器?

請看下面的例子:static{ }之間的代碼被稱爲靜態初始化器。它只有在第一次加載類時運行。只有靜態變量才能夠在靜態初始化器中進行訪問。雖然建立了三個實例,但靜態初始化器只運行一次。

public class InitializerExamples {
    static int count;
    int i;

    static {
        //This is a static initializers. Run only when Class is first loaded.
        //Only static variables can be accessed
        System.out.println("Static Initializer");
        //i = 6;//COMPILER ERROR
        System.out.println("Count when Static Initializer is run is " + count);
    }

    public static void main(String[] args) {
        InitializerExamples example = new InitializerExamples();
        InitializerExamples example2 = new InitializerExamples();
        InitializerExamples example3 = new InitializerExamples();
    }
}

示例輸出

Static Initializer
Count when Static Initializer is run is 0.

什麼是實例初始化塊?

讓咱們來看一個例子:每次建立類的實例時,實例初始化器中的代碼都會運行。

public class InitializerExamples {
    static int count;
    int i;
    {
        //This is an instance initializers. Run every time an object is created.
        //static and instance variables can be accessed
        System.out.println("Instance Initializer");
        i = 6;
        count = count + 1;
        System.out.println("Count when Instance Initializer is run is " + count);
    }

    public static void main(String[] args) {
        InitializerExamples example = new InitializerExamples();
        InitializerExamples example1 = new InitializerExamples();
        InitializerExamples example2 = new InitializerExamples();
    }
}

示例輸出

Instance Initializer
      Count when Instance Initializer is run is 1
      Instance Initializer
      Count when Instance Initializer is run is 2
      Instance Initializer
      Count when Instance Initializer is run is 3

什麼是正則表達式?

正則表達式能讓解析掃描分割字符串變得很是容易。Java中經常使用的正則表達式——Patter,Matcher和Scanner類。

什麼是令牌化?

令牌化是指在分隔符的基礎上將一個字符串分割爲若干個字符串。例如,分隔符;分割字符串ac;bd;def;e爲四個子字符串acbddefe

分隔符自身也能夠是一個常見正則表達式。

String.split(regex)函數將regex做爲參數。

給出令牌化的例子?

private static void tokenize(String string,String regex) {
    String[] tokens = string.split(regex);
    System.out.println(Arrays.toString(tokens));
}

tokenize("ac;bd;def;e",";");//[ac, bd, def, e]

如何使用掃描器類(Scanner Class)令牌化?

private static void tokenizeUsingScanner(String string,String regex) {
    Scanner scanner = new Scanner(string);
    scanner.useDelimiter(regex);
    List<String> matches = new ArrayList<String>();
    while(scanner.hasNext()){
        matches.add(scanner.next());
    }
    System.out.println(matches);
}

tokenizeUsingScanner("ac;bd;def;e",";");//[ac, bd, def, e]

如何添加小時(hour)到一個日期對象(Date Objects)?

如今,讓咱們如何看看添加小時到一個date對象。全部在date上的日期操做都須要經過添加毫秒到date才能完成。例如,若是咱們想增長6個小時,那麼咱們須要將6小時換算成毫秒。6小時= 6 * 60 * 60 * 1000毫秒。請看如下的例子。

Date date = new Date();

//Increase time by 6 hrs
date.setTime(date.getTime() + 6 * 60 * 60 * 1000);
System.out.println(date);

//Decrease time by 6 hrs
date = new Date();
date.setTime(date.getTime() - 6 * 60 * 60 * 1000);
System.out.println(date);

如何格式化日期對象?

格式化日期須要使用DateFormat類完成。讓咱們看幾個例子。

//Formatting Dates
System.out.println(DateFormat.getInstance().format(
        date));//10/16/12 5:18 AM

帶有區域設置的格式化日期以下所示:

System.out.println(DateFormat.getDateInstance(
        DateFormat.FULL, new Locale("it", "IT"))
        .format(date));//marted&ldquo; 16 ottobre 2012

System.out.println(DateFormat.getDateInstance(
        DateFormat.FULL, Locale.ITALIAN)
        .format(date));//marted&ldquo; 16 ottobre 2012

//This uses default locale US
System.out.println(DateFormat.getDateInstance(
        DateFormat.FULL).format(date));//Tuesday, October 16, 2012

System.out.println(DateFormat.getDateInstance()
        .format(date));//Oct 16, 2012
System.out.println(DateFormat.getDateInstance(
        DateFormat.SHORT).format(date));//10/16/12
System.out.println(DateFormat.getDateInstance(
        DateFormat.MEDIUM).format(date));//Oct 16, 2012

System.out.println(DateFormat.getDateInstance(
        DateFormat.LONG).format(date));//October 16, 2012

Java中日曆類(Calendar Class)的用途?

Calendar類(Youtube視頻連接 - https://www.youtube.com/watch?v=hvnlYbt1ve0)在Java中用於處理日期。Calendar類提供了增長和減小天數、月數和年數的簡便方法。它還提供了不少與日期有關的細節(這一年的哪一天?哪一週?等等)

如何在Java中獲取日曆類(Calendar Class)的實例?

Calendar類不能經過使用new Calendar建立。獲得Calendar類實例的最好辦法是在Calendar中使用getInstance() static方法。

//Calendar calendar = new Calendar(); //COMPILER ERROR
Calendar calendar = Calendar.getInstance();

解釋一些日曆類(Calendar Class)中的重要方法?

在Calendar對象上設置日(day),月(month)或年(year)不難。對DayMonth或Year調用恰當Constant的set方法。下一個參數就是值。

calendar.set(Calendar.DATE, 24);
calendar.set(Calendar.MONTH, 8);//8 - September
calendar.set(Calendar.YEAR, 2010);

calendar get方法

要獲取一個特定日期的信息——2010年9月24日。咱們可使用calendar get方法。已被傳遞的參數表示咱們但願從calendar中得到的值—— 天或月或年或……你能夠從calendar獲取的值舉例以下:

System.out.println(calendar.get(Calendar.YEAR));//2010
System.out.println(calendar.get(Calendar.MONTH));//8
System.out.println(calendar.get(Calendar.DATE));//24
System.out.println(calendar.get(Calendar.WEEK_OF_MONTH));//4
System.out.println(calendar.get(Calendar.WEEK_OF_YEAR));//39
System.out.println(calendar.get(Calendar.DAY_OF_YEAR));//267
System.out.println(calendar.getFirstDayOfWeek());//1 -> Calendar.SUNDAY

數字格式化類(Number Format Class)的用途?

數字格式用於格式化數字到不一樣的區域和不一樣格式中。

使用默認語言環境的數字格式

System.out.println(NumberFormat.getInstance().format(321.24f));//321.24

使用區域設置的數字格式

使用荷蘭語言環境格式化數字:

System.out.println(NumberFormat.getInstance(new Locale("nl")).format(4032.3f));//4.032,3

使用德國語言環境格式化數字:

System.out.println(NumberFormat.getInstance(Locale.GERMANY).format(4032.3f));//4.032,3

使用默認語言環境格式化貨幣

System.out.println(NumberFormat.getCurrencyInstance().format(40324.31f));//$40,324.31

使用區域設置格式化貨幣

使用荷蘭語言環境格式化貨幣:

System.out.println(NumberFormat.getCurrencyInstance(new Locale("nl")).format(40324.31f));//? 40.324,31

許可證

這篇文章,以及任何相關的源代碼和文件,依據The Code Project Open License (CPOL)。

相關文章
相關標籤/搜索