1. 程式人生 > >Java陣列(二)

Java陣列(二)

***************************第四章 陣列 ***************************************


一.why 什麼時候想到使用陣列


當定義的變數比較多的時候,考慮使用陣列


需求: 求全班同學的平均成績


人數少的時候(例如只有5人) 可以定義5個變數,每個變數分別用來存每個學生的成績

int scoreA = 90;

int scoreB = 100;

int scoreC = 80;

...

但是如果是60個人 定義60個變數 顯然比較繁瑣 可以使用陣列..


二.what 什麼是陣列


相同型別 元素的集合...


特點:

1. 元素的型別都是一樣的


2. 陣列中的元素在物理位置上是連續的...

 

陣列的分類:

陣列按照陣列中元素的型別,分為兩種


(1)基本型別陣列

如果陣列中的元素是基本型別,該陣列叫做基本型別的陣列


(2)引用型別陣列

如果陣列中元素的型別是引用型別,該陣列叫做引用型別陣列


三.how 如何定義陣列

1.宣告 2. 建立 3. 初始化

*******************************基本型別的陣列***************************************


需求: 求全班同學的平均成績


陣列分配空間是在 堆裡分配的


堆: java程式執行的時候 使用的另一段記憶體空間,一般程式執行的時候 動態創建出來的物件

都分配在堆了... new 出來的都在堆裡

 

陣列是引用型別的


演示程式碼:


/**
作者: zhangzy<br>
公司: 藍橋軟體學院<br>
時間: 2017-06-27 上午
功能: 演示基本型別陣列的使用

*/

public class TestArray{

public static void main(String[] args){


//需求: 求全班同學的平均成績

//1. 宣告
//int[] intArr;// intArr陣列的引用名

//2.建立 ((1)分配空間(2)預設初始化 基本型別預設初始化為0或0.0)
//intArr = new int[5]; //new int[5]; 建立陣列的程式碼 返回的是剛剛創建出來的陣列的首地址
//陣列的首地址 就是陣列中第一個元素的首地址

//3.初始化
/*
intArr[0] = 60;
intArr[1] = 70;
intArr[2] = 80;
intArr[3] = 90;
intArr[4] = 100;*/

//合併一下
//int[] intArr = new int[5];
//三步合併成一步
//int[] intArr = new int[]{60,70,80,90,100};
int[] intArr = {60,70,80,90,100};

int sum = 0;
//陣列物件有一個屬性 叫做 length 用來獲得陣列的長度
for(int i=0;i<intArr.length;i++){

sum = sum + intArr[i];
}

int avg = sum / intArr.length;

System.out.println("avg=" + avg);
//陣列下標越界
//intArr[5] = 100;//陣列的最後一個元素 是length-1 訪問5時 報錯 ArrayIndexOutOfBoundsException
}
}

 


***********************基本型別和引用型別的區別***************************


int a = 10;

1. 基本型別


實質就是數值 是數值的二進位制位表示形式

 

2. 引用型別


實際是地址


相當於c語言中的指標 ,只不過它是簡化版的指標 不能作業系統 不能進行 p++ p-- 操作


***************************增強的for迴圈 ***************************************


JDK5.0 提供的一個新特性

/**
作者: zhangzy<br>
公司: 藍橋軟體學院<br>
時間: 2017-06-27 上午
功能: 演示增強的for迴圈 jdk5.0的新特性 簡化了陣列的遍歷
*/

public class TestAdvancedFor{

public static void main(String[] args){


int[] intArr = {60,70,80,90,100};

for(int temp:intArr){
System.out.print(temp + " ");
}

}
}


***************************引用型別陣列 ***************************************


引用型別陣列: 裡面的元素 都是引用型別...


引用型別: 除了8種基本型別以外都是引用型別

String、陣列、類


String s = "aaa";


s = null;


null 中文翻譯成空 null的含義 表示什麼都不引用


演示程式碼:


/**
作者: zhangzy<br>
公司: 藍橋軟體學院<br>
時間: 2017-06-27 上午
功能: 演示引用型別陣列的使用

*/

public class TestRefArray{

public static void main(String[] args){


//定義字串陣列
//1.宣告
//String[] strArr;

//2.建立 (分配空間、預設初始化 引用型別預設初始化為null)
//strArr = new String[3];
//String s1 = null;
//String s2 = null;
//String s3 = null;

//3.初始化
/*
strArr[0] = "aaa";
strArr[1] = "bbb";
strArr[2] = "ccc";*/

//Stirng[] strArr = new String[]{"aaa","bbb","ccc"};

String[] strArr = {"aaa","bbb","ccc"};

for(String str:strArr){
System.out.println(str);
}
}
}

 

 

//String s = "aaa";//s 字串物件的引用) ...

 

***************************是否交換問題***************************************

 

 

***************************氣泡排序 ***************************************


資料結構


排序: 無序----------->有序

氣泡排序:

第一輪 指標指向第一個元素 讓第一個元素和它後面的元素比較大小,如果 前面的元素> 後面的元素


交換位置,指標向後移動(不管交換不交換 指標都會向後移動 始終指向大的元素),第一輪比較完以後

最大的元素冒到最右邊....


