Java冷知識(一)

1.每一個Java程序都必須有main方法嗎?好比web容器應用

答案:是。即便是web容器也有main方法,好比tomcat的Bootstrap類的main方法。java

2.java有無符號(Unsigned)類型嗎?

答案:沒有。web

3.NaN相等問題

double d1 = Double.NaN;
double d3 = d1;
System.out.println("d3 == d1 : " + (d3 == d1));

上面的代碼輸出true仍是false?
答案:false。編程

double d1 = Double.NaN;
double d2 = Double.NaN;
System.out.println("d1 == d2 : " + (d1 == d2));
System.out.println("Double.NaN == Double.NaN : " + (Double.NaN == Double.NaN));

上面的代碼輸出true仍是false?
答案:false。
總結,java中全部的非數值都是不相等的。數組

4.如何判斷一個數是不是NaN?

答案:使用Double.isNaN(double)或Float.isNaN(float)。其實現是一個數不等於本身,就是NAN:tomcat

public static boolean isNaN(double v) {
    return (v != v);
}

5.Java中一個漢字佔用幾個字符?

答案:兩個或四個。在java中char類型用UTF-16描述一個代碼單元。經常使用漢字用一個代碼單元表示。有些漢字用兩個代碼單元表示。一個代碼單元code point包含16bit。ide

6.java8裏char類型佔有幾個字節?使用什麼字符集,使用什麼編碼?能夠保存全部漢字嗎?

char佔用2個字節,使用Unicode字符集,使用UTF-16編碼。有些漢字是存儲不了的。編碼

7.java8裏的String底層是用char[]存儲的,那麼String是如何存儲char放不下的字符的?

實際上是Unicode的設計保證的。爲了將一個WORD的UTF-16編碼與兩個WORD的UTF-16編碼區分開來,Unicode編碼的設計者將0xD800-0xDFFF保留下來,並稱爲代理區(Surrogate)。設計

  • D800-DB7F High Surrogates 高位替代
  • DB80-DBFF

High Private Use Surrogates
高位專用替代代理

  • DC00-DFFF

Low Surrogates
低位替代code

8.你知道Unocide代碼單元(code unit )和代碼點(code point)的區別嗎?或者已知"𤋮"佔用四個字節,你知道下面的代碼輸出是什麼嗎?

String s2 = "𤋮";
System.out.println(s2.getBytes().length);
System.out.println(s2.codePoints().count());
System.out.println(s.length());
System.out.println(s.codePointCount(0, s.length()));

答案:4 、一、 二、1。第一個表明佔用多少字節。第二個表明Unicode代碼點個數,也就是字符個數。第三個表明須要幾個Unicode code units,至關於須要幾個char來存儲。第四個也表明字符個數。

9.請問下面的變量名合法嗎?

int ⅦⅢ齉__8s好;
int αβ;
int IIasdf;
int $as;
int _sdf;
int 9sdf;

答案:除了最後一個不合法,其餘都合法。也就是說下劃線、美圓符、漢字或其餘語言中的字母均可以用來命名變量,而且能夠做爲開頭。阿拉伯數字不能夠做爲開頭。
可使用下面兩個方法來檢測字符是否能夠用來組成變量名或者做爲變量名開頭。

Character.isJavaIdentifierPart('齉');
Character.isJavaIdentifierStart('9');

10.strictfp關鍵字的做用

java但願全部的運算在不一樣的機器上運行結果應該是同樣的,即保證可移植性。例如double w = x y / z; 不少Intel的處理器會把x y 的結果保存在80位寄存器中,再除以z,而後把結果截斷爲64位。這樣能夠獲得一個更精確的結果,並且避免產生溢出。這樣的話就與使用64位寄存器的計算結果不一致。JVM最初規定,全部中間結果都須要截斷,可是遭到數值計算團體的反對。由於截斷不只浪費時間,並且可能致使溢出。最終JVM的設計者,容許中間結果採用擴展的精度。可是對於strictfp關鍵字標記的方法,必須使用嚴格的浮點計算,也就是全部中間值都進行截斷。

11.java中有帶符號左位移(<<<)運算符嗎?

