首頁>技術>

1.JDK和JRE的區別?JDK:Java Development Kit 的簡稱,Java 開發工具包,提供了 Java 的開發環境和執行環境。JRE:Java Runtime Environment 的簡稱,Java 執行環境,為 Java 的執行提供了所需環境。2.==和equals的區別?基本型別:比較的是值是否相同;引用型別:比較的是引用是否相同;

String str1 = "abc"; String str2 = "abc"; System.out.println(str1==str2);//true String str3 =newString("abc"); String str4 =newString ("abc");System.out.println(str3==str4);//falseSystem.out.println(str3.equals(str4));//true1234567

解析:equals 本質上就是 ==,只不過 String 和 Integer 等重寫了 equals 方法,把它變成了值比較。PS:

Integer i1 = 100, i2 = 100;Integer i3 = 1000, i3 = 1000;System.out.println(i1==i2);//trueSystem.out.println(i3==i4);//false1234

解析:在整數的包裝類當中,在第一次建立Integer 類的物件的時候,都會首先建立好快取陣列。當需要包裝的 值是在IntegerCache陣列當中的元素的時候,就會返回陣列當中的Integer 物件。JVM 預設就會設定陣列的範圍為-128 ~ 127 。如下:

@HotSpotIntrinsicCandidatepublic static Integer valueOf(int i) {    if (i >= IntegerCache.low && i <= IntegerCache.high)        return IntegerCache.cache[i + (-IntegerCache.low)];    return new Integer(i);}123456
3.Java基本資料型別
byte short int long float double char boolean, String屬於物件。1
4.兩個物件的 hashCode()相同,則 equals()也一定為 true,對嗎?

不對,兩個物件的 hashCode()相同,equals()不一定 true。

5. final 在 java 中有什麼作用?final 修飾的類叫最終類,該類不能被繼承。final 修飾的方法不能被重寫。final 修飾的變數叫常量,常量必須初始化,初始化之後值就不能被修改。6. java 中的 Math.round(-1.5) 等於多少?

等於 -1,因為在數軸上取值時,中間值(0.5)向右取整,所以正 0.5 是往上取整,負 0.5 是直接捨棄。

7.String、StringBuffer、StringBuilder的區別?

String是字串常量,final修飾;StringBuffer字串變數(執行緒安全);StringBuilder 字串變數(執行緒不安全).此外StringBuilder和StringBuffer實現原理一樣,都是基於陣列擴容來實現的. StringBuffer和StringBuilder的實現原理一樣,其父類都是AbstractStringBuilder.StringBuffer是執行緒安全的,StringBuilder是JDK 1.5新增的,其功能和StringBuffer類似,但是非執行緒安全.因此,在沒有多執行緒問題的前提下,使用StringBuilder會取得更好的效能.

8. String str="i"與 String str=new String(“i”)一樣嗎?

不一樣,因為記憶體的分配方式不一樣。String str="i"的方式,java 虛擬機器會將其分配到常量池中;而 String str=new String(“i”) 則會被分到堆記憶體中。

9. 如何將字串反轉?

1)使用 StringBuilder 或者 StringBuffer 的 reverse() 方法。

String str = "abcdefg";StringBuffer stringBuffer = new StringBuffer(str);StringBuilder stringBuilder = new StringBuilder(str);System.out.println(stringBuffer.reverse());System.out.println(stringBuilder.reverse());12345

2)使用String物件的toCharArray()方法,將字串轉換為char[]陣列,然後逆向遍歷並拼接。

String str = "abcdefg";StringBuilder strNew =new StringBuilder();char[] chars = str.toCharArray();for(int i = chars.length -1; i >= 0; i--){    strNew.append(chars[i]);}123456

3)使用String物件的charAt方法逐個獲取字元,正向遍歷,逆向拼接

String str = "abcdefg";StringBuilder strNew =new StringBuilder();for (int i = 0; i < str.length(); i++) {    strNew.insert(0, str.charAt(i));}12345
10.String類的常用方法有哪些?indexOf():返回指定字元的索引。charAt():返回指定索引處的字元。replace():字串替換。trim():去除字串兩端空白。split():分割字串,返回一個分割後的字串陣列。getBytes():返回字串的 byte 型別陣列。length():返回字串長度。toLowerCase():將字串轉成小寫字母。toUpperCase():將字串轉成大寫字元。substring():擷取字串。equals():字串比較。11.普通類和抽象類的區別?抽象類可以用final修飾嗎?抽象類和介面的區別?

