Java學習筆記

ArrayList

數組的長度不可以發生改變,但是ArrayList集合的長度是可以隨意變化的。

對於ArrayList來說,有一個尖括號代表泛型

泛型:也就是裝在集合當中的所有元素,全都是統一的某種類型。

注意:泛型只能是引用類型,不能是基本類型

    ArrayList<String> list = new ArrayList<>(); 
    備註:從JDK 1.7+ 開始,右側的尖括號內容可以不寫內容,但是<>本身還是要寫的。
      
    ArrayList當中的常用方法有:
    public boolean add(E e) : 向集合當中添加元素,參數的類型和泛型一致。返回值代表添加是否成功。
    備註:對於ArrayList集合來說,add添加動作一定是成功的,所以返回值可用可不用。但是對於其他集合來說,add添加動作不一定成功。
     // 向集合中添加元素: add
            boolean success = list.add("一輩子");
            System.out.println("添加動作是否成功:" + success);
            System.out.println(list);
     
    public E get(int index): 從集合當中獲取元素,參數是索引編號,返回值就是對應位置的元素。
      // 從集合中獲取元素
            String s = list.get(0);
            System.out.println(s);
    public E remove(int index): 從集合當中刪除元素,參數是索引編號,返回值就是被刪除掉的元素。
     // 從集合中刪除元素
            String removed = list.remove(2);
            System.out.println(list);
    public int size(): 獲取集合的尺寸長度,返回值是集合中包含的元素個數。
    // 獲取集合的長度 
        	int size = list.size();
            System.out.println(size);
    
    
    
    如果希望向集合ArrayList當中存儲基本類型數據,必須使用基本類型對應的"包裝類”
    基本類型  包裝類(引用類型 包裝類都位於java.lang包下)
    byte     Byte
    short    Short
    int      Integer
    long     Long
    float    Float
    double   Double
    char     Character
    boolean  Boolean
      
    自動裝箱: 基本類型 -> 包裝類型
    自動拆箱:  引用類型 -> 基本類型

String類

java.lang.String類代表字符串

String類代表字符串。Java 程序中的所有字符串字面值(如 "abc"

)都作爲此類的實例實現。 也就是說,程序當中所有的雙引號字符串都是String類的對象,就算沒有new,也照樣是 。

字符串的特點

  1. 字符串的內容永不可變。重點
  2. 正是因爲字符串不可改變,所以字符串是可以共享使用的。
  3. 字符串效果上相當於是char[ ]字符數組,但是底層原理是byte[ ]字節數組
  創建字符串的常見3+1中方式:  
    
    3種構造方法: 
    
    public String() : 創建一個空白字符串,不含有任何內容
      //使用空參構造
      String str1 = new String();     //小括號留空,說明字符串什麼內容也沒有
      System.out.println("第一個字符串:" + str1);
    
    public String(char[] array): 根據字符數組的內容,來創建對應的字符串
      //根據字符數組創建字符串
      char[] charArray = {'A', 'B', 'C'};
      String str2 = new String(charArray);     
      System.out.println("第二個字符串:" + str2);
    
    public String(byte[] array): 根據字節數組的內容,來創建對應的字符串
       byte[] byteArray = {97, 98, 99};
       String str3 = new String(byteArray);
       System.out.println("第三個字符串:" + str3);
    
    
    1種直接創建
    String str4 = "hello";

字符串常量池:程序當中直接寫上的雙引號字符串,就在字符串常量池中。

對於基本類型來說,== 是進行數值的比較

對於引用類型來說,==是進行地址值的比較

== 是進行對象的地址值的比較,如果確實需要字符串的內容比較,可以使用兩個方法:

