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