1)普通類不能有抽象方法,抽象類可以有也可以沒有抽象方法,抽象類不能直接例項化,普通類可以。 2)抽象類不能用final修飾,因為抽象類的定義就是為了被繼承。 3)抽象類和介面的區別: 抽象類使用extends繼承,介面使用implements實現; 抽象類可以有建構函式,介面不能有; 抽象類可以有非抽象介面,介面不能有(java8之後可以有了) 類可以實現多個介面,但是隻能繼承一個類; 介面中的方法預設使用public訪問修飾符,抽象類中的方法可以任意訪問修飾符(抽象方法不能使用private)

12.Java中的IO流分為幾種?按功能劃分:輸入流、輸出流;按型別劃分:位元組流、字元流,位元組流按8為傳輸以位元組為單位,字元流按16為傳輸以字元為單位;13.BIO、NIO、AIO有什麼區別?BIO:Block IO同步阻塞式IO,即傳統IO,特點是使用簡單,併發處理能力低。NIO:Non IO同步非阻塞IO,傳統IO的升級,客戶端和服務端透過Channel通訊,實現了多路複用。AIO:Asynchronous IO是NIO的升級,也叫NIO2,實現了非同步非阻塞IO,非同步IO的操作基於事件和回撥機制。14.Files的常用方法都有哪些?Files.exists():檢測檔案路徑是否存在;Files.createFile():建立檔案;Files.createDirectory():建立資料夾;Files.delete():刪除一個檔案或目錄;Files.copy():複製檔案;Files.move():移動檔案;Files.size():檢視檔案個數;Files.read():讀取檔案;Files.write():寫入檔案;15.面向物件的特徵

封裝、繼承、多型

16.父類的靜態方法能否被子類重寫

不能.重寫只適用於例項方法,不能用於靜態方法,而子類當中含有和父類相同簽名的靜態方法。

17.什麼是不可變物件?好處是什麼?

不可變物件指物件一旦被建立,狀態就不能再改變,任何修改都會建立一個新的物件,如 String、Integer及其它包裝類.不可變物件最大的好處是執行緒安全.

18.靜態變數和例項變數的區別?

靜態變數儲存在方法區,屬於類所有.例項變數儲存在堆當中,其引用存在當前執行緒棧.需要注意的是從JDK1.8開始用於實現方法區的PermSpace被MetaSpace取代了.

19.java 建立物件的幾種方式new建立新物件透過反射機制採用clone機制透過序列化機制

PS:前兩者都需要顯式地呼叫構造方法. 對於clone機制,需要注意淺複製和深複製的區別,對於序列化機制需要明確其實現原理,在java中序列化可以透過實現Externalizable或者Serializable來實現.

20.Object中有哪些公共方法?

equals(),clone(),getClass(),notify(),notifyAll(),wait(),toString()

21.& 和 &&的區別

基礎的概念不能弄混:&是位操作,&&是邏輯運算子.需要記住邏輯運算子具有短路特性,而&不具備短路特性.

22.在.java檔案內部可以有多少類(非內部類)?

在一個java檔案中只能有一個public公共類,但是可以有多個default修飾的類.

23.如何正確的退出多層巢狀迴圈?使用標號和break;透過在外層迴圈中新增識別符號24.final,finalize()和finally{}的不同之處

三者沒有任何相關性,遇到有問著問題的面試官就拖出去砍了吧.

final是一個修飾符,用於修飾變數,方法和類.如果 final 修飾變數,意味著該變數的值在初始化後不能被改變.finalize()方法是在物件被回收之前呼叫的方法,給物件自己最後一個復活的機會.但是該方法由Finalizer執行緒呼叫,但呼叫時機無法保證.finally是一個關鍵字,與 try和catch一起用於異常的處理,finally{}一定會被執行,在此處我們通常用於資源關閉操作.25.clone()是哪個類的方法?

java.lang.Cloneable 是一個標示性介面,不包含任何方法.clone ()方法在 Object 類中定義的一個Native方法:

protected NativeObject clone() throws CloneNotSupportedException;1
26.深複製和淺複製的區別是什麼?淺複製:被複制物件的所有變數都含有與原來的物件相同的值,而所有的對其他物件的引用仍然指向原來的物件.換言之,淺複製僅僅複製所考慮的物件,而不復制它所引用的物件.深複製:被複制物件的所有變數都含有與原來的物件相同的值.而那些引用其他物件的變數將指向被複制過的新物件.而不再是原有的那些被引用的物件.換言之.深複製把要複製的物件所引用的物件都複製了一遍.27.64位的JVM當中,int的長度是多少?

Java中資料型別所佔用的位數和平臺無關,在 32 位和64位 的Java 虛擬機器中,int 型別的長度都是佔4位元組. PS:short(2)、int(4)、long(8)、float(4)、double(8)

28.int和Integer的區別?

Integer是int的包裝型別,在拆箱和裝箱中,二者自動轉換.int是基本型別,直接存數值;而integer是物件;用一個引用指向這個物件.由於Integer是一個物件,在JVM中物件需要一定的資料結構進行描述,相比int而言,其佔用的記憶體更大一些.

