Java基礎面試題突擊1
|
文章導讀目錄
|
JDK
:java development kit (java開發(fā)工具),JDK 是用于開發(fā) Java 程序的最小環(huán)境。
JRE
:java runtime environment (java運行時環(huán)境),是提供給 Java 程序運行的最小環(huán)境。
JRE是java運行時環(huán)境而JDK是java開發(fā)工具包。運行java程序只需安裝JRE。如果需要編寫java程序,需要安裝JDK。但是JRE可以獨立安裝。
JDK包含JRE,同時還包含了編譯 Java 源碼的編譯器 Javac,還包含了很多 Java 程序調試和分析的工具。
JRE包含了java虛擬機、java基礎類庫。是使用java語言編寫的程序運行所需要的軟件環(huán)境,是提供給想運行java程序的用戶使用的。

二、Java為什么能跨平臺?Tip:mac怎么查看jdk目錄呢?
終端輸入:/usr/libexec/java_home -V會顯示jdk版本和所在目錄
command + shift +G前往要去的路徑
Java是跨平臺的原因是因為Java代碼是運行在JVM上的,而不是直接運行在操作系統(tǒng)上。
這意味著,Java程序的代碼不會直接與操作系統(tǒng)交互,而是通過JVM來間接交互。java是半編譯語言,java源程序在經(jīng)過java編譯器編譯后成為java字節(jié)碼文件,再由運行在不同平臺上的虛擬機(例如:windows、Linnux)將相同的字節(jié)碼解釋運行,轉換成具體平臺上的機器指令。從而實現(xiàn)了一次編寫,到處運行。

1、Java中數(shù)據(jù)類型

2、八大基本數(shù)據(jù)類型
-
整型的byte、short、int、long;
-
字符型的char;
-
浮點型的float、double;
-
布爾型的boolean。
將6種數(shù)據(jù)類型按取值范圍的大小順序排列一下:
double > float >
long > int > short > byte
1)數(shù)據(jù)類型轉換
取值范圍從小轉換到大,是可以直接轉換的,
在自動類型轉化中、int–> float、long–> float、long–> double、float --> double
可能精度損失外,自動轉換不會出現(xiàn)任何運行時異常。而從大轉成小,則必須使用強制轉換。
2)類型提升
在表達式計算過程中會發(fā)生類型轉換,這些類型轉換就是類型提升,類型提升規(guī)則如下:
所有 byte/short/char 的表達式都會被提升為 int
除以上類型,其他類型在表達式中,都會被提升為取值范圍大的那個類型,例如有一個操作數(shù)為double,整個表達式都會被提升為double
3)基本數(shù)據(jù)內存中分配
基本數(shù)據(jù)類型它存放于“?!敝卸皇谴娣庞凇岸选敝小?/span>
4)值的初始化
當基本數(shù)據(jù)類型作為類成員變量時,java 會對其進行初始化。且初始化的值分別為

而局部變量 在沒有被顯示初始化情況下,jdk 同樣也會自動賦予他默認值,可不同之處就在于,你無法引用他,因為編譯器會在你要引用的位置報錯。

1、異常分類
異常:執(zhí)行中發(fā)生的不正常情況。
Throwable 是 Java 語言中所有錯誤或異常的超類。下一層分為?
Error
?和?
Exception
Error:JVM系統(tǒng)內部錯誤、資源耗盡等嚴重情況。比如Stack OverflowError和 Out Of Memory。
Exception:空指針訪問、試圖讀取不存在的文件、網(wǎng)絡連接中斷、數(shù)組下標越界等。
程序執(zhí)行過程,是先編譯后執(zhí)行。所以從程序執(zhí)行的過程可以將異常進一步分為:
編譯時異常:執(zhí)行javac.exe命名時,可能出現(xiàn)的異常
運行時異常:執(zhí)行java.exe命名時,出現(xiàn)的異常

