數(shù)組類型和數(shù)組引用變量詳解
數(shù)組類型
為什么要用數(shù)組?
Java數(shù)組的兩大特征:
定義數(shù)組時(shí),不能指定數(shù)組的長度
變量分為 2 種:
數(shù)組的初始化:
遍歷數(shù)組:
深入理解數(shù)組的存放:
二維數(shù)組與多維數(shù)組
Arrays工具類,提供一些方法來操作數(shù)組昌罩。
數(shù)組類型
Java 數(shù)據(jù)類型可以分為:基本類型 — 8 個(gè)
???????????????????????????????????????? 引用類型 — 類、接口、數(shù)組
數(shù)組是引用類型无拗。
int → int [ ]??? — 整型數(shù)組
double? →? double [ ]??? — double 數(shù)組
……
String? → String [ ]?? —? String 數(shù)組
int [ ]? →? int [ ] [ ]?????? —? 新的數(shù)組類型
int [ ] [ ]? →? int [ ] [ ] [ ] ? ? —? 新的數(shù)組類型
PS:
??? //? 類型? 變量名
int a [ ];????????????? //? 垃圾寫法,雖然正確昧碉,但是可讀性差
?? //? 類型是 int [ ] 英染,變量名是 a
int [ ] a;???????????? //? 正確寫法
?數(shù)組類型:就是一個(gè)真正的類型,它即可用于創(chuàng)建變量被饿,也可用于進(jìn)行強(qiáng)制類型轉(zhuǎn)換
為什么要用數(shù)組四康?
如果程序中需要用到多個(gè)相同類型的變量,就可以考慮把它們集中定義成一個(gè)數(shù)組狭握。
——每個(gè)數(shù)組元素闪金,就相當(dāng)于一個(gè)普通的變量
借助于數(shù)組,我們可以非常方便地去管理、訪問每個(gè)數(shù)組元素(相當(dāng)于一個(gè)變量)
Java數(shù)組的兩大特征:
??????? Java語言是強(qiáng)類型:? 一個(gè)數(shù)組里只能存儲(chǔ)一種數(shù)據(jù)類型的數(shù)據(jù)
??????? Java語言是靜態(tài)的:? Java的數(shù)組一旦被初始化之后哎垦,它的長度是固定的囱嫩。
定義數(shù)組時(shí),不能指定數(shù)組的長度
數(shù)組類型是引用類型漏设。
引用類型的本質(zhì)就是指針墨闲。——指針也是變量愿题,只不過它里面存的值是內(nèi)存編號(hào)(內(nèi)存地址)
數(shù)組變量只是一個(gè)引用损俭,因此聲明時(shí)只是定義了一個(gè)引用變量,并未真正指向有效的數(shù)組對(duì)象(存在)潘酗,也就是并未真正指向有效的內(nèi)存杆兵,因此不能聲明長度,而且也不能使用仔夺。
變量分為 2 種:
??? 1.直接在變量中存放實(shí)際的變量值琐脏。這就是Java的基本類型的變量。
??? 2.在變量中存放只是內(nèi)存的地址值缸兔,這就是所謂的引用變量日裙。
數(shù)組的初始化:
??? 數(shù)組變量只是一個(gè)引用,必須讓它指向有效的內(nèi)存之后才能使用
初始化分為兩種:
??? 靜態(tài)初始化:
??????? new <type> [ ] {<ele1>,<ele2>,<ele3>...};???? //? <>里可替換
??????? 只指定數(shù)組的元素惰蜜,讓系統(tǒng)來決定數(shù)組的長度昂拂。
??? 動(dòng)態(tài)初始化:
? ? ? ? new <type> [ <length> ]? ? ? ? ? ? ? //? <>里可替換
??????? 只指定數(shù)組的長度,讓系統(tǒng)來決定數(shù)組的元素的值抛猖。
如果數(shù)組元素是基本類型格侯,那么所有數(shù)組元素的值都是 0 / 0.0 / false / \u0000? (只記都是零)
如果數(shù)組元素是引用類型客叉,那么所有數(shù)組元素的值都是 null
一旦數(shù)組的初始化完成遂蛀,接下來的每個(gè)數(shù)組元素就可當(dāng)成普通變量使用了咸作。
使用數(shù)組:
每個(gè)數(shù)組元素相當(dāng)于一個(gè)變量躯枢,該變量的類型鲤嫡,就是數(shù)組類型去掉【一個(gè)】方括號(hào)厕怜。
數(shù)組有一個(gè) length 屬性侮东,用于返回該數(shù)組的長度墩瞳。
遍歷數(shù)組:
??? A.? 可以依次根據(jù)每個(gè)數(shù)組元素的索引來進(jìn)行遍歷伟姐。
??? B.? 使用 foreach 循環(huán)進(jìn)行遍歷收苏。
for(數(shù)組或集合元素的類型? 變量名:數(shù)組\集合)
{
????? //? 此處即可通過”變量名“依次訪問每個(gè)數(shù)組\集合的元素
}
注意點(diǎn):foreach 循環(huán)時(shí),不要對(duì)循環(huán)變量賦值愤兵!
********如果要在遍歷時(shí)對(duì)數(shù)組元素進(jìn)行賦值倒戏,那就應(yīng)該根據(jù)數(shù)組元素的索引來進(jìn)行遍歷
/****************************************************
補(bǔ)充:
1. 內(nèi)存泄露:c語言,把內(nèi)存分配出去之后恐似,后面忘記了回收這些內(nèi)存
2. 對(duì)象還存在杜跷,以后還要用的時(shí)候,內(nèi)存早早就把對(duì)象清理出去了
***********************************************************/
Java 就把指針換個(gè)名字,叫引用葛闷。
??????? 對(duì)指針做了一些包裝憋槐、做了一些檢查——這樣可以保證引用更加安全
??????? 引用:被包裝后的、更加安全的引用
/*********************************************************
補(bǔ)充:
JVM有一條后臺(tái)進(jìn)程:垃圾回收器
??????? 它會(huì)用一種機(jī)制記錄 堆內(nèi)存 中“每個(gè)對(duì)象”是否有引用變量(指針)引用它
???????????? 如果有淑趾,垃圾回收器就不會(huì)管它阳仔。
??????????? 如果沒有,垃圾回收器就會(huì)在合適時(shí)候去回收該對(duì)象所占的內(nèi)存
*********************************************************/
深入理解數(shù)組的存放:
??????? 當(dāng)數(shù)組對(duì)象的引用變量被銷毀之后扣泊,數(shù)組對(duì)象并不一定會(huì)被回收(它在堆內(nèi)存)近范,它不會(huì)隨著數(shù)組變量被回收。
??????? 只有當(dāng)沒有引用變量引用這個(gè)數(shù)組對(duì)象時(shí)延蟹,系統(tǒng)才會(huì)去回收數(shù)組對(duì)象评矩。
PriArrayTest 程序 及 運(yùn)行結(jié)果:
public class PriArrayTest
{
??? public static void main(String[] args)
??? {
??????? // 所有在方法里聲明的變量,都放在對(duì)應(yīng)的方法棧阱飘。
??????? /*
???????? *? 每個(gè)方法運(yùn)行時(shí)斥杜,系統(tǒng)都會(huì)為之建立一個(gè)方法棧
?? ? ??? *? 棧內(nèi)存是臨時(shí)性的內(nèi)存,當(dāng)方法結(jié)束時(shí)沥匈,方法棧會(huì)被立即釋放
???????? *? 所以棧內(nèi)存不適合存放長期有效的數(shù)據(jù)
? ? ? ?? *
? ? ? ?? *? 堆內(nèi)存:每個(gè)JVM 只有一個(gè)
? ? ? ?? *? ? ? ? ? 只要JVM不退出蔗喂,堆內(nèi)存將一直存在
? ? ? ? */?
?? ? ?? double d = 23.5;? // d 是基本類型
?? ? ?? int[] iarr = null;? // 它只是數(shù)組變量,引用變量高帖。
?? ? ? ? ? ? ? ? ? ? ? ? ?? // 此時(shí)這個(gè)iarr不能使用缰儿。
??? //? NullPointerException異常,空指針異常
??? //? 當(dāng)程序訪問一個(gè) null 對(duì)象的實(shí)例方法或?qū)嵗龑傩?/p>
??? //? 程序就會(huì)引發(fā)NullPointerException異常
??? // System.out.println(iarr[0]);
??????? iarr = new int[4]; // 所有的對(duì)象都放在“堆”內(nèi)存
??? // 每個(gè)JVM(虛擬機(jī))只有一個(gè)“堆”內(nèi)存
??? //? 在Java程序里散址,只要訪問“引用”的方法乖阵、屬性時(shí),
??? //? 系統(tǒng)會(huì)自動(dòng)切換到訪問它實(shí)際的對(duì)象
??? //? 堆內(nèi)存中的對(duì)象爪飘,只能通過引用變量來訪問
?? ? ?? iarr[2] = 34;? //? 34是基本類型义起,但它實(shí)際上存在“堆內(nèi)存”中
?? ? ?? System.out.println(iarr.length);
??? // 靜態(tài)初始化的簡化語法
?? ? ?? int[] ba = {12,20,102};
?? ? ?? iarr = ba; //? 把ba的值賦給iarr
??????? System.out.println(iarr.length);
??? }
}
此時(shí)? 0x12ab34ed? 沒有被引用拉背,垃圾回收器會(huì)在合適的時(shí)候回收它
數(shù)組測試 程序 及 運(yùn)行結(jié)果:?
public class 數(shù)組測試
{
??? public static void main(String[] args)
??? {
??? int[] iArr;??? // 聲明了一個(gè)數(shù)組變量师崎。引用類型變量(基礎(chǔ)就那8個(gè))。它存放的是內(nèi)存變量
??? // iArr 是一個(gè)引用類型的變量
??? // 也就是 iArr 存放了后面創(chuàng)建的數(shù)組的地址椅棺。
// 靜態(tài)初始化
??? iArr = new int[]{20,1,12,32};
??? System.out.println(iArr[0]);
??? iArr[0] = 'A';// 'A'本來是 char犁罩,但由 char 可以自動(dòng)轉(zhuǎn)換 int 類型
??? System.out.println(iArr[0]);
// 動(dòng)態(tài)初始化
??? String[] strArr = new String[5];
??? // 第一個(gè)數(shù)組元素的索引是 0
??? // 最后一個(gè)數(shù)組元素的索引是 length - 1
??? // 把數(shù)組的最后一個(gè)元素賦值為? "明天就周六啦~~~"
??? strArr[strArr.length - 1] = "明天就周六啦~~~";
??? // 遍歷數(shù)組元素
??? for(int i = 0;i < strArr.length;i++)
??? {
? ? ? ? System.out.println("strArr[" + i + "]: " + strArr[i]);
??? }
??? //? 當(dāng)我們?cè)L問數(shù)組元素的 索引小于0 ,或者大于等于length
??? //? 將引發(fā)“數(shù)組索引越界”異常
??? System.out.println(strArr[strArr.length]);
??? }
}
二維數(shù)組與多維數(shù)組
所謂的“二維”數(shù)組
int[ ]? ? ?? →?? int[ ] [ ]
int[ ][ ]??? →?? int[ ][ ][ ]
MultiDimenTest (二維數(shù)組)程序 及 運(yùn)行結(jié)果:
public class MultiDimenTest
{
??? public static void main(String[] args)
??? {
? ?? ?? int[][] arr;? // 只是一個(gè)引用變量两疚。
? ?? ?? // 動(dòng)態(tài)初始化床估,由系統(tǒng)為數(shù)組元素賦值
? ?? ?? arr = new int[4][]; // Java允許初始化數(shù)組時(shí)候只初始化左邊的維數(shù)
? ?? ?? System.out.println(arr[1]); // arr[1]相當(dāng)于一個(gè)int[]變量
? ?? ?? arr[1] = new int[]{12,15};? // 靜態(tài)初始化語法創(chuàng)建數(shù)組對(duì)象。
??? // arr[1][2] = 30; // 此處賦值沒有問題诱渤,[1][2] 是int型丐巫,但是會(huì)引發(fā)數(shù)組索引越界的異常
??? // arr[2][0] = 13; // 由于arr[2]相當(dāng)于int[]類型的變量(即引用變量)
? ? ? ? ? ? ? ? ? ? ? ? ? ?? // 此時(shí)它還未指向有效的內(nèi)存。因此會(huì)引發(fā)NullPointerException(空指針異常)
? ?? ?? int[] a = new int[3]; // 動(dòng)態(tài)初始化
? ?? ?? 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]);
? ?? ?? }
??? }
}
多維數(shù)組
三維數(shù)組的元素是二維數(shù)組
二維數(shù)組的元素是一位數(shù)組
N維數(shù)組的元素是N-1維數(shù)組(這話是不標(biāo)準(zhǔn)的,只是為了方便記憶)
多維數(shù)組? 程序 及 運(yùn)行結(jié)果:
public class 多維數(shù)組
{
??? 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工具類递胧,提供一些方法來操作數(shù)組碑韵。
binarySearch?? — ? 二分法查找。用于查找數(shù)組中的元素缎脾。
?????????????????????????????? 但是祝闻,要求數(shù)組元素已經(jīng)是排好序。
sort(char[ ] a)? —??? 可用于對(duì)數(shù)組進(jìn)行排序
fill (type [] a,? ? int fromIndex,? ? int toIndex,? ? type val)
??? ( 類型遗菠, ? ? ? ? 開始的值? 联喘, ? ?? 結(jié)束的值 ?? ,填充的值)
Arrays工具類? 程序 及 運(yùn)行結(jié)果:
import java.util.*;
// 只有java.lang 包的類不需要導(dǎo)入辙纬。
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數(shù)組的從索引為1的元素到索引5之前的元素豁遭,都填充成20
??? Arrays.fill(b,1,5,20);
??? System.out.println(b); // 直接打印數(shù)組,看到[ 數(shù)組類型的首字母大寫@地址值
??? // Arrays 的tostring可以幫助你看到數(shù)組元素
??? System.out.println(Arrays.toString(b));
??? }
}
練習(xí):
把數(shù)字翻譯成人名幣的讀法
例如:? 10010202.12???????????? 壹仟零壹萬兩佰零貳圓壹角貳分
漢字定義成數(shù)組
以上
寫在最后:
覺得得具體規(guī)劃一下我的時(shí)間安排牲平,昨天又一不小心1點(diǎn)多睡的堤框,睡著了還夢靨了……然后今天 7點(diǎn)半起床,覺得今天的狀態(tài)極差纵柿,一直有些迷迷糊糊蜈抓,思維非常慢,一下就跑神了(跑神就去想膩了昂儒,哈哈沟使,強(qiáng)行讓膩背鍋)。
先總結(jié)下這幾天的時(shí)間詳情(大體以昨天的時(shí)間計(jì)算):
早晨 7:31 和 7:38 兩個(gè)鬧鐘(不喜歡把鬧鐘時(shí)間放在整點(diǎn))渊跋,基本起來就是35(如果31響了不怎么困的話)腊嗡,say早安,然后打開摩拜預(yù)約一個(gè)單車(瞬間我就只有15分鐘的時(shí)間了拾酝,而且一般會(huì)預(yù)約第二個(gè))……直接算到出門到開始騎單車時(shí)間吧燕少,大概 8:02,然后騎車到公司 8:17蒿囤,吃過早點(diǎn)到工位 8:45客们,開電腦,接杯咖啡材诽,泡點(diǎn)茶坐回到工位大概 9:00底挫,看看郵箱,然后開始看手機(jī)(隨緣看幾個(gè)公眾號(hào)脸侥,大多是毒舌科技36kr等互聯(lián)網(wǎng)或新鮮事有關(guān)的建邓,算是獲取信息),不知不覺就到了9:45睁枕,刷個(gè)百詞斬打個(gè)卡官边,10:05 開始進(jìn)入學(xué)習(xí)狀態(tài)沸手,一般12:05之前會(huì)收到彬哥的”吃飯“,(暫記 2 個(gè)小時(shí)認(rèn)真學(xué)習(xí)時(shí)間)注簿。吃過飯回來坐到工位大概 13:10罐氨,然后大概蹭到兩點(diǎn)開始學(xué)習(xí),一般 18:10 之前會(huì)收到彬哥吃飯的呼喚滩援,(暫記4個(gè)小時(shí)學(xué)習(xí)時(shí)間)栅隐,回到工位大概 19:05,稍微調(diào)整 19:20 進(jìn)入學(xué)習(xí)狀態(tài)(這個(gè)階段學(xué)習(xí)效率最低玩徊,可以用來總結(jié)回顧租悄,不學(xué)習(xí)新的東西),20:10 杰哥叫我去健身恩袱,(暫記50min 學(xué)習(xí)時(shí)間)收拾好到健身房 8:35 開始健身泣棋,22:00 結(jié)束,到家22:23…………
巴拉巴拉這么多畔塔,最終學(xué)習(xí)時(shí)間 【6 小時(shí) 50 min 】潭辈,再算上精力等因素,滿狀態(tài)高效率學(xué)習(xí)時(shí)間并不多了澈吨“迅遥總結(jié)一下,期間有太多時(shí)間浪費(fèi)在手機(jī)上谅辣,健身因?yàn)橛型麓_實(shí)導(dǎo)致我的效率下降修赞,回去太晚,洗漱完了上床太晚桑阶,床上玩手機(jī)太久柏副,導(dǎo)致遲睡,致使第二天精神不好蚣录!
現(xiàn)做出如下調(diào)整割择,為了使我可以更早的入睡,采用倒序來安排時(shí)間萎河,以下時(shí)間都為最遲時(shí)間:
23:00上床荔泳,22:20到家,22:00健身完畢公壤,21:00開始健身换可,20:40收拾工位椎椰,19:10開始學(xué)習(xí)厦幅,18:00去吃飯,14:00開始學(xué)習(xí)慨飘,13:30看書确憨,12:10去吃飯译荞,9:00開始學(xué)習(xí),8:40吃完早點(diǎn)休弃,8:10到公司吞歼,7:30起床?????? 理論學(xué)習(xí)時(shí)間八個(gè)半小時(shí)
注:以上時(shí)間僅供參考,具體視情況而定塔猾,嗯篙骡,就醬