Java 數組及數組常用演算法

来源:https://www.cnblogs.com/carlosouyang/archive/2019/04/17/10721161.html
-Advertisement-
Play Games

1 數組也是一種類型 Java中要求所有的數組元素具有相同的數據類型。因此在一個數組中,數組元素的類型是唯一的,不能存儲多種類型的數據。 一旦數組的初始化完成,數組在記憶體中所占的空間將被固定下來,因此數組的長度不可以被改變。即使某個數組元素的數據被清空,他占的空間依然被保留,依然屬於該數組,數組的長 ...


1 數組也是一種類型

  • Java中要求所有的數組元素具有相同的數據類型。因此在一個數組中,數組元素的類型是唯一的,不能存儲多種類型的數據。
  • 一旦數組的初始化完成,數組在記憶體中所占的空間將被固定下來,因此數組的長度不可以被改變。即使某個數組元素的數據被清空,他占的空間依然被保留,依然屬於該數組,數組的長度依然不變。
  • Java的數組既可以存儲基本類型的數據,也可以存儲引用類型的數據,只要所有的數組元素具備相同的類型即可。
  • 值得指出的是,數組也是一種數據類型,是引用類型。所以可以把數組作為數組的元素,也就構成了二維數組

2 定義一個數組

  數組的定義可以採用兩種方法,推薦採用第一種,這樣變數的類型是數組這一概念更加直接。

(1) type[] arrayName;
(2) type arrayName[];

  數組是一個引用類型的變數,因此使用它定義一個變數時,僅僅表示定義了一個引用變數(也就是定義了一個指針),這個引用變數還未指向任何有效的記憶體,因此定義數組時並沒有指定數組的長度,這個應用變數並沒有指向任何有效的記憶體空間,所以還不能被使用,需要對其初始化。

3 初始化數組

  註意,不要在進行初始化時,既指定數組的長度也為每個數組元素分配初始值。 一般採用下列方法中的一種。

3.1 靜態初始化

  初始化時由程式員顯示指定每個數組元素的初始值,由系統決定數組長度。

arrayName = new type[] {element1 , element2 , element3 , element4...};
  • 此處的type必須與定義數組變數時所用的type相同,也可以是定義時的type的子類
  • 執行靜態初始化時,顯示指定的數組元素值的類型必須與new關鍵字後面的type類型相同,或者時其子類的實例。

3.2 動態初始化

  初始化時程式員只指定數組長度,由系統為數組元素分配初始值。

arrayName = new type[length];

3.3 更簡潔的方法

  如果我們在定義的時候就對數組進行靜態初始化,可以用一種更簡潔的方法。

type[] arrayName = {element1 , element2 , ...};

4 遍曆數組

  Java為數組提供了一個更簡單的迴圈,foreach迴圈。這種迴圈會自動遍曆數組和集合,更加簡潔。使用foreach時無需獲得數組和集合的長度,無需根據指引訪問數組元素和集合元素。語法:

for(type variableName : array |collection){
//variableName 自動迭代訪問每個元素
} 

  variableName 是一個形參名,foreach 會自動將數組元素依次賦給該變數。冒號後面寫數組名或集合名

  foreach 方法不能修改原數組的值,只能讀取,因為我們在語句裡面直接訪問的是形參,而不是數組本身,foreach 會自動將數組的值賦給形參供我們提取。

5 深入數組(記憶體)

  在這裡我們假設定義的是 int[] 類型。

  • 在我們定義一個數組變數的時候,系統會在棧記憶體存放一個變數,這個變數的類型是引用類型,這個變數的值為 null ,並不指向任何有效的記憶體空間。

     

  • 接著我們用 new 關鍵字為其創建了一個 int[] 類型的對象,這個對象存放在系統的堆記憶體中,在用“=”將其賦給變數的時候,實際上是將堆記憶體里對象的地址賦給了變數,這時候就可以通過”arrayName[index]“的方式訪問數組的值。這裡假設數組長度是5。

 

  • 假設我們再創建一個數組變數 array2,並將 arrayName 賦給它,這時候 array2 接受到的實際是 arrayName 變數存儲的地址,所以這兩個變數將指向同一個數組。若我們把 1 賦給array2[0],這時候我們列印 arrayName[0] 的時候會發現,它的值也是1,這是因為它們指向的是同一個記憶體中存儲的值。

6 數組常用方法

6.1 插入演算法

  一個數組有序,添加一個元素後,數組依然有序。

