多個數字數組_七個問題幫助初學者深入理解Java數組

短文漲姿勢,看了不白看,不關注等啥?

幾乎所有的高級語言當中,都提供了一種叫做”數組”的東西,Java語言當然也不例外。我們通過數組可以很方便的存儲和管理一組數據。因為在Java語言當中使用數組非常的方便,所以導致很多初學者忽略了對數組的深入學習,本文就通過七個問題,來幫助初學者深入理解一下Java語言的數組到底是怎么回事。

一、數組是變量的簡單疊加嗎?

我們在學習Java的時候,知道一個int類型的變量可以存儲一個整數,而一個int類想的數組可以存儲多個整數。于是很多人認為數組只不過是變量的簡單疊加而已,無非是變量存1個數,數組存多個數。其實不然,Java語言是把數組當作一個“對象”來看待的。我們來看下面的代碼

0b51b402cf5337918fca659282552891.png

我們可以看到,在代碼中聲明了int型變量a和int型數組b,b的長度為1。a和b都只能存儲1個int型數據,似乎它們之間沒什么區別。但是請注意:a和b之間其實是有本質區別的,a是一個基礎數據類型的變量,而b則是一個對象!正因為它是一個對象,所以我們才可以調用到它的getClass()方法。那么緊接著小伙伴們會問:b既然是一個對象,那么這個對象是什么類型的呢?我們可以通過“b.getClass().getName()”獲得它類型的名稱是” [I”。讀者也可以通過這種方式,獲得其他幾種基礎數據類型數組的類型名稱。最重要的是,我們必須搞清楚:數組不是變量的簡單疊加!即便是基礎數據類型的數組,也是以對象的形式存在的。

二、為什么數組的下標是從0開始的?

同很多編程語言一樣,Java語言數組的下標也是從0開始的。很多初學者都不理解,為什么數組下標要從0而不是從1開始?這太不符合我們的日常計數習慣了。為了說清楚這個問題,我們還是先看一段代碼

f10614a7cac0b1c1e3b5bd857f4580fb.png

在這段代碼中,創建了一個長度為5的數組并命名為a。在程序實際運行的時候,會分配一組連續的空間,這組空間中可以存儲5個int型數據。為了能夠準確的從這組空間的任意一個單元中找到數據,虛擬機必須能夠對這組空間中任意一個單元做出識別。那么如何識別每個單元呢?虛擬機可以把每個單元都進行單獨的命名,這樣做當然能夠達到目的,但是這么做跟使用變量就沒什么區別了,更體現不出這組數據是一個連續的整體。實際的情況是:虛擬機給這組空間的第一個單元命名為a,如果希望找到a本身,那么就直接用a[0]來表示,其中方括號中的0表示偏移量。偏移量為0,就表示找的就是a這個空間中的數據,而a[1]表示以a為基準點,偏移1個單元,這樣就找到了數組中第2個元素,以此類推,想找到數組中第5個元素,就以a這個單元為基準點,再偏移4個單元即可。因此我們就可以知道,數組的下標本質上并不是數組元素的編號,而是以數組首元素為基準點所偏移的量。這就是數組下標從0開始的原因。

三、數組的長度為什么可以用變量表示?

我們還是先來看一段代碼

bab40f2732eaddf0ae237c531bbfbdb4.png

這段代碼中,在創建數組的時候,以變量表示了這個數組的長度,這種做法放到Java語言中似乎很常見,但是如果使用C語言編程,在創建數組的時候,數組的長度必須是一個固定的值,不能用變量來表示。很多人似乎對這個問題不以為然,只是簡單的認為這只是Java和C語言之間一點簡單的語法差別而已。

其實問題遠不是這么簡單。這個簡單的語法差別其實體現出了Java與C語言之間編譯和運行機制本質的不同。變量是運行時才被賦值的,Java語言允許把數組的長度以變量的形式來表示,其背后的根本原因就是允許數組一直等到”運行時”才把長度確定下來。也就是說,程序員可以在編碼的時候,不用規定數組的長度,等到程序實際運行的時候,根據實際需要去確定數組的長度,這樣大大增加了程序的靈活性。

舉個例子:如果我們編寫程序,要求用戶輸入幾個數字保存到數組中,然后進行排序,用戶輸入多少個數字不確定。如果我們用Java語言去完成這個程序,只要先讓用戶輸入他想對多少個數字進行排序,然后把數字的個數保存到一個變量中,接著以這個變量的值作為長度創建數組就可以。但是如果是用C語言來完成程序,那么程序員必須在編寫代碼的時候就把數組的長度定下來,而不能等到程序運行的時候再去確定。因為C語言不能動態的在運行時確定數組的長度,必須在編譯階段就把長度確定下來。但是程序員在編碼的時候并不確定用戶要對多少數字完成排序,于是就只能以經驗推測,創建一個他認為”足夠大”的數組來存放排序的數字。如果創建的數組太大,則浪費空間,如果數組太小,則無法保存全部數字。

說了這么多,重點其實就一句話:Java語言的數組可以在”運行時”確定長度!并且這個特點大大的增加了程序的靈活性。

四、Java數組的長度可以為0嗎?

這個問題很簡單,只要寫一段代碼就可以得到答案:可以!關鍵問題來了:長度為0的數組不能存數據,這種數組有什么意義呢?前面說過,Java語言允許在程序運行過程中動態確定數組長度。那么我們就可以設想這樣的一個場景:要求編碼查詢出考試總分在700分以上的學員,并且把他們的姓名存儲到一個字符串數組中。假如經過查詢之后,發現沒有成績在700分以上的學員,該如何表示這個查詢結果呢?如果查詢方法返回null來表示沒有查到符合條件的數據,會對后續程序帶來一定的風險,因為畢竟空對象可能會導致后面的處理代碼中拋出空指針異常。而用一個長度為0的數組來表示查詢結果就安全多了,僅能體現出沒有查到符合條件的數據,又降低了拋出異常的風險。

五、Java語言中的數組可以擴大容量嗎?

答案是不可以!因為數組一旦分配了空間之后,如果想在原來空間的基礎上擴大容量,就如同是擴張地盤,勢必會影響到內存中其他數據的存儲,所以Java語言不允許數組擴大容量。網上有很多資料,講解了如何擴大數組的容量,并給出了實現代碼。如果你仔細去看這些代碼,你會發現,這些所謂擴大數組容量的算法,其實現過程都是新創建一個更大的數組,然后把原數組中的數據拷貝到新數組中,最終返回那個新創建的數組。因此這種所謂的擴容算法其實并不是真正的擴容。

六、可以創建抽象類數組嗎?

還是看代碼

7cb8401ea9c9ce6e4ae8b5b6314458b1.png

代碼中創建了一個抽象類A,并且在main()方法中創建了一個A類型的數組。問題又來了:抽象類A不能創建對象,而現在不僅創建了對象,并且還是一組!這是怎么回事?其實這也是很多初學者在理解引用類型數據數組的一個誤區:認為數組中存放的某種類型的對象。其實不然,引用數據類型的數組中,存放的并不是對象,而只是能指向這種對象的引用而已。就拿上面這段代碼來說,數組a中并沒有存放5個A類型的對象,而只是存放了5個能夠指向A類型對象的引用,這些引用在數組初始化的過程中,都指向空對象(null),所以千萬不要錯誤的認為創建了某類型的數組,同時就創建了N個該類型的對象。代碼中,數組a中所存放的那些引用,將來所指向的必定也是A類子類的對象,因為A類自身根本就不能創建對象。

七、多維數組的length屬性值是多少?

看代碼

99c4f173405b07e065afed517c04a072.png

以上代碼運行,輸出結果會是多少呢?一部分初學者會認為輸出的結果是12,因為這個數組能夠存儲12個數字。但程序實際運行輸出的結果卻是3,這是為什么呢?就是因為,無論數組本身的維度是多少,在Java虛擬機看來,這個數組都是一維數組!有小伙伴可能不解:a明明是一個二維數組,怎么會被當作是一維數組呢?我們可以看下圖來幫助理解

4070db117ee6463d55ea51bcf3a2335b.png

我們可以看到,圖中是一個3行4列的二維數組。但是如果我們把數組中的每一行看作是一個元素,那么這個二維數組就可以被理解為一個一維數組,數組中包含3個元素,只不過每個元素并不是一個簡單的數字,而是一個一維數組。也就是說,這個二維數組可以被理解為”由3個一維數組組成的數組”。Java語言就是以這樣的方式來管理數組的,無論數組維度是多少,都被當作一維數組,如果數組中的元素又是數組(嚴格的表述應該是:數組元素是指向一維數組的引用),那么就形成了多維數組。因此,剛才在代碼中看到的那個二維數組a,它的length屬性值為3而不是12。

希望通過這七個問題,能夠幫助初學者深入理解Java語言的數組。

看短文,漲姿勢,如想系統學習Java編程,點擊下方的“了解更多”即可,不讓你進去,用QQ登錄就可以啦!有問題也可以加入我的QQ群一起討論!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372942.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372942.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372942.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java 異常練習題1

建立exception包,建立Bank類,類中有變量double balance表示存款,Bank類的構造方法能增加存款,Bank類中有取款的發方法withDrawal(double dAmount),當取款的數額大于存款時,拋出InsufficientFundsException,取款數額為負數,拋出Nag…

大話設計模式讀書筆記--6.原型模式

簡單的復制粘貼極有可能造成重復代碼的災難, 但是java中提供了克隆的功能, 如果一個對象創建過程復雜,又要頻繁使用, 在初始化信息不發生變化的情況下,應當采取克隆而不是new一個對象 定義 原型模式: 用原型實例指定創建對象的種類,并且通過拷貝這些原型創建新的對象 也就是說,…

Java 7#8:測試臺上的NIO.2文件通道

關于新JDK 7功能的另一篇博客文章。 這次我正在寫有關新的AnsynchronousFileChannel類的文章。 我將在兩周內深入分析新的JDK 7功能,并決定連續編號我的帖子。 只是為了確保我不會感到困惑:-)這是我關于Java 7的第七篇文章(我承認–碰巧–這也…

5頁面title樣式修改_認識html:實現網站頁面是這么簡單的一回事

互聯網時代人們通過上網瀏覽信息,打開瀏覽器上網看到豐富的圖文、視頻、音樂等多媒體信息,一系列信息反饋和視覺沖擊之后,您有沒有想過,互聯網這么發達的時代,您覺得花一點點時間學會做個網站頁面不真香?概…

iOS指南針

前言: 這個小項目使用到了CoreLocation框架里面的設備朝向功能,對CoreLocation感興趣的可以翻一下之前的文章 在另一個博客站有朋友發現一個尷尬的問題(圖片的東西2個方向是不對的),原諒我的大意,趕時間就直…

OSGI –模塊化您的應用程序

由于我是模塊化,低耦合,高凝聚力等的大力擁護者,所以…… 我相信這項技術是我們使用Java平臺創建應用程序的突破。 使用OSGi,創建高度可擴展的應用程序非常簡單,例如參見Eclipse IDE。 我的目的不是要深入展示該技術的…

jq的鏈式調用.end();

jq的鏈式調用.end(); 先上code <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>li{list-style: none;width: 100px;height:20px;border:1px solid #ff0000;display: …

三、自定義視圖、視圖控制器

1.自定義視圖 自定義視圖&#xff1a;系統標準UI之外&#xff0c;自己組合而出的新的視圖。在實際開發中&#xff0c;我們經常需要自己定義視圖&#xff0c;積累自己的代碼庫。自己封裝的視圖&#xff0c;能像系統提供的UI控件一樣用于多個項目中&#xff0c;這樣可以提高我們的…

程序如何在兩個gpu卡上并行運行_深度學習分布式訓練相關介紹 - Part 1 多GPU訓練...

本篇文章主要是對深度學習中運用多GPU進行訓練的一些基本的知識點進行的一個梳理文章中的內容都是經過認真地分析&#xff0c;并且盡量做到有所考證拋磚引玉&#xff0c;希望可以給大家有更多的啟發&#xff0c;并能有所收獲介紹大多數時候&#xff0c;梯度下降算法的訓練需要較…

集成Spring和JavaServer Faces:改進的模板

隨著2.0版的發布&#xff0c;Facelet模板成為JSF規范的核心部分。 使用<ui&#xff1a;composition>和<ui&#xff1a;decorate>標記&#xff0c;可以輕松構建復雜的頁面&#xff0c;同時仍保持標記清晰。 模板在創建HTML表單時特別有用&#xff0c;但是不幸的是&a…

whmcs模板路徑

whmcs網站根目錄 比如你的域名是server.nongbin.vip&#xff0c;你需要cd /home/wwwroot/server.nongbin.vip&#xff0c;該目錄下然后&#xff0c;cd template/ 給文件夾下就是你上傳的模板文件夾轉載于:https://www.cnblogs.com/nongbin/p/6412108.html

系統英偉達gpu驅動卸載_繞過CPU,英偉達讓GPU直連存儲設備

英偉達最近發布了一個新的GPUDirect Storage&#xff0c;暫且叫做GPU直連存儲&#xff0c;讓GPU直接連到NVMe存儲設備上。這一方案用到了RDMA設備來把數據從閃存存儲轉移到GPU本地的內存里&#xff0c;無需經過CPU還有系統內存。如果這一舉措順利的話&#xff0c;英偉達就能擺脫…

37、EnumSet詳解

EnumSet類也是有順序的&#xff0c;EnumSet按照枚舉值在Enum類內定義的順序決定集合元素的順序 EnumSet在內部已位向量的形式存儲&#xff0c;這種存儲方式非常緊湊、搞笑&#xff0c;因此EnumSet占用內存很小&#xff0c;而且運行效率很好。 EnumSet集合不允許加入null元素 En…

嘲弄和存根–了解Mockito的測試雙打

介紹 我遇到的一件事是使用模擬框架的團隊假設他們在模擬。 他們并不知道Mocks只是Gerard Meszaros在xunitpatterns.com上歸類的“測試雙打”之一。 重要的是要意識到每種類型的測試雙精度在測試中都扮演著不同的角色。 用與您需要學習不同模式或重構的方式相同&#xff0c;您…

numpy 辨異(三)—— hstack/column_stack,linalg.eig/linalg.eigh

1. np.hstack np.column_stack >>> np.hstack([np.array([1, 2, 3]), np.array([4, 5, 6])]) array([1, 2, 3, 4, 5, 6])>>> np.column_stack([np.array([1, 2, 3]), np.array([4, 5, 6])]) array([[1, 4],[2, 5],[3, 6]]) 當然對等地&#xff0c;也存在&…

【代碼筆記】iOS-首頁3張圖片變化

一&#xff0c;效果圖。 二&#xff0c;工程圖。 三&#xff0c;代碼。 RootViewController.h #import <UIKit/UIKit.h>interface RootViewController : UIViewController {NSTimer *timer;UIImageView *imageView1;UIImageView *imageView2;UIImageView *imageView3;UIV…

acwing算法提高之動態規劃--數位DP

目錄 1 基礎知識2 模板3 訓練 1 基礎知識 暫無。。。 2 模板 暫無。。。 3 訓練 題目1&#xff1a;度的數量。 解題思路&#xff1a;分類討論。 C代碼如下&#xff0c; #include <iostream> #include <vector>using namespace std;const int N 35; int K,…

python 輸入數字變成密碼_如何在python中檢查數字的“密碼”

我建議使用sets和stdlib中的string包作為可接受字符的列表。在我還建議進行一點重構&#xff0c;以刪除大量帶有if / else分支的嵌套。在import stringupper set(list(string.uppercase))lower set(list(string.lowercase))numbers set(list(string.digits))while True:npw …

使用Eclipse在Amazon Ec2中部署Java Web應用程序的完整指南

嗨&#xff0c;讀者們&#xff0c; 今天&#xff0c;我將向您展示如何使用Eclipse IDE在Amazon EC2中部署簡單的Java Web應用程序。 在我們開始之前&#xff0c;我們需要一些必需的東西&#xff0c; Eclipse Java EE IDE –您可以從http://www.eclipse.org/downloads/下載&…

jquery的load方法

load方法指定一個界面會顯示在目標的標簽內部 比如MVC的一個分部視圖頁面想要顯示在某個標簽里面&#xff0c;可以寫成 $(標簽ID).load&#xff08;分部視圖名稱,data&#xff09; 其中第二個參數可選&#xff0c;主要是一些需要傳遞到該頁面的數據JSON格式組成&#xff0c;發送…