2、異常的處理方式
1)遇到問題不進行具體處理,而是繼續(xù)拋給調用者 (throw,throws)
拋出異常有三種形式,一是 throw,一個 throws,還有一種系統(tǒng)自動拋異常。
public static void main(String[] args) {
String s = "abc";
if(s.equals("abc")) {
throw new NumberFormatException();
} else {
System.out.println(s);
}
}
int div(int a,int b) throws Exception{
return a/b;}
2)try catch 捕獲異常針對性處理方式
3、Throw 和 throws 的區(qū)別
1)位置不同
throws 用在函數(shù)上,后面跟的是異常類,可以跟多個;而 throw 用在函數(shù)內,后面跟的 是異常對象。
2)功能不同
throws 用來聲明異常,讓調用者只知道該功能可能出現(xiàn)的問題,可以給出預先的處理方式;throw 拋出具體的問題對象,執(zhí)行到 throw,功能就已經(jīng)結束了,跳轉到調用者,并將具體的問題對象拋給調用者。也就是說 throw 語句獨立存在時,下面不要定義其他語句,因為執(zhí)行不到。
throws 表示出現(xiàn)異常的一種可能性,并不一定會發(fā)生這些異常;throw 則是拋出了異常,執(zhí)行 throw 則一定拋出了某種異常對象。
兩者都是消極處理異常的方式,只是拋出或者可能拋出異常,但是不會由函數(shù)去處理異常,真正的處理異常由函數(shù)的上層調用處理。
五、== 和 equals 的區(qū)別是什么?
== 對于基本類型:比較的是值是否相同;
對于引用類型:比較的是引用是否相同;
關聯(lián)知識點:
1、String的比較
String x = "string";
String y = "string";
String z = new String("string");
System.out.println(x== y); // true
System.out.println(x== z); // false
System.out.println(x.equals(y)); // true
System.out.println(x.equals(z)); // true
原因:String 、Integer 等重寫了 Object 的 equals 方法,把引用比較改成了值比較。所以一般情況下 equals 比較的是值是否相等。
2、Integer的比較
Integer a1 = 1;
Integer a2 = 1;
Integer b1 = 128;
Integer b2 = 128;
System.out.println(al== a2); //true
System.out.println(b1== b2); //false
原因:Integer類內部通過靜態(tài)內部類提供了一個緩存池,范圍在-128~127之間,如果超過這個范圍 Integer值都是new出來的新對象。
Integer的valueOf方法的具體實現(xiàn):
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
其中IntegerCache類的實現(xiàn)為:
private static class IntegerCache {
static final int high;
static final Integer cache[];
static {
final int low = -128;
// high value may be configured by property
int h = 127;
if (integerCacheHighPropValue != null) {
// Use Long.decode here to avoid invoking methods that
// require Integer's autoboxing cache to be initialized
int i = Long.decode(integerCacheHighPropValue).intValue();
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - -low);
}
high = h;
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
}
private IntegerCache() {}
}
從這2段代碼可以看出,在通過valueOf方法創(chuàng)建Integer對象的時候,如果數(shù)值在[-128,127]之間,
便返回指向IntegerCache.cache中已經(jīng)存在的對象的引用;否則創(chuàng)建一個新的Integer對象。
3、兩個對象的 hashCode() 相同,則 equals() 也一定為 true,對嗎?
不對。我們兩個字符串的哈希值很可能一樣,但是反過來不一定成立。
String str1 = "通話";
String str2 = "重地";
System. out. println(String. format("str1:%d | str2:%d", str1. hashCode(),str2. hashCode()));
System. out. println(str1. equals(str2));
執(zhí)行的結果:
str1:1179395 | str2:1179395
false
六、創(chuàng)建對象的幾種方法
1、new關鍵字
使用new關鍵字創(chuàng)建對象,是最常見也是最簡單的創(chuàng)建對象的方式。
2、Class 對象的 newInstance()
使用Class對象的newInstance()方法來創(chuàng)建該 Class 對象對應類的實例,但是這種方法要求該Class對象對應的類有默認的空構造器。
3、調用 Constructor 對象的 newInstance()
先使用 Class 對象獲取指定的 Constructor 對象,再調用 Constructor 對象的newInstance()方法來創(chuàng)建 Class 對象對應類的實例,通過這種方法可以選定構造方法創(chuàng)建實例。
//獲取 Person 類的 Class 對象
Class clazz=Class.forName("reflection.Person");
//使用.newInstane 方法創(chuàng)建對象
Person p=(Person) clazz.newInstance();
//獲取構造方法并創(chuàng)建對象
Constructor c=clazz.getDeclaredConstructor(String.class,String.class,int.class);
//創(chuàng)建對象并設置屬性
Person p1=(Person) c.newInstance("測試","男",10);
4、Clone
無論何時我們調用一個對象的clone方法,JVM就會創(chuàng)建一個新的對象,將前面的對象的內容全部拷貝進去,用clone方法創(chuàng)建對象并不會調用任何構造函數(shù)。
5、反序列化
當我們序列化和反序列化一個對象,JVM會給我們創(chuàng)建一個單獨的對象。在反序列化時,JVM創(chuàng)建對象并不會調用任何構造函數(shù)。
七、重載和重寫1、重寫(Override)
從字面上看,重寫就是重新寫一遍的意思。其實就是在子類中把父類本身有的方法重新寫一遍。子類繼承了父類原有的方法,但有時子類并不想原封不動的繼承父類中的某個方法,所以在方法名, 參數(shù)列表,返回類型(除過子類中方法的返回值是父類中方法返回值的子類時)都相同的情況下, 對方法體進行修改或重寫,這就是重寫。但要注意子類函數(shù)的訪問修飾權限不能少于父類的。
public class Father {
public static void main(String[] args) {
// TODO Auto-generated method stub
Son s = new Son();
s.sayHello();
}
public void sayHello() {
System.out.println("Hello");
}
}
class Son extends Father{
@Override
public void sayHello() {
// TODO Auto-generated method stub
System.out.println("hello by ");
}
}
重寫總結:
1.發(fā)生在父類與子類之間
2.方法名,參數(shù)列表,返回類型(除過子類中方法的返回類型是父類中返回類型的子類)必須相同
3.訪問修飾符的限制一定要大于被重寫方法的訪問修飾符(public>protected>default>private)
4.重寫方法一定不能拋出新的檢查異?;蛘弑缺恢貙懛椒鞲訉挿旱臋z查型異常
2、重載(Overload)
在一個類中,同名的方法如果有不同的參數(shù)列表(參數(shù)類型不同、參數(shù)個數(shù)不同甚至是參數(shù)順序不同)則視為重載。同時,重載對返回類型沒有要求,可以相同也可以不同,但不能通過返回類型是否相同來判斷重載。
public class Father {
public static void main(String[] args) {
// TODO Auto-generated method stub
Father s = new Father();
s.sayHello();
s.sayHello("wintershii");
}
public void sayHello() {
System.out.println("Hello");
}
public void sayHello(String name) {
System.out.println("Hello" + " " + name);
}
}
八、權限修飾符重載總結:
1.重載Overload是一個類中多態(tài)性的一種表現(xiàn)
2.重載要求同名方法的參數(shù)列表不同(參數(shù)類型,參數(shù)個數(shù)甚至是參數(shù)順序)
3.重載的時候,返回值類型可以相同也可以不相同。無法以返回型別作為重載函數(shù)的區(qū)分標準
Java規(guī)定的4種權限 (從小到大排列) : private、缺省(default)、protected、 public
Java權限修飾符public、protected、default、private置于類的成員定義前,用來限定對象對該類成員的訪問權限。

