【JAVA】數組的使用

文章目錄

  • 前言
  • 一、數組的基本概念
    • 1.1 數組的創建和初始化
    • 1.2 數組的基本使用
  • 二、數組是引用類型
    • 2.1 初始JVM的內存分布
      • JVM內存劃分(按功能分區)
    • 2.2 基本類型變量與引用類型變量的區別
    • 2.3 再談引用變量
    • 2.4 認識null
  • 三、數組作為函數的參數和返回值
  • 四、數組的應用場景
    • 4.1 數組轉字符串
    • 4.2 數組的拷貝
    • 4.3 深拷貝和淺拷貝問題
    • 4.3 冒泡排序的小優化
    • 4.4 數組逆序
    • 4.5 數組逆序
    • 4.6 數組練習
  • 五、二維數組
    • 5.1 普通二維數組
    • 5.2 不規則的二維數組
  • 總結


前言

提示:這里可以添加本文要記錄的大概內容:

在Java編程的征途中,數組作為基礎卻至關重要的數據結構,是每個開發者必須掌握的核心技能。它不僅是存儲同類型元素的??高效容器??,更是算法實現、數據處理的??底層基石??。從簡單的成績管理系統到復雜的矩陣運算,數組以其簡潔的內存模型和快速的隨機訪問能力,奠定了程序邏輯的基本骨架。本篇博客將深入剖析Java數組的特性、應用場景及性能要點,幫助您從語法本質到實戰技巧全面駕馭這一編程利器。

注意:和c語言內容大致相同的部分會簡單帶過或者不講解


提示:以下是本篇文章正文內容,下面案例可供參考

一、數組的基本概念

1.1 數組的創建和初始化

數組的創建:

 T[] 數組名 = new T[N];

T:表?數組中存放元素的類型
T[]:表?數組的類型
N:表?數組的?度

public class array {public static void main(String[] args) {int[] array1=new int[10];double[] array2=new double[10];String[] array3=new String[10];}
}

數組的初始化:
數組的初始化主要分為動態初始化以及靜態初始化

  1. 動態初始化:在創建數組時,直接指定數組中元素的個數,只開辟空間但是不賦初值
  2. 靜態初始化:在創建數組時不直接指定數據元素個數,?直接將具體的數據內容進?指定
    示例代碼:
public class array {public static void main(String[] args) {int[] array1=new int[]{0,1,2,3,4,5,6};double[] array2=new double[]{1.0,2.0,3.0,4.0,5.0,6.0};String[] array3=new String[]{"hello"};int[] array4={1,2,3,4};}
}

【注意事項】:

  • 靜態初始化雖然沒有指定數組的?度,編譯器在編譯時會根據{}中元素個數來確定數組的?度。
  • 靜態初始化時,{}中數據類型必須與[]前數據類型?致。
  • 靜態初始化可以簡寫,省去后?的new T[]。

**
靜態和動態初始化也可以分為兩步,但是省略格式不可以。
示例代碼如下:**

public class array {public static void main(String[] args) {int[] array1;array1=new int[4];int[] array2;array2=new int[]{1,2,3};//下面方式不可行int[] array3;array3={1,2,3};}
}

在這里插入圖片描述
如果沒有對數組進?初始化,數組中元素有其默認值:
在這里插入圖片描述
如果數組中存儲元素類型為引?類型,默認值為null
在這里插入圖片描述

1.2 數組的基本使用

通過代碼來演示數組的使用:

public class array {public static void main(String[] args) {String[] array1=new String[]{"hhh","aaa","zzz"};array1[2]="dzj";for (String str: array1) {System.out.println(str);}}
}

遍歷數組:

public class array {public static void main(String[] args) {String[] array1=new String[]{"hhh","aaa","zzz"};array1[2]="dzj";//遍歷方式一for (String str: array1) {System.out.println(str);}//遍歷方式二for (int i = 0; i < array1.length; i++) {System.out.println(array1[i]);}}
}

二、數組是引用類型

2.1 初始JVM的內存分布


JVM也對所使用的內存按照功能的不同進行了劃分
在這里插入圖片描述

JVM內存劃分(按功能分區)

  1. 程序計數器(PC Register)

    • 占用極小的內存空間
    • 核心功能:保存下一條要執行的指令地址
    • 線程私有,每個線程獨立存儲
  2. 虛擬機棧(JVM Stack)

