《第一行程式碼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:適用多執行緒下在字元緩衝區進行大量操作的情況