對于class的權限修飾只可以用public和default(缺省)。
public類可以在任意地方被訪問。
default類只可以被同一個包內部的類訪問。
4種權限可以用來修飾類及類的內部結構: 屬性、方法、構造器、內部類
具體的,4種權限都可以用來修飾類的內部結構,屬性、方法、構造器、內部類修飾類的話,只能使用default、 public。
九、String、String StringBuffffer 和 StringBuilder 的區(qū)別是什么?總結封裝性:Java提供了4種權限修飾符來修飾類及類的內部結構,體現(xiàn)類及類的內部結構在被調用時的可見性
String和StringBuffer和StringBuilder的區(qū)別 因為String是不可變的,StringBuffer 和 StringBuilder 它們都是可變的字符串。
String是只讀字符串,它并不是基本數(shù)據(jù)類型,而是一個對象。從底層源碼來看是一個fifinal類型的字符數(shù)組,所引用的字符串不能被改變,一經(jīng)定義,無法再增刪改。每次對String的操作都會生新的String對象。
private final char value[];
StringBuffffer和StringBuilder他們兩都繼承了AbstractStringBuilder抽象類,他們的底層都是可變的字符數(shù)組
/**
* The value is used for character storage.
*/
char[] value;
所以在進行頻繁的字符串操作時,建議使用StringBuffffer和StringBuilder來進行操作。
StringBuffffer 對方法加了同步鎖或者對調用的方法加了同步鎖,所以是
線程安全
;
StringBuilder 并沒有對方法進行加同步鎖,所以是
非線程安全
的。
1、Collection接口
Collection是集合類的上級接口,子接口有 Set、List、LinkedList、ArrayList、Vector、Stack、 Set;

2、Collections集合類
Collections是集合類的一個幫助類, 它包含有各種有關集合操作的靜態(tài)多態(tài)方法,用于實現(xiàn)對各種集合的搜索、排序、線程安全化等操作。此類不能實例化(因為Collections的構造方法被私有化處理了),就像一個工具類,服務于Java的Collection框架, Collections類中的方法都是被static修飾了,可以直接用類名調用。
Collections類常用方法:
-
public static void shuffle(List)。混亂排序
-
public static boolean addAll(Collection c, T… elements)。添加一些元素
-
public static void sort(List list,Comparator<? super T> )。排序,將集合中元素按照指定規(guī)則排序
-
public static <T extends Comparable<? super T>> void sort(List list)。排序,將集合中元素按照默認規(guī)則排序
-
public static int binarySearch(List list, Object key)。查找,使用二分搜索法搜索指定的 List 集合,以獲得指定對象在 List 集合中的索引。如果要使該方法可以正常工作,則必須保證 List 中的元素已經(jīng)處于有序狀態(tài)。
-
public static void copy(List <? super T> dest,List<? extends T> src) 復制, 用于將指定集合中的所有元素復制到另一個集合中。
-
public static void replaceAll()。替換,替換集合中所有的舊元素為新元素。



