為了賬號安全,請及時綁定郵箱和手機立即綁定

20個高級Java面試題匯總

2015.08.03 18:19 35291瀏覽

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

程序員面試指南:https://www.youtube.com/watch?v=0xcgzUdTO5M
Java面試問題集合指南:https://www.youtube.com/watch?v=GnR4hCvEIJQ


  1. 什么是可變參數?
  2. 斷言的用途?
  3. 什么時候使用斷言?
  4. 什么是垃圾回收?
  5. 用一個例子解釋垃圾回收?
  6. 什么時候運行垃圾回收?
  7. 垃圾回收的最佳做法?
  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“ 16 ottobre 2012

System.out.println(DateFormat.getDateInstance(
        DateFormat.FULL, Locale.ITALIAN)
        .format(date));//marted“ 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)不難。對DayMonthYear調用恰當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)。


譯文鏈接:http://www.codeceo.com/article/20-java-advanced-interview-questions.html
英文原文:Advanced Java Interview Questions

點擊查看更多內容
230人點贊

若覺得本文不錯,就分享一下吧!

評論

相關文章推薦

正在加載中
意見反饋 幫助中心 APP下載
官方微信

舉報

0/150
提交
取消
优购网200元优惠券