答案:沒有。只有>>> >> <<。

12.下面兩組代碼的區別是什麼?

boolean cond1 = somemethod1();
boolean cond2 = somemethod2()
// 第一組
if(cond1 && cond2){
    ...
}
// 第二組
if(cond1 & cond2){
    ...
}

答案:第一組有阻斷功能;第二組沒有阻斷功能。

13.Math類與StrictMath類的區別?

答案:Math類中有些方法並非嚴格的浮點計算,可是效率較高。StrictMath中都是嚴格的浮點計算。「嚴格」的含義,參考上文中 ++strictfp關鍵字的做用++ 。

14.byte類型+short類型,獲得的是什麼類型?

下面的代碼有問題嗎?

byte b = 1;
short s = b;
short s1 = s + b;

答案:byte類型+short類型,獲得的是int類型。因此第三行代碼報錯。可是能夠自動將byte轉換成short,因此第二行代碼是能夠的。

15.請問下面s1和s2的字符串會保存在字符串池中嗎?

String s1 = "asd" + "qwe";
String s2 = s1.substring(1);
答案:不會。由於只有字符串常量纔會放到字符串池中,而+或substring等操做產生的結果並不會放到字符串池。

16.字符串池裏的字符串再不使用時,是否會GC回收?其底層存儲是什麼?

  • 在jdk7之前,string pool 在Perm Gen空間,且不能被GC回收,只能調大Perm Gen大小。
  • 在jdk7中,移到了堆中,而且沒有被引用的字符串會被gc掉,減小了內存泄漏的風險。字符串池是用相似HashMap的結構實現的。
  • 直到java8,string類型底層仍是使用char數組進行存儲,編碼使用utf-16,以便於每一個字符能夠在內存裏面使用2個byte。
  • 在java9裏面提出來compact string的理念,並在一些狀況下能夠採用byte數組直接存儲字符串,從而節約內存的使用,具體何時用char數組何時用byte數組,依賴於你存儲的內容。

17.goto標籤是否能夠用於if語句或者塊語句?

public class Goto_Demo {

    public static void main(String[] args) {

        inIfBlock(true);
        System.out.println("----------分隔符----");
        inBlock(true);
    }

    private static void inIfBlock(boolean bool){

        結束:
        if(bool){

            System.out.println("in ");
            if(bool){
                break 結束;
            }
            System.out.println("after ");
        } 

        System.out.println("out ");
    }

    private static void inBlock(boolean bool){

        結束:
        {
            System.out.println("in ");
            if(bool){
                break 結束;
            }
            System.out.println("after ");
        }

        System.out.println("out ");
    }
}

以上代碼哪一個方法能夠輸出「after」?
答案:goto標籤能夠用於if語句或塊語句。上面代碼都不會輸出「after」。

18.數組的初始化時長度是否須要給定?長度能夠是變量嗎?長度是否能夠爲0?

答案:數組初始化時,「最外圍的」數組長度必須給定(好比二維數組的最外圍就是行)。長度能夠是變量。長度能夠爲0。注意數組長度爲0與null是不一樣的概念。

int[] arr = new int[2];
int[][] arr2 = new int[2][];
int[] arr3 = new int[0];

19.Arrays的binarySearch(type[] a, type v)的返回值r表明什麼含義?

答案:若是返回值 r>=0,表示找到相應元素,返回的是數組下標值。若是返回值 r<0,則(-r-1)就是插入v元素時,爲保持數組a有序,應該插入的位置。

20.Java支持不規則數組嗎?好比下面代碼報錯嗎?

int[][] arr = {{1, 2, 3}, {4, 5}}

答案:支持,不報錯。由於Java其實是沒有多維數組,只有一維數組。多維數組被解釋成數組的數組。好比,二維數組的每一行是一個一維數組的引用,咱們能夠實現行的互換。

21.使用Thread和Math類須要import嗎?

不用,凡是在java.lang包下的java預約義類,在使用時都不須要import!Java語言中的java.lang包是由編譯器直接自動導入的,所以,編程時使用該包中的類,可省去 import導入。使用其餘包中的類,必須用import導入

相關文章
相關標籤/搜索