29.String s = new String(“abc”)建立了幾個String物件?

2個.一個是字串字面常數,在字串常量池中;另一個是new出來的字串物件,在堆中.

30.請問s1s3是true還是false,s1s4是false還是true?s1==s5呢?
String s1 = "abc";String s2 = "a";String s3 = s2 + "bc";String s4 = "a" + "bc";String s5 = s3.intern();s1==s3返回false,s1==s4返回true,s1==s5返回true.123456

解析:

“abc"這個字串常量值會直接方法字串常量池中,s1是對其的引用.由於s2是個變數,編譯器在編譯期間無法確定該變數後續會不會改,因此無法直接將s3的值在編譯器計算出來,因此s3是堆中"abc"的引用.因此s1!=s3.對於s4而言,其賦值號右邊是常量表達式,因此可以在編譯階段直接被最佳化為"abc”,由於"abc"已經在字串常量池中存在,因此s4是對其的引用,此時也就意味s1和s4引用了常量池中的同一個"abc".所以s1==s4.String中的intern()會首先從字串常量池中檢索是否已經存在字面值為"abc"的物件,如果不存在則先將其新增到字串常量池中,否則直接返回已存在字串常量的引用.此處由於"abc"已經存在字串常量池中了,因此s5和s1引用的是同一個字串常量.31.以下程式碼中,s5==s2返回值是什麼?
String s1="ab";String s2="a"+"b";String s3="a";String s4="b";String s5=s3+s4;12345

返回false.在編譯過程中,編譯器會將s2直接最佳化為"ab",將其放置在常量池當中;而s5則是被建立在堆區,相當於s5=new String(“ab”);

32.你對String物件的intern()熟悉麼?

Stirng中的intern()是個Native方法,它會首先從常量池中查詢是否存在該常量值的字串,若不存在則先在常量池中建立,否則直接返回常量池已經存在的字串的引用.

33.什麼是編譯器常量?使用它有什麼風險?

公共靜態不可變,即public static final修飾的變數就是我們所說的編譯期常量.這裡的public可選的.實際上這些變數在編譯時會被替換掉,因為編譯器明確的能推斷出這些變數的值(如果你熟悉C++,那麼這裡就相當於宏替換). 編譯器常量雖然能夠提升效能,但是也存在一定問題:你使用了一個內部的或第三方庫中的公有編譯時常量,但是這個值後面被其他人改變了,但是你的客戶端沒有重新編譯,這意味著你仍然在使用被修改之前的常量值.

34. 3*0.1==0.3返回值是什麼

false,因為有些浮點數不能完全精確的表示出來.

35.java當中使用什麼型別表示價格比較好?

如果不是特別關心記憶體和效能的話,使用BigDecimal.否則使用預定義精度的 double 型別.

36.如何將byte轉為String

可以使用String接收 byte[] 引數的構造器來進行轉換,注意要使用的正確的編碼,否則會使用平臺預設編碼.這個編碼可能跟原來的編碼相同.也可能不同.

String str = new String("abc".getBytes(), StandardCharsets.UTF_8);1
37.可以將int強轉為byte型別麼?會產生什麼問題?

可以做強制轉換,但是Java中int是32位的而byte是8 位的.如果強制轉化int型別的高24位將會被丟棄,byte 型別的範圍是從-128到128.

38.a=a+b與a+=b有什麼區別嗎?

+=運算子會進行隱式自動型別轉換,此處a+=b隱式的將加操作的結果型別強制轉換為持有結果的型別,而a=a+b則不會自動進行型別轉換.如:

#####39.瞭解泛型麼?簡述泛型的上界和下界? 有時候希望傳入的型別有一個指定的範圍,從而可以進行一些特定的操作,這時候就需要萬用字元了?在Java中常見的萬用字元主要有以下幾種:

<?>: 無限制萬用字元;<? extends E>: extends 關鍵字聲明瞭型別的上界,表示引數化的型別可能是所指定的型別,或者是此型別的子類;<? super E>: super關鍵字聲明瞭型別的下界,表示引數化的型別可能是指定的型別,或者是此型別的父類;

它們的目的都是為了使方法介面更為靈活,可以接受更為廣泛的型別;

<? extends E>: 用於靈活讀取,使得方法可以讀取 E 或 E 的任意子型別的容器物件;<? super E>: 用於靈活寫入或比較,使得物件可以寫入父型別的容器,使得父型別的比較方法可以應用於子類物件;

用簡單的一句話來概括就是為了獲得最大限度的靈活性,要在表示生產者或者消費者的輸入引數上使用萬用字元,使用的規則就是:生產者有上限(讀操作使用extends),消費者有下限(寫操作使用super).

11
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 使用VUE+SpringBoot+EasyExcel 匯出