1. 程式人生 > >《第一行程式碼Java》陣列與String部分學習筆記與程式碼

《第一行程式碼Java》陣列與String部分學習筆記與程式碼

  .堆記憶體:儲存物件真正的資料,就是每一個物件的屬性內容如cat物件的顏色color,age屬性的具體數值;

  .棧記憶體:儲存的是一塊堆記憶體的空間地址,簡易理解為物件的名稱如Cat  cat中的cat(物件名稱);

 聯絡與區別:一塊堆記憶體可以被多個棧記憶體所指向,但反之,一塊棧記憶體只能儲存一塊堆記憶體的地址;

  .陣列

package org.java.array;

/**
 * 陣列的引用傳遞
 * 
 * @author coder
 *
 */
public class ArrayDemo {
    public static void main(String[] args) {
        int data[] = new int[3];// 宣告並開闢一個3個長度的陣列
        data[0] = 10;
        data[1] = 20;
        data[2] = 30;
        int temp[] = data;//陣列傳遞引用,新開闢的temp棧記憶體也指向data所指向的堆記憶體
        temp[0] = 99;
        System.out.println("輸出1:");
        for (int arr : temp) {
            
            System.out.print(arr+" ");
        }
        System.out.println();
        /**
         * 陣列的靜態初始化:
         * 
         */
        int  data2[]=new  int[]{1,2,3,4,5,6};
        System.out.println("輸出2:");
        for(int i=0;i<data2.length;i++)
        {
            System.out.print(data2[i]+" ");
        }
        System.out.println();
        
        /**
         * 陣列與方法引數的傳遞  實質就是陣列的引用傳遞
         */
        int  data3[]=new int[]{6,7,8};
        change(data3);//引用傳遞等價於:int  temp[]=data3;
        System.out.println("輸出3:");
        for(int i=0;i<data3.length;i++)
        {
            System.out.print(data3[i]+" ");
        }
        System.out.println();
        /**
         * 簡化理解
         */
        int  data4[]=new int[]{1,2,3};
        int temp2[]=data4;//
        System.out.println("輸出4:");
        for(int x=0;x<temp2.length;x++){
            temp2[x]*=2;
            System.out.print(temp2[x]+" ");
        }
        //上述程式碼主要用於對比陣列的方法引數傳遞的簡化理解
        
    }
    /*陣列與方法傳遞的main方法之外的方法測試*/
    public  static  void change(int temp[]){
        for(int j=0;j<temp.length;j++){
            temp[j]*=2;
        }
    }

}


執行結果:
輸出1:
99 20 30 
輸出2:
1 2 3 4 5 6 
輸出3:
12 14 16 
輸出4:
2 4 6 

  .陣列的複製:可以用System.arraycopy(原陣列名,原陣列複製開始索引,目標陣列名,目標陣列開始索引,長度)方法實現陣列複製。

常用方法:利用java.util.Arrays.sort(陣列名)實現陣列排序。

  .物件陣列的動態初始化與靜態初始化與陣列的格式基本類似:

動態初始化:類名  物件陣列名[]=new  類名[長度]       eg: Book  books[]=new Book[3];

靜態初始化:類名  物件陣列名[]=new  類名[]{例項化物件,例項化物件}    eg:   Book  books[]=new Book[]{

new  Book(1),new Book(2)};

String類的相關知識:

    1.String類的兩種例項化方式

  .直接賦值        String  str="Java";這種方式賦值在相同內容的情況下不會開闢新的堆記憶體空間,而是指向已有的堆記憶體空間

  .利用構造方法例項化     String  str=new  String("Java");會開闢的新的堆記憶體空間,由於每一個字串都是一個String類匿名物件,所以這種方式首先會在堆內中開闢一塊空間用來儲存Java,然後使用關鍵字new,開闢另一塊記憶體空間。因此真正使用的是new開闢的堆記憶體,之前的堆空間沒有任何佔記憶體的指向,將成為垃圾杯GC回收

Java中只要是引用資料型別一定存在記憶體地址,“==”可用於引用資料型別的比較,但比較的是地址的數值內容,而equals方法是由String類提供的一個方法,此方法專門負責進行字串內容的比較

  .字串常量就是String類的匿名物件(匿名物件,開闢了堆記憶體的例項物件,只能使用一次,使用一次就被GC收回)

   .任何資料類遇見String型別都向String轉換

    .String定義的字串一旦定義就不可改變,在修改String定義的字串物件時,實際修改的是String類物件的 引用關係,而原始的字串沒有發生變化,但是原來的字串物件不被任何棧記憶體所指向,會產生垃圾,因此在需要頻繁修改字元您串內容的專案中一般不採用String去定義字串,一般採用StringBuffer或者StringBuilder.

執行速度,在這方面執行速度快慢為:StringBuilder > StringBuffer > String

  .String為字串常量,而StringBuilder和StringBuffer均為字串變數,即String物件一旦建立之後該物件是不可更改的,但後兩者的物件是變數,是可以更改的

線上程安全上,StringBuilder是執行緒不安全的,而StringBuffer是執行緒安全的

. 總結一下
  String:適用於少量的字串操作的情況

  StringBuilder:適用於單執行緒下在字元緩衝區進行大量操作的情況

  StringBuffer:適用多執行緒下在字元緩衝區進行大量操作的情況