    • 存儲方法調用相關的運行時數據
    • 方法執行機制:
      ? 每個方法執行時創建對應的棧幀
      ? 棧幀包含五部分:
      • 局部變量表(方法參數和局部變量)
      • 操作數棧(執行引擎的工作區)
      • 動態鏈接(指向運行時常量池的方法引用)
      • 返回地址(方法結束后的返回位置)
      • 附加信息(如調試數據)
    • 生命周期:
      ? 方法開始執行 → 棧幀入棧
      ? 方法執行結束 → 棧幀出棧銷毀
  3. 本地方法棧(Native Method Stack)

    • Native方法(本地方法) 提供服務
    • 功能與虛擬機棧類似
    • 特殊說明:在HotSpot等JVM實現中與虛擬機棧合并
  4. 堆(Heap)

    • JVM管理的最主要內存區域(占比最大)
    • 存儲特性:
      ? 所有new創建的對象都在堆上分配(包括數組對象)
      new int[]{1, 2, 3} // 堆內存分配
      
      ? 對象存儲要求:
      • 被引用對象不會被銷毀
      • 未被引用對象由GC回收
    • 生命周期管理:
      ? JVM啟動時創建
      ? 程序運行期間動態調整大小
      ? JVM退出時銷毀
  5. 方法區(Method Area)

    • 核心存儲內容:
      ? 已被加載的類元數據(類名/字段/方法/父類/接口等)
      ? 運行時常量池(字符串常量等)
      ? 靜態變量(static修飾的類變量)
      ? 即時編譯器編譯后的代碼(JIT優化產物)
    • 特殊說明:字節碼指令(編譯后的方法代碼)存儲在此區域

2.2 基本類型變量與引用類型變量的區別

基本數據類型創建的變量,稱為基本變量,該變量空間中直接存放的是其所對應的值;
?引?數據類型創建的變量,?般稱為對象的引?,其空間中存儲的是對象所在空間的地址。

在這里插入圖片描述

在這里插入圖片描述

注意:java中是不能獲取到變量的地址的,也就是說java中并沒有指針的概念

2.3 再談引用變量

public class array {public static void main(String[] args) {int[] array2 = new int[]{1,2,3,4};int[] array1=array2;array1[0]=100;array1[1]=200;array1[2]=300;array1[3]=400;for (int i = 0; i < array2.length; i++) {System.out.println(array2[i]);}}
}

注意:這里的array1=array2是地址賦值,所以改變array1中的數組值所以array2中的內容也會發生改變,兩個引用變量此時指向了同一塊內存空間

2.4 認識null

null 在Java中表?"空引?",也就是?個不指向對象的引用

int[] arr = null;System.out.println(arr[0]);// 執?結果Exception in thread "main" java.lang.NullPointerExceptionat Test.main(Test.java:6)

在這里插入圖片描述
null 的作?類似于C語?中的NULL(空指針),都是表??個無效的內存位置.因此不能對這個內存進?任何讀寫操作.?旦嘗試讀寫,就會拋出NullPointerException.

JAVA中并沒有規定null是零地址

三、數組作為函數的參數和返回值

參數傳數組類型(引用數據類型)

public class array {public static void main(String[] args) {int[] arr={1,2,3,4,5,6};fix(arr);for (int x:arr) {System.out.println(x);}}public static void fix(int[] arr){for (int i = 0; i < arr.length; i++) {arr[i]=i*100;}}
}

總結:所謂的"引用"本質上只是存了?個地址.Java將數組設定成引用類型,這樣的話后續進行數組參數傳參,其實只是將數組的地址傳入到函數形參中.這樣可以避免對整個數組的拷貝(數組可能?較長,那么拷貝開銷就會很大).

數組作為函數的返回值
比如:獲取斐波那契數列的前N項

public class array {public static void main(String[] args) {int[] array=fib(20);assert array != null;for (int x:array) {System.out.println(x);}}public static int[] fib(int n){if(n<=0){return null;}int[] array=new int[n];array[0]=array[1]=1;for (int i = 2; i <array.length ; i++) {array[i]=array[i-1]+array[i-2];}return array;}
}

在這里插入圖片描述

四、數組的應用場景

4.1 數組轉字符串

import java.util.Arrays;
import java.util.Scanner;public class array {public static void main(String[] args) {int[] array={1,2,3,4,5,6};String ret=Arrays.toString(array);System.out.println(ret);}public static void main1(String[] args) {Scanner scanner=new Scanner(System.in);int[] array = {2,6,4,1};System.out.println(sequence(array));}public static boolean sequence(int[] array) {boolean flag = true;int count=0;for (int i = 0; i <array.length-3 ; i++) {if(array[i]%2!=0){count++;if(count==3){return true;}}else{count=0;}}return false;}
}

在這里插入圖片描述

4.2 數組的拷貝

