java---雜七雜八的備忘錄

記錄從一些視頻博客之類的學習到的一些經驗,不斷添加,當成本身的儲備倉庫

一,效率最高的兩數交換代碼

經過異或運算實現,屬於有必定技巧性的代碼,實際開發仍是用常規的那種.(另外如果遇到n和m引用自同一個變量的狀況的話,則會出錯,n就至關於對本身作了三次異或運算)java

int n = 8,m = 9;
        n = n ^ m;
        m = n ^ m;
        n = n ^ m;
        System.out.println("N="+n+"M="+m);

二.java內存

分爲堆內存和棧內存,棧內存主要保存變量,堆內存保存對象和數組.下面舉個例子數組

int[] a = new int[5];

簡單來講對於a是存放在棧內存,對於new int[5]是存放在堆內存,a只是對堆內存的引用,也就是說堆內存是new出來的東西,棧內存是定義出來的東西,而引用則是能夠賦值爲null的變量就是對堆內存的引用,這樣一想,原來String的對象是引用啊markdown

三.進制轉換

若是程序中常常用到進制轉換,應該用查表法寫一個通性方法.多線程

public static void toHex(int num) {
        int temp = 0;
        StringBuffer sb = new StringBuffer();
        int x = 0;
        while(++x<8){
        //轉幾進制則對進制的最大值按位與
            temp = num & 15;
            if (temp>9) {
                sb.append((char)(temp-10+'A'));
            }else {
                sb.append(temp);
            }
            num = num >>>4;

        }
        System.out.println(sb.reverse());
    }

四.匿名對象的使用方式

1.當前對象只使用一次,不會在重複使用,這樣使用匿名對象比較簡介,當對象須要調用多個其方法,則必須創建對象名
2.對象做爲實際參數來傳遞的時候
Car a1 = new Car();
        a1.color = "RED";
        a1.show();
        //匿名對象的使用
        new Car().show();
        //匿名對象做爲參數使用
        useCar(new Car());

五.構造代碼塊

1.做用: 給對象進行初始化,用於全部對象公用的初始化
2.執行時間: 一創建對象就執行,且優先於構造函數執行
3.和構造函數的區別: 構造代碼塊用於全部對象共同的初始化,構造函數只是針對於特定的這一種對象app

class Car{
    //構造代碼塊先執行
    {
        System.out.println("我是代碼塊");
    }
    //構造函數在代碼塊以後執行
     public Car() {
        System.out.println("我是構造函數");
    }
}

六.this關鍵字在構造函數中的使用

this能夠用於構造函數之間的調用,可是隻能定義在構造函數的第一行,由於初始化須要先執行,不然報錯
class Car{
    String name;
    int num;
     public Car() {
         name = "haha";
    }
     public Car(int num) {
         this();//調用無參的構造函數
         this.num = num;
     }
}

七.static關鍵字的用處和注意事項

1.特色:
A.隨着類的創建而創建,隨着類的消失而消失,而且存在於方法區內存中
B.優先於對象存在,先有靜態變量,再有對象
C.被全部類成員共享,也就是在內存中只有一個
D.能夠被類名直接調用
2.注意事項
A.靜態方法只能訪問靜態成員,由於其在對象以前建立.非靜態方法既能夠訪問靜態成員也能夠訪問非靜態成員,也能夠用建立的前後順序解釋
B.靜態方法中不能夠用this,super關鍵字,緣由仍是自己先於對象建立
C.靜態成員優勢節省內存,缺點生命週期過長,訪問有侷限性(只能訪問靜態成員)ide

八.接口的規範化使用

接口中常見的定義有常量和抽象方法.其中每一類成員都有本身的固定的修飾符,
常量: public static final
方法: public abstract
接口就至關於對目前類的額外擴展函數

九.多態性詳解

多態性的提現主要是父類的引用指向了子類,或者父類承載了子類
使用多態性的前提:
1.必須類和類之間有關係,要麼繼承,要麼實現
2.一般還一個前提就是存在覆蓋,這樣使用多態纔有意義.
使用多態性的弊端:
1.雖然提升了擴展性,可是隻能使用父類的引用訪問父類中的成員
2.多態性開發通常都會配合instanceof關鍵字來判斷所屬類型,這樣就能夠解決上述弊端
另外,多態牽扯到轉型:
1.不管怎麼轉型都是對子類的轉型,因此把父類轉換成子類是大大不可取的作法學習

十.內部類能訪問外部類的緣由

內部類能夠直接訪問外部類中的成員,包括私有,是由於內部類持有了一個外部類的引用,格式爲 外部類名.this.若是外部類要訪問內部類,則必需要創建內部類的對象
另外內部類的使用通常是事務當中又包含了事務,由於類是對事務的描述,因此這樣內部類纔有意義this

十一.多線程的start和run的區別

public static void main(String[] args){
        NewThread thread = new NewThread();
        thread.start();//調用start開啓線程,而且運行子類複寫的run方法
// thread.run();//僅僅是對象的調用,雖然建立了線程,可是並無運行該線程
    }
}
class NewThread extends Thread{
    @Override
    public void run() {
        System.out.println("AAAAAAAA");
    }

十二.線程同步代碼的分析

同步代碼能夠防止因cup片斷獲取問題而帶來的共享變量判斷的錯誤問題,最簡單的案例就是賣票的案例,這裏很少說,
同步形式:spa

Object obj = new Object();
synchronized (obj) {
            //須要同步的代碼
        }
        或者同步函數
    public synchronized void Test() {
        //同步代碼塊
    }

其中obj就至關於鎖,獲取鎖的才能夠進去運行.
同步的要求:哪裏用到了共享變量哪裏就要同步,因此也就是多線程的時候要注意同步問題,同時同步機制帶來必定的資源消耗,由於每次運行線程都須要判斷是否有鎖.

十三.線程喚醒機制注意事項

wait()
notify()
notifyAll()
三個方法都是使用在同步中,被相應的鎖調用便可,由於要對持有的監視器(鎖)的線程操做,且只有同步中才有鎖,因此要使用在同步中.

爲何這些操做線程的方法要定義在object中?
由於鎖能夠是任意對象,因此能夠被任意對象調用的方法定義在object中

這些方法在操做同步線程的時候,都必須標識他們所操做的線程所持有的鎖,由於同一個鎖上的被等待線程能夠被同一個鎖上的notify喚醒,不能夠對不一樣鎖中的線程進行喚醒.

相關文章
相關標籤/搜索