public class AddNumToArray{
	public static void main(String[] args){
		// 一個有序的數組,向該數組中添加一個元素,數組依然有序。
		int[] arr = {1,3,7,9,12,20,0};
		int t = 0;
		// 【1】找位置
		int loc = -1; // 表示t應該添加到的位置
		for(int i = 0;i<arr.length-1;i++){
			if(arr[i] >= t){
				loc = i;
				break;
			}
		}
		System.out.println("loc = "+loc);
		if(loc < 0){ // 沒找到合適的位置
			arr[arr.length-1] = t;
		}else{
		// 【2】依次後移
			for(int j=arr.length-1;j>loc;j--){
			arr[j] = arr[j-1];
			}
		// 【3】添加插入的值
			arr[loc] = t;
		}
		// 驗證
		for(int i = 0;i<arr.length;i++){
			System.out.print(arr[i]+"\t");
		}
	}
}

  

6.2 刪除演算法

  從數組中刪除一個數據,繼續保持有序排列

public class DeleteNumFromArray{
	public static void main(String[] args){
		// 刪除演算法
		int[] arr = {1,3,7,9,12,20};
		int t = 1;
		// 【1】找位置
		int loc = -1;
		for(int i=0;i<arr.length;i++){
			if(t == arr[i]){
				loc = i;
				break;
			}
		}
		// 【2】移動元素
		if(loc < 0){
			System.out.println(t+"在數組中不存在");
		}else{
			for(int j = loc;j<arr.length-1;j++){
				arr[j] = arr[j+1];
			}
			// 【3】最後一個元素置0
			arr[arr.length-1] = 0;
		}
		// 驗證
		for(int i = 0;i<arr.length;i++){
			System.out.print(arr[i]+"\t");
		}
	}
}

  

6.3 冒泡排序法

  將無序數組按順序排列

public class Test10{
	public static void main(String[] args){
		// 對一個無序的數組進行排序
		int[] arr = {10,5,3,4,2,9,7};
		int tmp = 0;
		for(int i=0;i<arr.length-1;i++){ // 外層控制趟數
			for(int j=0;j<arr.length-1-i;j++){ // 兩兩比較
				if(arr[j]>arr[j+1]){
					tmp = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = tmp;
				}
			}
		}
		for(int i=0;i<arr.length;i++){
			System.out.print(arr[i]+"\t");
		}
	}
}

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 首先我們要下載一個PowerDesigner,自己上百度下載哈!嘻嘻!!! 我這個是漢化版的 然後點這個,再到空白的地方點一下就創建好了。 然後單擊右邊箭頭然後雙擊 不管是製作的圖還是代碼生成的圖都可以一鍵生成代碼文本文件 PowerDesigner的功能還是很強大的,還有很多新花樣等著我們去挖掘! ...
  • 在web.xml文件中配置字元編碼過濾器: ...
  • 工廠模式的學習篇幅比較長,小編第一次看書的時候,就一口氣花了一個多小時,還是通讀。後面又斷斷續續地繼續瞭解了下,力爭做到清晰的認知,給大家一個簡單的學習方式。所以,這次模塊分的可能會比之前的多,涉及到多個工廠模式。好的,我們繼續沖鴨!!! 除了使用new操作符之外,還有更多製造對象的方法。我們將瞭解 ...
  • IOC:控制反轉(Inversion of Control,英文縮寫為 IOC) 簡單來講就是把代碼的控制權從調用方(用戶)轉變成被調用方(服務端) 以前的代碼控制權在調用方,所以要每當程式要更新修改功能時,一定要大量修改調用方的代碼才行,工程量大,維護麻煩。 後來有了IOC,可以將所有的功能模塊交 ...
  • What 本篇應該是穩定性「三十六計」系列的一篇:超時重試。但是「設置預設的超時和重試是一個基礎設施的基本素養」這句話我在我們組內三次開會的時候都說了。表達了我的一個理念。 Why 為什麼一個基礎設施要設置預設的超時和重試?想象下麵一個場景。 TCP協議里有一些基本的概念:MSL、TTL、RTT。 ...
  • 第一次寫文章 很粗略 請多多指教 有什麼疑問或者問題歡迎發郵件給我 [email protected] 鏈接:http://note.youdao.com/noteshare?id=ea9b9d16c549d6ddc827dd2e70c185b1&sub=B5DEED2633F242309ECEA96 ...
  • [TOC] 介紹 初學Java虛擬機幾天, 被方法區, 永久代這些混雜的概念搞混了. 我覺得學習這部分知識應該把官方定義的虛擬機運行時數據區域和虛擬機記憶體結構分開敘述, 要不然容易誤導. 本文先介紹官方文檔規定的運行時數據區域, 然後以JDK1.8的HotSpot虛擬機為例, 介紹虛擬機的記憶體結構. ...
  • php概述 什麼是php,PHP語言的優勢,PHP5的新特性,PHP的發展趨勢,PHP的應用領域。 PHP是超文本預處理器,是一種伺服器端,跨平臺,HTML嵌入式的腳本語言,具有c語言,Java語言,和Perl語言的特點,是一種被廣泛應用的開源式的多用途腳本語言,適合web開發。 PHP是b/s體系 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...