Java數組類型

數組類型和數組引用變量詳解

數組類型

為什么要用數組?

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);

??? }

}

iarr=ba 根本原因

此時? 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]);

? ?? ?? }

??? }

}

MultiDimenTest內存結構


MultiDimenTest

多維數組

三維數組的元素是二維數組

二維數組的元素是一位數組

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));

??? }

}


Arrays工具類



練習:

把數字翻譯成人名幣的讀法

例如:? 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起床?????? 理論學習時間八個半小時

注:以上時間僅供參考,具體視情況而定,嗯,就醬

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,765評論 18 399
  • Win7下如何打開DOS控制臺? a:開始--所有程序--附件--命令提示符 b:開始--搜索程序和文件--cmd...
    逍遙嘆6閱讀 1,614評論 4 12
  • Java經典問題算法大全 /*【程序1】 題目:古典問題:有一對兔子,從出生后第3個月起每個月都生一對兔子,小兔子...
    趙宇_阿特奇閱讀 1,909評論 0 2
  • 最近不知道怎么了,心情總是莫名的低落,就好比這天氣,會一會兒陰,一會兒晴,卻又有淡淡的憂傷。會偶爾想老媽,特別是剛...
    藍貝兒123閱讀 170評論 0 0
  • 尊重別人,別人才會尊重自己。工作中與同事之間也是一樣。 生活中可能我們一個小舉動會讓別人感覺到不舒服,從而戴上沒教...
    Ding欣欣閱讀 309評論 0 0