第二輪執行過程 和第一個一樣,執行完以後 次大的元素冒到的最右邊

 

1.時間複雜度: 問題域的大小 和解決該問題 所用時間的一個關係,叫做時間複雜度


這裡的問題是排序, 問題域的大小 待排序的元素的個數...


需要先求比較次數 n*(n-1)/2 O(n方)


2.空間複雜度; 問題域的大小 和解決該問題 所用空間(記憶體)的一個關係,叫做空間複雜度...


O(1) 恆定不變的值

 

*************************二維陣列***********************************

沒有二維陣列


二維陣列的實質是一維陣列


它是引用型別的一維陣列,只不過每個元素引用的又是一個一維陣列

 

演示程式碼:


/**
作者: zhangzy<br>
公司: 藍橋軟體學院<br>
時間: 2017-06-28 上午
功能: 演示二維陣列的使用

*/

public class TestArray2{

public static void main(String[] args){

/*
int arr1 = new int[]{1,2,3};
int arr2 = new int[]{1,2,3,4};
int arr3 = new int[]{1,2,3,4,5};

//一.宣告
int[][] intArr;

//二.建立 (分配空間、預設初始化)
intArr = new int[3][];

//三.初始化
intArr[0] = arr1;
intArr[1] = arr2;
intArr[2] = arr3;*/


int[][] intArr = new int[][]{{1,2,3},{1,2,3,4},{1,2,3,4,5}};
//int[][] intArr = {{1,2,3},{1,2,3,4},{1,2,3,4,5}};

for(int i=0;i<intArr.length;i++){

for(int j=0;j<intArr[i].length;j++){
System.out.print(intArr[i][j] + " ");
}

System.out.println();
}


}
}

 

*******************String類的實質----底層是由 字元陣列 組成的*****************

1.檢視原始碼


public final class String{

private final char value[];//字元陣列用於儲存 字串的字面值

...
}

**
原始碼在 jdk\src.zip下

位元組碼在 jre\lib\rt.jar 中


2. 反編譯

編譯
.java--------->.class


反編譯
.class------------->.java


當別人沒有提供原始碼,只提供了.class檔案,如果想學習別人如何實現的..

可以通過反編譯得到原始碼...


cavaj 反編譯工具


*********************************如何通過打斷點來除錯程式碼**************************

1.如何打斷點

在行號前面雙擊即可... 取消斷點再雙擊


注意: 斷點這一行還沒有執行

 

如何除錯

1. step into 單步進入 逐語句

碰到方法會進入該方法 每次執行方法中的一句


每次執行一句


2. step over 單步跳過 逐方法

碰到方法 直接把整個方法全部執行完畢 每次執行一個方法

 

3. step return 單步跳出


平時不可用, 當使用單步進入 進入到方法後 如果一下子想把方法中 沒有執行的程式碼 全部執行完畢

可以使用 單步跳出..

 

**************************************字串連線********************************


1. +

String s = "hello";

s = s + ",world!";

System.out.println(s);


2. 字串的concat方法

String s1 = "aaa";
s1.concat("bbb");
System.out.println(s1);

注意不會在原來的字串上進行修改,只是在備份上進行修改

 

**************************************字串常量池********************************


一.why 為什麼有字串常量池


String s1 = "aaa";

String s2 = "aaa";

String s3 = "aaa";

String s4 = "aaa";

String s5 = "aaa";


假設沒有字串常量池, 建立100個 相同字面值 "aaa"物件, 會在堆中 分配100分 記憶體,顯然是浪費記憶體,不合理...


java的設計人員肯定考慮到了這個問題, 為了高效的使用記憶體, 定義了字串常量池的概念

 


二. what


新的記憶體空間, 同樣的字面值物件 "aaa" 只會在字串常量池中出現一次, 如果第二次再定義相同的字面值 "aaa"

物件,並不會在記憶體中再新建一份 新的空間儲存"aaa" 而是直接 引用常量池中 已經有的 "aaa"物件

 


**************************************建立了幾個物件********************************


一. 直接賦值

建立了一個物件 在字串常量池中

無則建立、有則返回


String s1 = "aaa";// 建立了幾個物件? 建立了1個物件 在字串常量池中

演示程式碼:

package com.chapter5;

public class 演示建立了幾個物件 {
public static void main(String[] args) {

String s1 = "aaa";
String s2 = "aaa";

System.out.println(s1==s2);//true
System.out.println(s1.equals(s2));//true
}
}


2. new

建立了兩個物件:

(1) 字串常量池中 真正的字面值物件


無則建立、有則返回

 

(2) 堆裡的

無論如何都要被建立,存的是常量池中 字面值物件的地址

 

 

 

 

 

 

*************************************==和equals的區別******************************************


一. ==


實質比較的是二進位制位


1. == 左右兩邊是基本型別

int a = 10;
int b = 10;

System.out.println(a==b);//true

比較的是數值 數值相等 就是 true 不相等就是 false

 

2. == 左右兩邊是引用型別


地址

地址相同 true 如果雙等號兩邊 兩個引用 引用的是同一個物件 返回true

地址不同就是false 兩個引用 引用的不是同一個物件 返回false

 


二.equals


String 類的equals 比較的是 字面值 字面值相等 true 字面值不相等 false