標籤:為什麼 oid 基礎類型 sys 獨立 date 區別 回收 完整
* 以下內容是我在準備java面試的時候覺得有用,面試官很可能會問的一些問題
* 內容(除了代碼)詳情來自網路(學習的時候遇到不會的百度的 (*^__^*) )
* 如果大家發現有什麼地方不對,請告訴我。謝啦!!☆⌒(*^-゜)v
1:java的基礎類型
Java語言提供了八種基礎語言
boolean |
char |
byte |
8位 |
short |
|
|
16位 |
int |
float |
|
32位 |
long |
double |
|
64位 |
注意:String本身就是一個對象而不是基礎資料型別 (Elementary Data Type),String的變數名是對String類的引用
2:String、StringBuffer、StringBuilder之間的區別
2.1:三者的執行速度: String<StringBuffer<StringBulider
2.2:String是字串常量,也就是說值是不會改變的,StringBuffer和StringBuilder是字串變數,是可以對值進行操作的。
public class StringTest {
public static void main(String argv[]){
String s = "abc";
s = s+"def";
System.out.println("s="+s);//s=abcdef
/*
* 我們明明就是改變了String型的變數s的,為什麼說是沒有改變呢?
* 其實這是一種欺騙,JVM是這樣解析這段代碼的:
* 首先建立對象s,賦予一個abc
* 然後再建立一個新的對象s用來執行第二行代碼,
* 也就是說我們之前對象s並沒有變化,所以我們說String類型是不可改變的對象了,
* 由於這種機制,每當用String操作字串時,實際上是在不斷的建立新的對象,
* 而原來的對象就會變為垃圾被GC回收掉,可想而知這樣執行效率會有多低。
*/
}
}
2.3:StringBulider和StringBuffer的區別
StringBulider是線程非安全的,StringBuffer是安全執行緒的。JVM不能保證StringBuilder操作是安全的,雖然他速度快,但可以保證StringBuffer是可以確定操作的。但是因為大多數操作是在單線程環境下完成的,所以大多數情況下建議使用StringBuilder是因為速度問題。
2.4:對三者進行總結:如果操作少量的資料,使用String
單線程操作字串緩衝區下大量的資料使用StringBulider
多線程操作字串緩衝區下大量的資料使用StringBuffer
3:類型之間的轉換
public class StringTest {
public static void main(String argv[]){
//String轉化為int float double
String s = "123";
int i=Integer.parseInt(s);
float f = Float.parseFloat(s);
double d = Double.parseDouble(s);
System.out.println("i="+i+" f="+f+" d="+d);
System.out.println(Integer.valueOf(s));
//注意:雖然valueOf也可以將字串轉化為int等,但是valueOf調用的是parse的方法,返回的是已經封裝的對象,如Integer等
//將int float double轉化為String
String s1 = String.valueOf(i);
String s2 = String.valueOf(f);
String s3 = String.valueOf(d);
System.out.println("s1="+s1+" s2="+s2+" s3="+s3);
}
}
4:日期的用法
4.1:calendar和Date的區別
Date是類,Calendar是抽象類別。在JDK1.0中,Date是唯一的代表時間的類,但因為Date不變實現國際化,所以JDK1.1版本開始,推薦使用Calendar類進行時間和日期的處理。
import java.util.Calendar;
import java.util.Date;
public class DateTest {
public static void main(String argv[]){
Calendar calendar = Calendar.getInstance();
Date date = calendar.getTime();
//Sun Jul 23 10:33:44 CST 2017(解釋:星期天 7月 23號 10點33分44秒 2017年)
System.out.println(date);
//擷取年月
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH)+1;//日期是0~11 所以要加1
System.out.println("year="+year+" month="+month);//year=2017 month=7
//擷取日期
int day1 = calendar.get(Calendar.DAY_OF_YEAR);//本年的第204天
int day2 = calendar.get(Calendar.DAY_OF_MONTH);//這個月的第23天
int day3 = calendar.get(Calendar.DAY_OF_WEEK);//本周第一天(每周星期天開始)
int day4 = calendar.get(Calendar.DATE);
System.out.println("day1="+day1+" day2="+day2+" day3="+day3+" day4="+day4);//day1=204 day2=23 day3=1 day4=23
//擷取時分秒
int hour1 = calendar.get(Calendar.HOUR_OF_DAY);
int hour2 = calendar.get(Calendar.HOUR);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);
//hour1=10 hour2=10 minute=59 second=26 10點59分26秒
System.out.println("hour1="+hour1+" hour2="+hour2+" minute="+minute+" second="+second);
}
}
4.2:DateFormat和SimpleDateFormat的區別
DateFormat可以直接使用、但其本身是一個抽象類別,可以根據Locate指定的地區得到不同的日期顯示效果。SimpleDateFormat是DateFormat的子類,一般情況下DateFormat類很少直接使用,而都是由SimpleDateFormat類完成。
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class DateTest {
public static void main(String argv[]){
Calendar calendar = Calendar.getInstance();
Date date = calendar.getTime();
DateFormat df1 = DateFormat.getDateInstance();
DateFormat df2 = DateFormat.getDateTimeInstance();
System.out.println(df1.format(date));//2017-7-23
System.out.println(df2.format(date));//2017-7-23 12:18:51
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年mm月dd日");
System.out.println(sdf.format(date));//2017年18月23日
}
}
5:集合List Set Map的區別
集合List有序,其中的元素可以重複
集合Set無序,其中元素不可以重複
集合Map是一種把鍵對象和值對象映射的集合,每個元素都包含一個鍵和一個值,鍵不允許重複,但是可以將任意多個鍵獨享映射到一個值對象上。
6:檔案
我對檔案非常不熟悉,所以這塊會單獨列出來_(:зゝ∠)_
7:物件導向編程的特性
7.1:封裝
封裝即把對象的屬性饑餓操作結合成為一個獨立的整體,並儘可能的隱藏對象內部實現細節
public class User {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
這是一個典型的封裝案例,user類的屬性id和name都是用private隱藏起來了的,只能通過get和set方法來對屬性進行操作
7.2:抽象
使用了關鍵詞abstract聲明的類叫作“抽象類別”。如果一個類裡包含了一個或多個抽象方法,類就必須指定成abstract(抽象)。“抽象方法”,屬於一種不完整的方法,只含有一個聲明,沒有方法主體。
public abstract class AbstractTest {
public abstract void get();
public String set(){
return "這是一個抽象類別";
}
}
7.3:繼承
繼承是物件導向最顯著的一個特性。繼承是從已有的類中派生出新的類,新的類能吸收已有類的資料屬性和行為,並能擴充新的能力
public class TestExtends {
public static void main(String argv[]){
B b = new B();
b.get();
//測試結果:正在執行子類…… 這是父類
}
}
class A{
public String toString(){
return "這是父類";
}
}
class B extends A{
public void get(){
System.out.print("正在執行子類…… "+toString());
}
}
7.4:多態
多態可以分成編譯多態(主要體現在重載上面)和運行多態(主要體現在繼承上面)
8:重載和重寫的區別
重載是同一個類裡面有相同名稱不同參數列表的方法
重寫是子類裡面建立一個除了方法體其餘的(方法名,參數列表,傳回值)都和父類一樣的方法,覆蓋父類方法
需要注意的是一個重寫的方法不能拋除沒有在基類中定義的非運行時異常,但是它可以拋出沒有在基類中定義的運行時異常
原因:1:就算有運行時異常也是可以通過編譯的,而如果出現非運行時異常就必須進行處理(throws或者try{}catch{})
2:子類重寫父類方法所拋出的一場不能超過父類的範疇
9:介面和抽象類別的區別
9.1:抽象類別裡面的方法可以有具體實現,但介面裡面所有的方法都是抽象方法。
9.2:抽象類別可以有構造器,介面不能有構造器
9.3:抽象方法可以有public、protected和default這些修飾符,但是介面只能使用public修飾符
9.4:抽象方法可以繼承一個類和實現多個介面,介面只可以繼承一個或多個其它介面
未完待續……O(∩_∩)O~~
java基礎面試