1、不同類型的一維數組元素的預設初始化值;2、一維數組的記憶體解析;3、二維數組的聲明與初始化;4、二維數組元素的預設初始化值;5、二維數組的記憶體解析;6、(冒泡和快速)排序演算法及優化;7、查找(或搜索);8、Arrays工具類的使用。 ...
1、不同類型的一維數組元素的預設初始化值
整型元素 : 0
boolean型元素 : false
浮點型元素 : 0.0
char型元素 : 0或'\u0000',而非'0'
引用類型元素 : null
2、一維數組的記憶體解析
- 方法中局部變數都會存在棧裡面
- new出來的對象都要放在堆空間中
- 數組中的元素為引用類型變數時,要麼為null,要麼存儲的是地址值,指向字元串常量池中的值
關於數組:
數組一旦初始化,其長度就是確定的,
數組長度一旦確定,就不可修改。
3、二維數組的聲明與初始化
正確的方式:
// 靜態初始化
int[][] arr1 = new int[][]{{1, 2, 3}, {4, 5}, {6, 7, 8}};
int[] arr2[] = new int[][]{{1, 2, 3}, {4, 5}, {6, 7, 8}};
int[] arr3[] = {{1, 2, 3}, {4, 5}, {6, 7, 8}}; // 類型推斷
// 動態初始化1
String[][] arr4 = new String[3][2];
// 動態初始化2
String[][] arr5 = new String[3][];
4、二維數組元素的預設初始化值
-
針對於初始化方式一:比如:int[][] arr = new int[4][3];
外層元素的初始化值為:地址值,
記憶體元素的初始化值為:與一維數組初始化情況相同。 -
針對於初始化方式二:比如:int[][] arr = new int[4][];
外層元素的初始化值為:null,
記憶體元素的初始化值為:不能調用,否則報錯。
5、二維數組的記憶體解析
6、(冒泡和快速)排序演算法及優化
冒泡排序及優化
/**
* 冒泡排序
* 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
* 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
* 針對所有的元素重覆以上的步驟,除了最後一個。
* 持續每次對越來越少的元素重覆上面的步驟,直到沒有任何一對數字需要比較
*
*/
public class BubbleSort {
public static void bubbleSort(int[] data) {
System.out.println("開始排序");
int arrayLength = data.length;
for (int i = 0; i < arrayLength - 1; i++) {
for (int j = 0; j < arrayLength - 1 - i; j++) {
if (data[j] > data[j + 1]) {
int temp = data[j + 1];
data[j + 1] = data[j];
data[j] = temp;
}
}
System.out.println(java.util.Arrays.toString(data));
}
}
//優化1
public static void bubbleSort1(int[] data) {
System.out.println("開始排序");
int arrayLength = data.length;
for (int i = 0; i < arrayLength - 1; i++) {
boolean flag = false;
for (int j = 0; j < arrayLength - 1 - i; j++) {
if (data[j] > data[j + 1]) {
int temp = data[j + 1];
data[j + 1] = data[j];
data[j] = temp;
flag = true;
}
}
System.out.println(java.util.Arrays.toString(data));
if (!flag)
break;
}
}
public static void main(String[] args) {
int[] data = { 9, -16, 21, 23, -30, -49, 21, 30, 30 };
System.out.println("排序之前:\n" + java.util.Arrays.toString(data));
bubbleSort(data);
System.out.println("排序之後:\n" + java.util.Arrays.toString(data));
}
}
快速排序
/**
* 快速排序
* 通過一趟排序將待排序記錄分割成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分關鍵字小,
* 則分別對這兩部分繼續進行排序,直到整個序列有序。
*/
public class QuickSort {
private static void swap(int[] data, int i, int j) {
int temp = data[i];
data[i] = data[j];
data[j] = temp;
}
private static void subSort(int[] data, int start, int end) {
if (start < end) {
int base = data[start];
int low = start;
int high = end + 1;
while (true) {
while (low < end && data[++low] - base <= 0)
;
while (high > start && data[--high] - base >= 0)
;
if (low < high) {
swap(data, low, high);
} else {
break;
}
}
swap(data, start, high);
subSort(data, start, high - 1);//遞歸調用
subSort(data, high + 1, end);
}
}
public static void quickSort(int[] data){
subSort(data,0,data.length-1);
}
public static void main(String[] args) {
int[] data = { 9, -16, 30, 23, -30, -49, 25, 21, 30 };
System.out.println("排序之前:\n" + java.util.Arrays.toString(data));
quickSort(data);
System.out.println("排序之後:\n" + java.util.Arrays.toString(data));
}
}
排序演算法性能對比
7、查找(或搜索)
//線性查找:
String dest = "BB";
dest = "CC";
boolean isFlag = true;
for(int i = 0;i < arr.length;i++){
if(dest.equals(arr[i])){
System.out.println("找到了指定的元素,位置為:" + i);
isFlag = false;
break;
}
}
if(isFlag){
System.out.println("很遺憾,沒有找到的啦!");
}
//二分法查找:(熟悉)
//前提:所要查找的數組必須有序。
int[] arr2 = new int[]{-98,-34,2,34,54,66,79,105,210,333};
int dest1 = -34;
dest1 = 35;
int head = 0;//初始的首索引
int end = arr2.length - 1;//初始的末索引
boolean isFlag1 = true;
while(head <= end){
int middle = (head + end)/2;
if(dest1 == arr2[middle]){
System.out.println("找到了指定的元素,位置為:" + middle);
isFlag1 = false;
break;
}else if(arr2[middle] > dest1){
end = middle - 1;
}else{//arr2[middle] < dest1
head = middle + 1;
}
}
if(isFlag1){
System.out.println("很遺憾,沒有找到的啦!");
}
8、Arrays工具類的使用
java.util.Arrays類即為操作數組的工具類,包含了用來操作數組(比如排序和搜索)的各種方法。