    public static void main(String[] args) {int[] array={1,2,3,4,5,6};int[] array1=Arrays.copyOf(array,array.length);//擴容操作int[] array2=Arrays.copyOf(array,array.length*2);int[] array3=Arrays.copyOfRange(array,2,5);String ret1=Arrays.toString(array1);System.out.println(ret1);String ret2=Arrays.toString(array2);System.out.println(ret2);String ret3=Arrays.toString(array3);System.out.println(ret3);}

在這里插入圖片描述

注意:數組當中存儲的是基本類型數據時,不論怎么拷?基本都不會出現什么問題,但如果存儲的是引?數據類型,拷?時需要考慮深淺拷?的問題,

源碼部分展示:
在這里插入圖片描述

4.3 深拷貝和淺拷貝問題

深拷貝和淺拷貝通常只出現在引用數據類型的范疇之上,基本數據類型不存在深拷貝和淺拷貝問題!!

當拷貝內容為引用數據類型的時候,淺拷貝指的是拷貝數組的內容僅僅是拷貝變量的值,而沒有存儲對象本身所存儲的內容,而深拷貝恰恰相反。
在這里插入圖片描述

圖片左邊是淺拷貝,右邊是深拷貝

4.3 冒泡排序的小優化

    public static void main(String[] args) {int[] array={4,6,3,2,1,7,8,11,23,22,42,21};bubbleSort(array);for (int x: array) {System.out.print(x+" ");}}public static void bubbleSort(int[] array){for(int i=0;i<array.length-1;i++){boolean flg=false;for (int j = 0; j < array.length-1-i; j++) {if(array[j]>array[j+1]){int tmp=array[j];array[j]=array[j+1];array[j+1]=tmp;flg=true;}}if(!flg){return;}}}

在這里插入圖片描述

冒泡排序本身時間復雜度比較高,使用java內置的sort函數即可:

public static void main(String[] args) {int[] array={4,6,3,2,1,7,8,11,23,22,42,21};Arrays.sort(array);for (int x: array) {System.out.print(x+" ");}}

在這里插入圖片描述

4.4 數組逆序

    public static void main(String[] args) {int[] array={1,2,3,4,5,6};reverse(array);for (int x: array) {System.out.print(x+" ");}}public static void reverse(int[] array){int left=0;int right=array.length-1;while(left<right){int tmp=array[left];array[left]=array[right];array[right]=tmp;left++;right--;}}

在這里插入圖片描述

4.5 數組逆序

調整數組順序使得奇數位于偶數之前。調整之后,不關心大小順序。
如數組:[1,2,3,4,5,6]
調整后可能是:[1, 5, 3, 4, 2, 6]

public static void main(String[] args) {int[] array={1,2,3,4,5,6};change(array);for (int x: array) {System.out.print(x+" ");}}public static void change(int[] array){int left=0;int right=array.length-1;while(left<right){while(left<right&&array[left]%2!=0){left++;}while(left<right&&array[right]%2==0){right--;}int tmp=array[left];array[left]=array[right];array[right]=tmp;}}

4.6 數組練習

在這里插入圖片描述
異或的特點是:

1、n ^ n = 0;即兩個相同的數字異或是0

2、0 ^ n = n;即0和任何數字進行異或,結果就是那個任何數字。

public static void main(String[] args) {int[] array={4,1,2,1,2};int num=getNum(array);System.out.println(num);}public static int getNum(int[] array){int ret=0;for (int i = 0; i < array.length; i++) {ret^=array[i];}return ret;}public static void main6(String[] args) {int[] array={1,2,3,4,5,6};change(array);for (int x: array) {System.out.print(x+" ");}}

在這里插入圖片描述

五、二維數組

5.1 普通二維數組

基本語法:

數據類型[][] 數組名稱 = new 數據類型 [?數][列數]{ 初始化數據 };

注意:二維數組行不可以省略,但是列可以省略

public static void main(String[] args) {int[][] array = new int[3][];}

代碼示例:

public static void main(String[] args) {int[][] array = {{1,2,3},{4,5,6},{7,8,9}};for (int i = 0; i < array.length; i++) {for (int j = 0; j < array[i].length; j++) {System.out.print(array[i][j]+" ");}System.out.println();}}

在這里插入圖片描述

5.2 不規則的二維數組

不規則的?維數組指的是,?維數組的列在定義的時候,沒有確定。

int[][] array = new int[3][];
public static void main(String[] args) {int[][] array = new int[2][];array[0]=new int[3];array[1]=new int[5];for (int i = 0; i < array.length; i++) {for (int j = 0; j < array[i].length; j++) {System.out.print(array[i][j]+" ");}System.out.println();}}

在這里插入圖片描述
在這里插入圖片描述

總結

作為Java編程的??基礎支柱??,數組的價值遠超出其簡單的語法形式。它不僅提供了數據的高效組織方式,更通過多維數組支持復雜數據建模,借助Arrays工具類實現強大操作能力。盡管集合框架在現代開發中日益普及,但在性能敏感的底層系統、算法實現以及內存優化場景中,數組仍展現著不可替代的優勢。真正掌握數組的內存機制、遍歷技巧與異常處理,將使您的代碼在嚴謹性和效率上實現質的飛躍——這正是構建健壯程序的關鍵一步。

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

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

相關文章

Python圖像處理與計算機視覺:OpenCV實戰指南

引言 在當今數字化時代&#xff0c;圖像處理和計算機視覺技術已經滲透到我們生活的方方面面&#xff0c;從智能手機的人臉識別解鎖&#xff0c;到自動駕駛汽車的路況感知&#xff0c;再到醫療影像輔助診斷系統。作為這一領域最流行的開源庫之一&#xff0c;OpenCV (Open Sourc…

OCCT基礎類庫介紹:Modeling Algorithm - Features

Features 特征 This library contained in BRepFeat package is necessary for creation and manipulation of form and mechanical features that go beyond the classical boundary representation of shapes. In that sense, BRepFeat is an extension of BRepBuilderAPI …

【前端AI實踐】DeepSeek:開源大模型的使用讓開發過程不再抓頭發

有時候你可能正對著屏幕發呆&#xff0c;不知道怎么下手一個 Vue 的流式請求功能。這時候&#xff0c;DeepSeek 就像是你的“編程外掛”&#xff0c;幫你把模糊的需求變成清晰的代碼。 下面我們就以幾個常見的開發場景為例&#xff0c;看看 DeepSeek 能幫我們做點啥。 解答技…

SAP S/4HANA 的“Smart Core”:在現實與理想之間實現敏捷擴展

摘要&#xff1a; 在 SAP S/4HANA 的實施過程中&#xff0c;“Clean Core”&#xff08;干凈核心&#xff09;已成為熱門話題&#xff0c;指的是通過簡化和優化系統架構&#xff0c;減少技術債務、提升性能并增強可升級性。盡管這是 SAP 推動云轉型的核心理念之一&#xff0c;…

Python 量化金融與算法交易實戰指南

https://www.python.org/static/community_logos/python-logo-master-v3-TM.png 金融數據獲取與處理 使用yfinance獲取市場數據 python 復制 下載 import yfinance as yf import pandas as pd# 下載蘋果公司股票數據 aapl yf.Ticker("AAPL") hist aapl.histo…

【StarRocks系列】join查詢優化

目錄 Join 類型 和 Join 策略 1. Join 類型&#xff08;Join Type&#xff09; 2. Join 策略&#xff08;Join Strategy&#xff09; 分布式 Join 策略 (核心) 1. Colocate Join (本地 Join - 最優): 2. Bucket Shuffle Join: 3. Broadcast Join (復制廣播): 4. Shuffl…

【論文解讀】ZeroSearch: 零API成本激活大模型Web搜索

1st author: Hao Sun 孫浩 - PhD Candidate Peking University - Homepage paper: [2505.04588] ZeroSearch: Incentivize the Search Capability of LLMs without Searching code: Alibaba-NLP/ZeroSearch: ZeroSearch: Incentivize the Search Capability of LLMs without…

JAVA網絡編程中HTTP客戶端(HttpURLConnection、Apache HttpClient)

HTTP 客戶端是 Java 中實現網絡請求的核心工具,主要用于與 Web 服務器交互(如獲取網頁、提交表單、調用 REST API 等)。Java 生態中有兩種主流的 HTTP 客戶端實現:??HttpURLConnection(JDK 原生)?? 和 ??Apache HttpClient(第三方庫)??。以下是兩者的詳細解析、…

C# Process.Start多個參數傳遞及各個參數之間的空格處理

最近做一個軟件集成的事情&#xff0c;有多個之前做的軟件&#xff0c;集成到一起自己用&#xff0c;使用了 Process.Start&#xff08;“*.exe”&#xff09;的方式&#xff0c;然而遇到了傳遞參數的問題。 這里匯總后的程序叫main.exe&#xff0c;要匯總的軟件之一是pro1.…

【Python】Excel表格操作:ISBN轉條形碼

一、效果 原始文件&#xff1a; 輸出文件&#xff1a; 二、代碼 import os import logging from openpyxl import load_workbook from openpyxl.drawing.image import Image as ExcelImage from barcode import EAN13 from barcode.writer import ImageWriterlogging.basicCo…

【Fargo】mediasoup發送2:碼率分配、傳輸基類設計及WebRtcTransport原理

Fargo 使用了mediasoup的代碼,搬運了他的架構架構精妙,但是似乎是為了sfu而生,【Fargo】mediasoup發送1:控制與數據分離的分層設計和原理我本地用來發送測試,因此需要進一步梳理: 通過分析這段代碼,我來詳細解釋: 一、sfu 需要碼率級別的分配控制 1. DistributeAvail…

矩陣置零C++

給定一個 m x n 的矩陣&#xff0c;如果一個元素為 0 &#xff0c;則將其所在行和列的所有元素都設為 0 。請使用 原地 算法。 思路&#xff1a; 1、讓首行首列記錄哪一行哪一列有0 2、于是可以直接遍歷非首行首列的元素&#xff0c;若該元素對應的首行首列為0&#xff0c;說明…

大內存對電腦性能有哪些提升

在科技飛速發展的今天&#xff0c;電腦已經成為我們生活和工作中不可或缺的伙伴。無論是日常辦公、追劇娛樂&#xff0c;還是進行復雜的游戲和專業設計&#xff0c;電腦的性能都至關重要。而在影響電腦性能的眾多因素中&#xff0c;內存大小常常被人們忽視。 多任務處理更流暢…

【StarRocks系列】Update語句

目錄 簡要流程 詳細流程 1. UPDATE 語句執行流程 2. 如何更新表的數據 3. 是否支持事務 總結關鍵點 簡要流程 前端處理&#xff08;FE&#xff09;&#xff1a; 解析 SQL 并驗證主鍵條件生成包含主鍵列表和新值的更新計劃按主鍵哈希分發到對應 BE 后端執行&#xff08…

計算機三級Linux應用與開發

第 1 章 計算機體系結構與操作系統 1.1 計算科學與計算機系統 馮諾依曼體系的結構要點&#xff1a; 計算機數制采用二進制&#xff0c;程序指令和數據統一存儲&#xff0c;計算機應按照程序順序執行。按照馮諾依曼結構設計的計算機由 控制器&#xff0c;運算器&#xff0c;存…

Web攻防-XSS跨站Cookie盜取數據包提交網絡釣魚BEEF項目XSS平臺危害利用

知識點&#xff1a; 1、Web攻防-XSS跨站-手工代碼&框架工具&在線平臺 2、Web攻防-XSS跨站-Cookie盜取&數據提交&網絡釣魚 演示案例-WEB攻防-XSS跨站-Cookie盜取&數據提交&網絡釣魚&Beef工具 1、XSS跨站-攻擊利用-憑據盜取 條件&#xff1a;無防…

自力更生式養老VS三大新型養老:在時代裂變中重構銀發生存法則

在歲月長河中&#xff0c;父母曾為子女遮風擋雨&#xff0c;當他們步入暮年&#xff0c;養老問題成為家庭與社會共同關注的焦點。 “父母的養老終究是自力更生”&#xff0c;這句話道出了養老的本質內核。 然而&#xff0c;在自力更生的基礎上&#xff0c;選擇合適的養老方式…

計算機網絡學習筆記:Wireshark觀察TCP通信

文章目錄 前言一、前置準備二、三報文握手過程抓包2.1、第一次握手2.2、第二次握手2.3、第三次握手 三、通信過程抓包3.1、報文 44379 – 客戶端發數據&#xff08;PSH, ACK&#xff09;3.2、 報文 44380 – 服務端確認收到數據&#xff08;ACK&#xff09;3.3、報文 44469 – …

在Linux中,Iptables能做什么?

概述 背景說明 在運維工作中&#xff0c;Iptables是一個不可或缺的工具&#xff0c;它提供了強大的網絡流量控制和管理能力。 問題呈現 iptables是一個不可獲取的工具&#xff0c;你對其了解多少&#xff1f;該工具你是否真的會用&#xff1f;詳細功能對應的應用場景你是否…

Linux——linux的基本命令

目錄 一、linux的目錄結構 二、絕對路徑和相對路徑 三、文件類型&#xff08;linux下所有東西都可看作文件&#xff09; 四、文件的權限 五、文件權限的修改&#xff08;chmod&#xff09; 六、linux常用的命令 七、文件查看命令 八、文件編輯命令 九、文件壓縮與解壓…