數組類型和數組引用變量詳解
數組類型
為什么要用數組?
Java數組的兩大特征:
定義數組時,不能指定數組的長度
變量分為 2 種:
數組的初始化:
遍歷數組:
深入理解數組的存放:
二維數組與多維數組
Arrays工具類,提供一些方法來操作數組。
數組類型
Java 數據類型可以分為:基本類型 — 8 個
???????????????????????????????????????? 引用類型 — 類、接口、數組
數組是引用類型。
int → int [ ]??? — 整型數組
double? →? double [ ]??? — double 數組
……
String? → String [ ]?? —? String 數組
int [ ]? →? int [ ] [ ]?????? —? 新的數組類型
int [ ] [ ]? →? int [ ] [ ] [ ] ? ? —? 新的數組類型
PS:
??? //? 類型? 變量名
int a [ ];????????????? //? 垃圾寫法,雖然正確,但是可讀性差
?? //? 類型是 int [ ] ,變量名是 a
int [ ] a;???????????? //? 正確寫法
?數組類型:就是一個真正的類型,它即可用于創建變量,也可用于進行強制類型轉換
為什么要用數組?
如果程序中需要用到多個相同類型的變量,就可以考慮把它們集中定義成一個數組。
——每個數組元素,就相當于一個普通的變量
借助于數組,我們可以非常方便地去管理、訪問每個數組元素(相當于一個變量)
Java數組的兩大特征:
??????? Java語言是強類型:? 一個數組里只能存儲一種數據類型的數據
??????? Java語言是靜態的:? Java的數組一旦被初始化之后,它的長度是固定的。
定義數組時,不能指定數組的長度
數組類型是引用類型。
引用類型的本質就是指針。——指針也是變量,只不過它里面存的值是內存編號(內存地址)
數組變量只是一個引用,因此聲明時只是定義了一個引用變量,并未真正指向有效的數組對象(存在),也就是并未真正指向有效的內存,因此不能聲明長度,而且也不能使用。
變量分為 2 種:
??? 1.直接在變量中存放實際的變量值。這就是Java的基本類型的變量。
??? 2.在變量中存放只是內存的地址值,這就是所謂的引用變量。
數組的初始化:
??? 數組變量只是一個引用,必須讓它指向有效的內存之后才能使用
初始化分為兩種:
??? 靜態初始化:
??????? new <type> [ ] {<ele1>,<ele2>,<ele3>...};???? //? <>里可替換
??????? 只指定數組的元素,讓系統來決定數組的長度。
??? 動態初始化:
? ? ? ? new <type> [ <length> ]? ? ? ? ? ? ? //? <>里可替換
??????? 只指定數組的長度,讓系統來決定數組的元素的值。
如果數組元素是基本類型,那么所有數組元素的值都是 0 / 0.0 / false / \u0000? (只記都是零)
如果數組元素是引用類型,那么所有數組元素的值都是 null
一旦數組的初始化完成,接下來的每個數組元素就可當成普通變量使用了。
使用數組:
每個數組元素相當于一個變量,該變量的類型,就是數組類型去掉【一個】方括號。
數組有一個 length 屬性,用于返回該數組的長度。
遍歷數組:
??? A.? 可以依次根據每個數組元素的索引來進行遍歷。
??? B.? 使用 foreach 循環進行遍歷。
for(數組或集合元素的類型? 變量名:數組\集合)
{
????? //? 此處即可通過”變量名“依次訪問每個數組\集合的元素
}
注意點:foreach 循環時,不要對循環變量賦值!
********如果要在遍歷時對數組元素進行賦值,那就應該根據數組元素的索引來進行遍歷
/****************************************************
補充:
1. 內存泄露:c語言,把內存分配出去之后,后面忘記了回收這些內存
2. 對象還存在,以后還要用的時候,內存早早就把對象清理出去了
***********************************************************/
Java 就把指針換個名字,叫引用。
??????? 對指針做了一些包裝、做了一些檢查——這樣可以保證引用更加安全
??????? 引用:被包裝后的、更加安全的引用
/*********************************************************
補充:
JVM有一條后臺進程:垃圾回收器
??????? 它會用一種機制記錄 堆內存 中“每個對象”是否有引用變量(指針)引用它
???????????? 如果有,垃圾回收器就不會管它。
??????????? 如果沒有,垃圾回收器就會在合適時候去回收該對象所占的內存
*********************************************************/
深入理解數組的存放:
??????? 當數組對象的引用變量被銷毀之后,數組對象并不一定會被回收(它在堆內存),它不會隨著數組變量被回收。
??????? 只有當沒有引用變量引用這個數組對象時,系統才會去回收數組對象。
PriArrayTest 程序 及 運行結果:
public class PriArrayTest
{
??? public static void main(String[] args)
??? {
??????? // 所有在方法里聲明的變量,都放在對應的方法棧。
??????? /*
???????? *? 每個方法運行時,系統都會為之建立一個方法棧
?? ? ??? *? 棧內存是臨時性的內存,當方法結束時,方法棧會被立即釋放
???????? *? 所以棧內存不適合存放長期有效的數據
? ? ? ?? *
? ? ? ?? *? 堆內存:每個JVM 只有一個
? ? ? ?? *? ? ? ? ? 只要JVM不退出,堆內存將一直存在
? ? ? ? */?
?? ? ?? double d = 23.5;? // d 是基本類型
?? ? ?? int[] iarr = null;? // 它只是數組變量,引用變量。
?? ? ? ? ? ? ? ? ? ? ? ? ?? // 此時這個iarr不能使用。
??? //? NullPointerException異常,空指針異常
??? //? 當程序訪問一個 null 對象的實例方法或實例屬性
??? //? 程序就會引發NullPointerException異常
??? // System.out.println(iarr[0]);
??????? iarr = new int[4]; // 所有的對象都放在“堆”內存
??? // 每個JVM(虛擬機)只有一個“堆”內存
??? //? 在Java程序里,只要訪問“引用”的方法、屬性時,
??? //? 系統會自動切換到訪問它實際的對象
??? //? 堆內存中的對象,只能通過引用變量來訪問
?? ? ?? iarr[2] = 34;? //? 34是基本類型,但它實際上存在“堆內存”中
?? ? ?? System.out.println(iarr.length);
??? // 靜態初始化的簡化語法
?? ? ?? int[] ba = {12,20,102};
?? ? ?? iarr = ba; //? 把ba的值賦給iarr
??????? System.out.println(iarr.length);
??? }
}
此時? 0x12ab34ed? 沒有被引用,垃圾回收器會在合適的時候回收它
數組測試 程序 及 運行結果:?
public class 數組測試
{
??? public static void main(String[] args)
??? {
??? int[] iArr;??? // 聲明了一個數組變量。引用類型變量(基礎就那8個)。它存放的是內存變量
??? // iArr 是一個引用類型的變量
??? // 也就是 iArr 存放了后面創建的數組的地址。
// 靜態初始化
??? iArr = new int[]{20,1,12,32};
??? System.out.println(iArr[0]);
??? iArr[0] = 'A';// 'A'本來是 char,但由 char 可以自動轉換 int 類型
??? System.out.println(iArr[0]);
// 動態初始化
??? String[] strArr = new String[5];
??? // 第一個數組元素的索引是 0
??? // 最后一個數組元素的索引是 length - 1
??? // 把數組的最后一個元素賦值為? "明天就周六啦~~~"
??? strArr[strArr.length - 1] = "明天就周六啦~~~";
??? // 遍歷數組元素
??? for(int i = 0;i < strArr.length;i++)
??? {
? ? ? ? System.out.println("strArr[" + i + "]: " + strArr[i]);
??? }
??? //? 當我們訪問數組元素的 索引小于0 ,或者大于等于length
??? //? 將引發“數組索引越界”異常
??? System.out.println(strArr[strArr.length]);
??? }
}
二維數組與多維數組
所謂的“二維”數組
int[ ]? ? ?? →?? int[ ] [ ]
int[ ][ ]??? →?? int[ ][ ][ ]
MultiDimenTest (二維數組)程序 及 運行結果:
public class MultiDimenTest
{
??? public static void main(String[] args)
??? {
? ?? ?? int[][] arr;? // 只是一個引用變量。
? ?? ?? // 動態初始化,由系統為數組元素賦值
? ?? ?? arr = new int[4][]; // Java允許初始化數組時候只初始化左邊的維數
? ?? ?? System.out.println(arr[1]); // arr[1]相當于一個int[]變量
? ?? ?? arr[1] = new int[]{12,15};? // 靜態初始化語法創建數組對象。
??? // arr[1][2] = 30; // 此處賦值沒有問題,[1][2] 是int型,但是會引發數組索引越界的異常
??? // arr[2][0] = 13; // 由于arr[2]相當于int[]類型的變量(即引用變量)
? ? ? ? ? ? ? ? ? ? ? ? ? ?? // 此時它還未指向有效的內存。因此會引發NullPointerException(空指針異常)
? ?? ?? int[] a = new int[3]; // 動態初始化
? ?? ?? arr[2] = a; // 把 a 變量存放的地址賦給arr[2]
? ?? ?? a[2] = 102; // a是int型
? ?? ?? for(int i = 0;i < arr[2].length;i++)
? ?? ?? {
? ? ? ?? ?? System.out.println("~~~~~" + arr[2][i]);
? ? ? ?? ?? if(i == 1)
? ? ? ?? ?? {
? ? ? ? ? ?? ?? arr[2][i] = 23;
? ?? ? ? ?? }
? ?? ?? }
? ?? ?? for(int i = 0;i < a.length;i++ )
? ?? ?? {
? ?? ? ?? ? System.out.println(a[i]);
? ?? ?? }
??? }
}
多維數組
三維數組的元素是二維數組
二維數組的元素是一位數組
N維數組的元素是N-1維數組(這話是不標準的,只是為了方便記憶)
多維數組? 程序 及 運行結果:
public class 多維數組
{
??? public static void main(String[] args)
??? {
? ?? ?? int[][] a = new int[2][3];
? ?? ?? System.out.println("a的長度:" + a.length);
? ?? ?? a[1] = new int[]{13,23,10,45};
? ?? ?? // a的length是2
? ?? ?? for(int i = 0;i < a.length;i++)
? ?? ?? {
? ?? ? ?? ? for(int j = 0;j < a[i].length;j++)
? ? ?? ? ?? {
? ? ? ?? ?? System.out.print(a[i][j] + "\t");
? ? ? ?? ?? }
? ?? ?? System.out.print("\n");
? ?? ?? }
??? }
}
Arrays工具類,提供一些方法來操作數組。
binarySearch?? — ? 二分法查找。用于查找數組中的元素。
?????????????????????????????? 但是,要求數組元素已經是排好序。
sort(char[ ] a)? —??? 可用于對數組進行排序
fill (type [] a,? ? int fromIndex,? ? int toIndex,? ? type val)
??? ( 類型, ? ? ? ? 開始的值? , ? ?? 結束的值 ?? ,填充的值)
Arrays工具類? 程序 及 運行結果:
import java.util.*;
// 只有java.lang 包的類不需要導入。
public class Arrays工具類
{
??? public static void main(String[] args)
??? {
??? int[] a = new int[]{12,23,34,37,41,46,54,67};
??? int index1 = Arrays.binarySearch(a,46);
??? System.out.println(index1);
??? int[] b = new int[]{12,46,23,34,37,41,54,67};
??? int index2 = Arrays.binarySearch(b,46);
??? System.out.println(index2);
??? // 將b數組的從索引為1的元素到索引5之前的元素,都填充成20
??? Arrays.fill(b,1,5,20);
??? System.out.println(b); // 直接打印數組,看到[ 數組類型的首字母大寫@地址值
??? // Arrays 的tostring可以幫助你看到數組元素
??? System.out.println(Arrays.toString(b));
??? }
}
練習:
把數字翻譯成人名幣的讀法
例如:? 10010202.12???????????? 壹仟零壹萬兩佰零貳圓壹角貳分
漢字定義成數組
以上
寫在最后:
覺得得具體規劃一下我的時間安排,昨天又一不小心1點多睡的,睡著了還夢靨了……然后今天 7點半起床,覺得今天的狀態極差,一直有些迷迷糊糊,思維非常慢,一下就跑神了(跑神就去想膩了,哈哈,強行讓膩背鍋)。
先總結下這幾天的時間詳情(大體以昨天的時間計算):
早晨 7:31 和 7:38 兩個鬧鐘(不喜歡把鬧鐘時間放在整點),基本起來就是35(如果31響了不怎么困的話),say早安,然后打開摩拜預約一個單車(瞬間我就只有15分鐘的時間了,而且一般會預約第二個)……直接算到出門到開始騎單車時間吧,大概 8:02,然后騎車到公司 8:17,吃過早點到工位 8:45,開電腦,接杯咖啡,泡點茶坐回到工位大概 9:00,看看郵箱,然后開始看手機(隨緣看幾個公眾號,大多是毒舌科技36kr等互聯網或新鮮事有關的,算是獲取信息),不知不覺就到了9:45,刷個百詞斬打個卡,10:05 開始進入學習狀態,一般12:05之前會收到彬哥的”吃飯“,(暫記 2 個小時認真學習時間)。吃過飯回來坐到工位大概 13:10,然后大概蹭到兩點開始學習,一般 18:10 之前會收到彬哥吃飯的呼喚,(暫記4個小時學習時間),回到工位大概 19:05,稍微調整 19:20 進入學習狀態(這個階段學習效率最低,可以用來總結回顧,不學習新的東西),20:10 杰哥叫我去健身,(暫記50min 學習時間)收拾好到健身房 8:35 開始健身,22:00 結束,到家22:23…………
巴拉巴拉這么多,最終學習時間 【6 小時 50 min 】,再算上精力等因素,滿狀態高效率學習時間并不多了。總結一下,期間有太多時間浪費在手機上,健身因為有同事確實導致我的效率下降,回去太晚,洗漱完了上床太晚,床上玩手機太久,導致遲睡,致使第二天精神不好!
現做出如下調整,為了使我可以更早的入睡,采用倒序來安排時間,以下時間都為最遲時間:
23:00上床,22:20到家,22:00健身完畢,21:00開始健身,20:40收拾工位,19:10開始學習,18:00去吃飯,14:00開始學習,13:30看書,12:10去吃飯,9:00開始學習,8:40吃完早點,8:10到公司,7:30起床?????? 理論學習時間八個半小時
注:以上時間僅供參考,具體視情況而定,嗯,就醬