字符串的內容比較:
    
    public boolean equals(Object obj) : 參數可以是任何對象,只有參數是一個字符串並且內容相同的纔會是true;否則返回false
      注意事項:
      	1. 任何對象都能用Object進行接收
      	2. equals方法具有對稱性,也就是a.equals(b)和b.equals(a)效果一樣。
      	3. 如果比較雙方一個常量一個變量,推薦把常量字符串寫在前面 
      	   推薦:"abc".equals(str)     不推薦:str.equals("abc")
      
    public boolean equalsIgnoreCase(Object obj) : 不區分大小寫比較
    String 當中與獲取相關的常用方法有:
      public int length(): 獲取字符串當中含有的字符個數,拿到字符串長度。
      public String concat(String str): 將當前字符串和參數字符串拼接成爲返回值新的字符串
      public char charAt(int index): 獲取指定索引位置的單個字符
      public int indexOf(String str): 查找參數字符串在本字符串當中首次出現的索引位置,如果沒有返回-1
 字符串的截取方法:
     
    public String substring(int index):  截取從參數位置一直到字符串結尾,返回新字符串
      
    public String substring(int begin, int end): 截取從begin開始,一直到end結束,中間的字符串
    備註:[begin, end),包含左邊,不包含右邊。
        
    注意:下面這種寫法,字符串的內容仍然是沒有改變的,下面的兩個字符串:"Hello" , "Java". strA當中保存的是地址值。本來地址值是Hello的0X666,後來地址值變成了Java的0x999;  
        String strA = "Hello";
        System.out.println(StrA);    //Hello
        strA = "Java";
        system.out.println(strA);   //Java
 String當中與轉換相關的常用方法:
    public char[] toCharArray(): 將當前字符串拆分成爲字符數組作爲返回值
    public byte[] getBytes(): 獲得當前字符串底層的字節數組
    public String replace(CharSequence oldString, CharSequence newString): 將所有出現的老字符串替換成爲新的字符串,返回替換之後的結果新字符串。
    分割字符串的方法: 
      public String[] split(String regex):  按照參數規則,將字符串切分成爲若干部分
      注意事項:如果按照英文句點"." 來切分的話,需要使用 "\\."來使用。因爲英文句點在正則表達式中有特殊含義。

static關鍵字

  • 如果一個成員變量使用了static關鍵字,那麼這個變量不再屬於對象自己,而是屬於所在的類。多個對象共享同一份數據。

  • 一旦使用static修飾成員方法 ,那麼這就成爲了靜態方法。靜態方法不屬於對象單獨所有,而屬於類

  • 如果沒有static關鍵字,那麼必須首先創建對象,然後再通過對象調用其方法。

  • 對於靜態方法來說,可以直接使用類名稱來直接調用(推薦)。

  • 總結:無論是成員變量還是成員方法,如果有了static,都推薦使用類名稱來進行調用

    • 靜態變量: 類名稱.靜態變量
    • 靜態方法: 類名稱.靜態方法();
  • 備註:對於自己類中的靜態方法,調用時類名稱可以省略。

  • 注意:

    1. 靜態不能直接訪問非靜態。原因是因爲內存當中是先有靜態內容,然後再有非靜態內容 (古人不知道後人,後人知道古人)。
    2. 靜態方法當中不能用this關鍵字。原因是因爲this代表對象,通過誰調用的方法,誰就是對象。
  • 靜態static內存圖

  • 靜態代碼塊

    格式: 
      public class 類名稱 {
        static {
          //靜態代碼塊內容
        }
      }
    特點:當第一次用到本類時,靜態代碼塊執行唯一的一次
      	  靜態內容總是優先於非靜態,所以靜態代碼塊比構造方法先執行。
    典型用途: 用來一次性地對靜態成員變量進行賦值

數組工具類Arrays

java.util.Arrays是一個與數組相關的工具類,裏面提供了大量的靜態方法,用來實現數組的常見操作。

    public static String toString(數組) : 將參數數組變成字符串(按照默認格式)
    public static void sort(數組): 按照默認升序(從小到大)對數組元素進行排序
     備註:
      	1.如果是數值,sort默認按照升序從小到大。
      	2.如果是字符串,sort默認按照字母升序
       	3.如果是自定義類型,那麼這個自定義的類需要有Comparable或者Comparator接口支持。

常用Math類

    java.util.Math類是數學相關的工具類,裏面提供了大量的靜態方法,完成與數學運算相關的操作
    
    public static double abs(double num): 獲取絕對值。
    public static double ceil(double num): 向上取整
    public static double floor(double num): 向下取整
    public static long round(double num): 四捨五入

接口的使用:

定義: 接口就是多個類的公共規範,它屬於一種引用類型,最重要的內容是其中的抽象方法 。

接口定義格式:

    public interface 接口名稱 {
      // 接口內容
    }
    備註:換成了關鍵字interface之後,編譯生成的字節碼文件仍然是:.java -> .class
    // 如果是java 7,那麼接口可以包含的內容有: 
      1. 常量
      2. 抽象方法
      注:抽象方法定義格式:public abstract void methodAbs();
     // 如果是Java 8, 還可以額外包含有:
      3. 默認方法
      4. 靜態方法
      // 如果是Java 9,還可以額外包含有:
      5. 私有方法

在任何版本的Java中,接口都能定義抽象方法。

    格式: public abstract 返回值類型 方法名稱(參數列表);

