JAVA 基礎部分易混淆問題總結

前言

    最近在看了一些java基礎問題,順便將這段時間看到的容易混淆和已忘記的問題進行整理總結一下.java

接下來會再寫一些web方便易混淆或者不經常使用易忘記的問題梳理web

問題列表

    一、== 和 equals區別數組

        ==操做符專門用來比較兩個變量的值是否相等,也就是用於比較變量所對應的內存中所存儲的數值是否相同,要比較兩個基本類型的數據或兩個引用變量是否相等,只能用==操做符。安全

        equals方法是用於比較兩個獨立對象的內容是否相同,就比如去比較兩我的的長相是否相同,它比較的兩個對象是獨立的優化

        舉例spa

Integer aa=new Integer("11");
        Integer bb=new Integer("11");
        Integer cc=11;
        Integer dd=11;
        System.out.println(aa==bb);  // false 緣由aa和bb在內存是不一樣的對象
        System.out.println(aa==cc);  // false  緣由aa和bb在內存是不一樣的對象
        System.out.println(dd==cc);  // true   緣由對Integer,String這類對象直接賦值時,會有一個常量值,也就意味着他們共用了一個內存地址
        System.out.println(aa.equals(bb));  // true  緣由equals是值比較,Integer,String這類對象均重寫了object的equals方法,兩個內存中存的值相等,結果就爲true,一會會附上源碼解析
        System.out.println(aa.equals(cc));  // true  緣由equals是值比較,Integer,String這類對象均重寫了object的equals方法,兩個內存中存的值相等,結果就爲true,一會會附上源碼解析

        

    Integer中重寫的equals源碼解析以下:   線程

    此處使用String重寫的equals源碼會更容易看出值比較, 博主太懶,用Interger寫的例子,不想換成String例子了, 拿好傘,準備當雞蛋,哈哈code

public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();  //會將object對象強轉爲Integer對象,並轉換爲int基本類型
        }
        return false;
    }

    二、做用域public,private,protected,以及不寫時的區別對象

        此問題,一圖解千愁繼承

      

做用域 當前類 同一包(package) 子孫類 其餘包(package)
public
protected ×
不寫 × ×
private × × ×

     三、抽象類和接口有什麼區別

        接口(interface)能夠說成是抽象類的一種特例,接口中的全部方法都必須是抽象的。接口中的方法定義默認爲public abstract類型,接口中的成員變量類型默認爲public static final。

        二者的語法區別:

  • 抽象類和其餘類有些共性便可以有構造方法能夠有普通成員變量,接口中沒有
  • 抽象類中能夠有實現的普通方法,接口中的全部方法必須都是抽象的。
  • 抽象類中的抽象方法的訪問類型能夠是public,protected,但接口中的抽象方法只能是public類型的,而且默認即爲public abstract類型。
  • 抽象類中能夠包含靜態方法,接口中不能包含靜態方法
  • 抽象類和接口中均可以包含靜態成員變量,抽象類中的靜態成員變量的訪問類型能夠任意,但接口中定義的變量只能是public static final類型,而且默認即爲public static final類型。
  • 一個類能夠實現多個接口,但只能繼承一個抽象類。

    四、String s="a"+"b"+"c"+"d"; 這語句建立了幾個對象?

        看一下例子:

        

String aa="a";
        String bb=aa+"b"+"c"+"d";
        String cc="a"+"b"+"c"+"d";
        String dd="abcd";

        System.out.println(aa==dd);  // false
        System.out.println(bb==dd);  // false
        System.out.println(cc==dd);  // true

 結合第三條問題解答,能夠看出String s="a"+"b"+"c"+"d"這條語句java中作了優化處理,等同於String s="abcd"

    五、try {}裏有一個return語句,那麼緊跟在這個try後的finally {}裏的code會不會被執行,何時被執行,在return前仍是後?

        由於知道return的做用,立馬就回答是return前,經驗證此答案錯誤。 仍是經過例子來加深記憶   

public class TestLlan {
static int test()
    {
        int x = 1;
        try
        {
            return x;
        }
        finally
        {
            ++x;
        }
    }
    public static void main(String[] args) throws FileNotFoundException {
        System.out.println(TestLlan.test());  // 執行屢次打印結果是 1
    }
}

    經過結果能夠否認不是在return以前執行, 可是return後就會跳出方法,也不會是return後, 經過排除法獲得是 同時執行, 歡迎大神給出更明確的答覆,如何同時執行的? 難道是守護線程?

    六、一個方法中 try{}finally{} 語句塊內都有return語句時,方法會返回try語句塊中的仍是finally語句塊中的內容?

    這個根據第5個問題解答,猜想他們是同時執行的,那麼方法會使用那個返回值呢?繼續使用例子解惑   

public class TestLlan {   
    public int get()
    {
        try
        {
            return 0 ;
        }
        finally
        {
            return 1 ;
        }
    }
    public static void main(String[] args) throws FileNotFoundException {
        TestLlan t = new TestLlan();
        int b = t.get();
        System.out.println(b);  // 運行屢次,打印值爲1
    }
}

 what代碼在搞啥嘞... 經過第5個問題排除出來是try{}裏面的return和finally{}同時執行啊.. 此時只能絞盡腦汁,繼續排除法獲得return在finally以前執行, return執行完畢後,先存到某地方,finally在執行return時就會去覆蓋第一次return的值, finally執行完畢後,纔將最終值真正返出去

    七、sleep():使一個正在運行的線程處於睡眠狀態,是一個靜態方法,調用此方法要捕捉InterruptedException(中斷異常)異常。

    八、ArrayList和Vector的區別

        這兩個類都實現了List接口,他們都是有序集合,至關於一種動態的數組,咱們之後能夠按位置索引號取出某個元素,,而且其中的數據是容許重複的。
        這主要包括兩個差別方面:

        (1)同步性:
        Vector是線程安全的,也就是說是它的方法之間是線程同步的,而ArrayList是線程序不安全的,它不考慮線程安全,效率會高些;若是有多個線程會訪問到集合,就要使用Vector。
        (2)數據增加:
        ArrayList與Vector都有一個初始的容量大小,當存儲進它們裏面的元素的個數超過了容量時,就須要增長ArrayList與Vector的存儲空間,Vector默認增加爲原來兩倍,而ArrayList的增加後是原來的1.5倍。    ArrayList與Vector均可以設置初始的空間大小,Vector還能夠設置增加的空間大小,而ArrayList沒有提供設置增加空間的方法。

    九、HashMap和Hashtable的區別

        (1)他們都完成了Map接口。
        (2)HashMap容許將null做爲一個entry的key或者value,而Hashtable不容許。
        (3)Hashtable的方法是Synchronize的,而HashMap不是,在多個線程訪問Hashtable時,不須要本身爲它的方法實現同步,而HashMap就必須爲之提供外同步。


    十、heap和stack有什麼區別

        java的內存分爲兩類,一類是棧內存,一類是堆內存。

        棧內存是指程序進入一個方法時,會爲這個方法單獨分配一塊私屬存儲空間,用於存儲這個方法內部的局部變量,當這個方法結束時,分配給這個方法的棧會釋放,這個棧中的變量也將隨之釋放。         堆是與棧做用不一樣的內存,通常用於存放不放在當前方法棧中的那些數據,例如,使用new建立的對象都放在堆裏,因此,它不會隨方法的結束而消失。方法中的局部變量使用final修飾後,放在堆中,而不是棧中。

相關文章
相關標籤/搜索