注意事項:

  1. 接口當中的抽象方法,修飾符必須是兩個關鍵字:public abstract。(也可以省略其一或全不寫)
  2. 方法的3要素,可以隨意定義。

接口使用步驟: 實現類 -> 創建實現類對象

  1. 接口不能直接使用,必須有一個實現類 來 實現 該接口。
    格式:public class 實現類名稱 implements 接口名稱 {
    // …
    }
    1. 接口的實現類必須覆蓋重寫(即實現)接口中所有抽象方法。
      實現:去掉abstract關鍵字,加上方法體大括號
    2. 創建實現類的對象,進行使用。
      注意事項:如果實現類並沒有覆蓋重寫接口中所有的抽象方法,那麼這個實現類自己就必須是抽象類。

從Java 8開始,接口裏允許定義默認方法。

    格式:
    public default 返回值類型 方法名稱(參數列表) {	
    
    	方法體
    
    }

備註:接口當中的默認方法,可以解決接口的升級問題。

  1. 接口的默認方法,可以通過接口實現類對象,直接調用。
  2. 接口的默認方法,也可以被接口實現類進行覆蓋重寫。
    備註:調用抽象類方法,實際上運行的是右側實現類。

從Java 8開始,接口裏允許定義靜態方法。


    格式:
      public static 返回值類型 方法名稱(參數列表){
        // 方法體
      }
      注意事項:不能通過接口實現類的對象來調用接口當中的靜態方法。
      正確用法:通過接口名稱,直接調用其中的靜態方法
        格式:接口名稱.靜態方法名(參數);	

從Java 9開始,接口裏允許定義私有方法。

    1. 普通私有方法,解決多個默認方法之間代碼重複問題。
    格式 :
    private 返回值類型 方法名稱(參數列表) {
    	方法體 
    }
    2. 靜態私有方法,解決多個靜態方法之間重複代碼問題
    格式:
    private static 返回值類型 方法名稱(參數列表){
      方法體 
     }

接口常量:

接口當中也可以定義 “成員變量” ,但是必須使用public static final 三個關鍵字修飾。從效果看,這其實就是接口的常量

    格式:
    public static final 數據類型 常量名稱 = 數據值;
    
    備註: 一旦使用final關鍵字進行修飾,說明不可改變。
    注意事項:
      1. 接口當中的常量,可以省略public static final,注意:不寫也照樣是原本的樣子
      2. 接口當中的常量,必須進行賦值;不能不賦值
      3. 接口中常量的名稱,使用完全大寫的字母,用下劃線進行分隔(推薦命名規則)

使用接口時,需要注意的事項:

    1. 接口是沒有靜態代碼塊或者構造方法的。
    2. 一個類的直接父類是唯一的,但是一個類可以同時實現多個接口。
    格式:public class MyInterfaceImpl implements MyInterfaceA, MyInterfaceB {	
       	// 覆蓋重寫所有抽象方法
       }
    3. 如果實現類所實現的多個接口當中,存在重複的抽象方法 ,那麼只需要覆蓋重寫一次即可。
    4. 如果實現類沒有覆蓋重寫所有接口當中的抽象方法,那麼實現類就必須是一個抽象類。
    5. 如果實現類所實現的多個接口當中,存在重複的默認方法,那麼實現類一定要對衝突的默認方法進行覆蓋重寫。
    6. 一個類如果直接父類當中的方法,和接口當中的默認方法產生了衝突,優先使用父類當中的方法。

接口的擴展:

  1. 類與類之間是單繼承的。直接父類只有一個
  2. 類與接口之間是多實現的。一個類可以實現多個接口。
  3. 接口與接口之間是多繼承的。
    注意事項:
    1. 多個父接口當中的抽象方法如果重複,沒關係。
    2. 多個父接口當中的默認方法如果重複,那麼子接口必須進行默認方法的覆蓋重寫 。而且必須帶着default關鍵字。

多態性

代碼當中體現多態性,其實就是一句話:父類引用指向子類對象。

    格式:
      父類名稱 對象名 = new 子類名稱();
      Fu      obj    = new Zi();
      或者
      接口名稱 對象名 = new 實現類名稱();
     

擴展:

訪問成員變量的兩種方式: (口訣:編譯看左邊,運行還看左邊)

  1. 直接通過對象名稱訪問成員變量:看等號左邊是誰,優先用誰,沒有則向上找
  2. 間接通過成員方法訪問成員變量:看該方法屬於誰,優先用誰,沒有則向上找

訪問成員方法的訪問規則: (口訣:編譯看左邊,運行看右邊)

  1. 看new的是誰,就優先用誰,沒有則向上找
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章