Java數組補充v2

一、數組基本概念

1. 什么是數組

數組是Java中用來存儲同類型數據固定大小連續內存空間的數據結構。

2. 數組特點

固定長度:一旦創建,長度不可改變

相同類型:所有元素必須是同一數據類型

索引訪問:通過下標(從0開始)訪問元素

內存連續:元素在內存中是連續存儲的

二、數組聲明與初始化

1. 數組聲明

// 方式1:數據類型[] 數組名;
int[] arr1;// 方式2:數據類型 數組名[];
int arr2[];

推薦使用第一種方式,更符合Java規范

2. 數組初始化

(1) 靜態初始化

java

  • int arrB[] = {1,2,3,4,5}

    • 這是?靜態初始化的簡化形式,只能在?聲明數組變量時?直接使用。

    • 編譯器會自動推導數組類型和長度。

    • 示例:

      java

      int arrB[] = {1, 2, 3, 4, 5}; // 正確
  • arrA = new int[]{1,2,3,4}

    • 這是?靜態初始化的完整形式,可以在?聲明時或后續賦值時?使用。

    • 需要顯式指定數組類型?new int[],但長度由元素個數決定。

    • 示例:

      java

      int[] arrA;
      arrA = new int[]{1, 2, 3, 4}; // 正確(先聲明后賦值)

使用場景不同

場景int[] arr = {1,2,3}arr = new int[]{1,2,3}
聲明時直接初始化? 可用? 可用
先聲明后賦值? 不可用? 可用
方法返回值? 不可用? 可用
匿名數組傳參? 不可用? 可用

示例對比:

java

// 1. 聲明時初始化(兩種方式均可)
int[] arr1 = {1, 2, 3};          // 簡化形式
int[] arr2 = new int[]{1, 2, 3}; // 完整形式// 2. 先聲明后賦值(只能用完整形式)
int[] arr3;
arr3 = new int[]{1, 2, 3}; // 正確
// arr3 = {1, 2, 3};       // 錯誤!簡化形式不能用于后續賦值// 3. 作為方法返回值(只能用完整形式)
public int[] getArray() {return new int[]{1, 2, 3}; // 正確// return {1, 2, 3};       // 錯誤!
}// 4. 匿名數組傳參(只能用完整形式)
someMethod(new int[]{1, 2, 3}); // 正確
// someMethod({1, 2, 3});       // 錯誤!

3. 底層實現相同

  • 兩種方式最終生成的字節碼完全一致,性能無差別。

  • 內存分配方式相同:都在堆內存中創建連續存儲的數組對象。


4. 風格建議

  1. 推薦使用?int[] arr?聲明風格(而非?int arr[]),更符合 Java 規范。

  2. 如果只是?聲明時初始化,優先使用簡化形式?{1,2,3},代碼更簡潔。

  3. 如果需要?重新賦值或匿名使用,必須用完整形式?new int[]{1,2,3}

特性{1,2,3}new int[]{1,2,3}
語法名稱簡化靜態初始化完整靜態初始化
是否依賴聲明語句必須與聲明寫在一起可獨立使用
靈活性
推薦使用場景聲明時直接初始化重新賦值、方法返回、匿名傳參

(2) 動態初始化

java

// 指定長度但不指定元素值
int[] arr = new int[5]; // 默認值為0
String[] strs = new String[3]; // 默認值為null

賦值即逐個元素 循環 arraycopy scanner輸入賦值都可以

三、數組基本操作

1. 訪問數組元素

int[] arr = {10, 20, 30, 40, 50};// 獲取元素
int num = arr[2]; // 獲取第3個元素(30)// 修改元素
arr[3] = 100; // 將第4個元素改為100

2. 獲取數組長度

int length = arr.length; // 注意不是length()

3. 遍歷數組?

這里補充循環一定要放在方法中,不能直接在類體內

(1) 普通for循環
for(int i = 0; i < arr.length; i++) {System.out.println(arr[i]);
}
(2) 增強for循環
for(int num : arr) {System.out.println(num);
}

小練習:

//for each 增強for循環
//只是改變了item,沒有改變數組也不可以改變,只能做到使用里面的數
//int a=arrB[0]; a=12;
arrB=new int[]{1,2,3,4};
for(int item:arrB){item=(int)(Math.random()*100);
}
System.out.println(Arrays.toString(arrB));//數組隨機賦值,然后找出數組最大值
arrB=new int[7];
for(int i=0;i<arrB.length;i++){arrB[i]=(int)(Math.random()*100);
}
System.out.println(Arrays.toString(arrB));
int max=arrB[0];
for(int item:arrB){if(item>max){max=item;}
}
System.out.println("數組最大值是:"+max);// 數組求和
arrB=new int[7];
for(int i=0;i<arrB.length;i++){arrB[i]=(int)(Math.random()*100);
}
System.out.println(Arrays.toString(arrB));
int sum=0;
for(int item:arrB){sum+=item;
}
System.out.println(sum);//有10個裁判評分,滿分為10分,使用隨機數模擬,存入數組中
//從中去掉最大分數和最小分數,剩下分數的平均數就是選手得分
//打印出選手得分
//Math.random();//[0,1) *10 0-0.9.9999.. (int)一刀切只能取到9 應該*11
arrB=new int[10];
for(int i=0;i<arrB.length;i++){arrB[i]=(int)(Math.random()*11);
}
System.out.println(Arrays.toString(arrB));
max=arrB[0];
int min=arrB[0];
sum=0;
for(int item:arrB){if(item>max){max=item;}if(item<min){min=item;}sum+=item;
}int score=(sum-max-min)/8;
System.out.println(score);
(3) 使用Arrays.toString()
System.out.println(Arrays.toString(arr));

四、多維數組

1. 二維數組聲明與初始化

// 靜態初始化
int[][] arr1 = {{1, 2}, {3, 4}, {5, 6}};// 動態初始化
int[][] arr2 = new int[3][2]; // 3行2列

2. 二維數組遍歷

for(int i = 0; i < arr.length; i++) {for(int j = 0; j < arr[i].length; j++) {System.out.print(arr[i][j] + " ");}System.out.println();
}

五、數組常用工具類Arrays

1. 排序

int[] arr = {3, 1, 4, 2, 5};
Arrays.sort(arr); // 升序排序

補充:

1.1 冒泡排序

2. 二分查找

int index = Arrays.binarySearch(arr, 4); // 必須是先排序好的才能用二分

3. 數組比較

boolean isEqual = Arrays.equals(arr1, arr2);

4. 數組填充

Arrays.fill(arr, 0); // 全部填充為0

5. 數組復制

int[] newArr = Arrays.copyOf(arr, arr.length);

6.數組擴容

拷貝數組arraycopy? ?五個參數
源數組 ?源數組的起始位置(開始復制的位置) ? 目標數組 ? 目標數組的起始位置(從哪個位置開始粘貼) ? 拷貝的長度

//數組擴容 聲明一個更大的數組代替舊的數組
int[] arrA=new int[10];
arrA[0]=99;arrA[9]=999;
int[] arrTemp=new int[arrA.length<<1];
System.arraycopy(arrA,0,arrTemp,0,arrA.length);
//原數組 原數組起始位置(從哪個位置開始粘貼) 目標數組 目標數組起始位置 拷貝的長度
arrA=arrTemp;
System.out.println(Arrays.toString(arrA));

六、數組常見問題

1. 數組越界異常

java

int[] arr = new int[3];
System.out.println(arr[3]); // ArrayIndexOutOfBoundsException

2. 空指針異常

java

int[] arr = null;
System.out.println(arr[0]); // NullPointerException

3. 數組長度不可變

java

int[] arr = new int[5];
// arr.length = 10; // 錯誤!數組長度不可變

七、數組與內存

1. 內存分配

  • 數組變量存儲在棧內存

  • 數組元素存儲在堆內存

2. 內存示意圖

text

棧內存        堆內存
arr   ---->  [0][0][0][0][0]

八、數組應用場景

  1. 存儲大量同類型數據

  2. 實現數據結構(如棧、隊列)

  3. 矩陣運算

  4. 排序和搜索算法實現

九、數組與集合的區別

特性數組集合(ArrayList等)
長度固定動態可變
類型單一可泛型指定
性能略低
功能基礎豐富的方法

十、Java 8+ 數組新特性

1. 并行排序

Arrays.parallelSort(arr);

2. Stream操作

Arrays.stream(arr).filter(n -> n > 2).forEach(System.out::println);

3. 集合轉數組

List<String> list = Arrays.asList("A", "B", "C");
String[] arr = list.toArray(new String[0]);

十一、補:無限循環與死循環的區別:

//死循環 無限循環
//while(true){} 沒有結束條件 死循環
i=-1;
for(;i<0;i--){}//有結束條件,邏輯上條件永遠達不到,無限循環

1. 無限循環(Infinite Loop)

定義:
  • 有意創建的設計上需要永不停止的循環結構

  • 通常有特定的業務用途,是程序邏輯的一部分

特點:

? 是有意設計的循環結構
? 通常包含循環控制機制(如?break?條件)
? 服務于特定業務邏輯(如服務器監聽、游戲主循環)

典型應用場景:

java

// 服務器主線程循環
while(true) {Socket client = serverSocket.accept(); // 等待客戶端連接new Thread(new ClientHandler(client)).start();
}// 游戲主循環
while(running) {  // running是可控的布爾變量updateGame();renderFrame();
}

2. 死循環(Dead Loop)

定義:
  • 意外產生的本應終止卻無法停止的循環

  • 屬于程序缺陷(bug),會導致程序卡死或資源耗盡

特點:

? 是無意產生的程序錯誤
??缺少正確的終止條件
? 會導致程序異常或系統資源耗盡

常見錯誤示例:

java

// 錯誤1:忘記更新循環變量
int i = 0;
while(i < 10) {  // i永遠不會改變System.out.println("Stuck...");
}// 錯誤2:錯誤的終止條件
for(int j=1; j!=10; j+=2) { // 當j=9時,j+2=11,永遠不等于10System.out.println(j);
}

關鍵對比表

特征無限循環死循環
設計意圖有意設計意外產生
是否可控有控制機制(可退出)無法控制
業務價值實現特定功能純屬程序缺陷
典型結構while(true)?+ 內部break缺少變量更新/錯誤條件
是否應避免按需使用必須修復

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

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

相關文章

【PTA數據結構 | C語言版】前綴樹的3個操作

本專欄持續輸出數據結構題目集&#xff0c;歡迎訂閱。 文章目錄題目代碼題目 請編寫程序&#xff0c;利用前綴樹查找給定字符串是否在某給定字符串集合 S 中。 輸入格式&#xff1a; 輸入首先給出一個正整數 n&#xff08;≤1000&#xff09;&#xff0c;隨后 n 行&#xff0…

JAVA面試寶典 -《緩存架構:穿透 / 雪崩 / 擊穿解決方案》

&#x1f4a5;《緩存架構&#xff1a;穿透 / 雪崩 / 擊穿解決方案》 文章目錄&#x1f4a5;《緩存架構&#xff1a;穿透 / 雪崩 / 擊穿解決方案》&#x1f9ed; 一、開篇導語&#xff1a;為什么緩存是高并發系統的命脈&#xff1f;?1.1 緩存的核心價值緩存帶來的收益??&…

FPGA創意項目網頁或博客推薦

1. 綜合項目平臺(開源+教程) ① Hackster.io - FPGA專區 ?? https://www.hackster.io/fpga 特點: 大量基于FPGA的創意項目(如Zynq游戲機、視覺處理、機器人控制)。 提供完整教程(Vivado工程文件+代碼)。 推薦項目: FPGA-Based Oscilloscope(低成本示波器) V…

Go 程序無法使用 /etc/resolv.conf 的 DNS 配置排查記錄

在最近的一次部署中&#xff0c;我遇到一個奇怪的問題&#xff1a;Go 程序在運行時不使用 /etc/resolv.conf 中的 DNS 設置&#xff0c;導致服務無法正常訪問域名。這篇文章記錄下完整的排查過程和最終的解決方案。1. 問題現象我有一個部署在 KVM 虛擬機內的 Go 應用&#xff0…

微服務相關問題(2)

1、Spring Cloud相關常用組件注冊中心&#xff08;nacos、Eureka等&#xff09;、負載均衡&#xff08;Ribbon、LoadBalancer&#xff09;、遠程調用&#xff08;feign&#xff09;、服務熔斷&#xff08;Sentinel、Hystrix&#xff09;、網關&#xff08;Gateway&#xff09;2…

安全初級2

一、作業要求 1、xss-labs 1~8關 2、python實現自動化sql布爾育注代碼優化(二分查找) 二、xss-labs 1~8關 1、準備 打開小皮面板&#xff0c;啟動MySQL和apacher 下載 xss-labs&#xff0c;并解壓后放到 phpstudy_pro 的 WWW 目錄下&#xff0c;重命名為 xss-labs 訪問鏈…

基礎算法題

基礎算法題 鏈表 1.1反轉鏈表 描述&#xff1a; 描述 給定一個單鏈表的頭結點pHead(該頭節點是有值的&#xff0c;比如在下圖&#xff0c;它的val是1)&#xff0c;長度為n&#xff0c;反轉該鏈表后&#xff0c;返回新鏈表的表頭。 數據范圍&#xff1a; 0≤&#xfffd;≤…

Android 15 源碼修改:為第三方應用提供截屏接口

概述 在 Android 系統開發中,有時需要為第三方應用提供系統級的截屏功能。本文將詳細介紹如何通過修改 Android 15 源碼中的 PhoneWindowManager 類,實現一個自定義廣播接口來觸發系統截屏功能。 修改方案 核心思路 通過在系統服務 PhoneWindowManager 中注冊自定義廣播監…

20250717 Ubuntu 掛載遠程 Windows 服務器上的硬盤

由 DeepSeek 生成&#xff0c;方法已經驗證可行。 通過網絡掛載Windows共享硬盤&#xff08;SMB/CIFS&#xff09; 確保網絡共享已啟用&#xff1a; 在Windows電腦上&#xff0c;右鍵點擊目標硬盤或文件夾 → 屬性 → 共享 → 啟用共享并設置權限&#xff08;至少賦予讀取權限&…

深度學習圖像增強方法(二)

三、直方圖均衡化 1. 普通直方圖均衡化 直方圖均衡化的原理是將圖像的灰度直方圖展平,使得每個灰度級都有更多的像素分布,從而增強圖像的對比度。具體步驟如下: 計算灰度直方圖:統計圖像中每個灰度級的像素數量。 計算累積分布函數(CDF):計算每個灰度級的累積概率。 映…

QT——信號與槽/自定義信號與槽

1 信號與槽基本介紹 提出疑問&#xff0c;界面上已經有按鍵了&#xff0c;怎么操作才能讓用戶按下按鍵后有操作上的反應呢&#xff1f; 在 Qt 中&#xff0c;信號和槽機制是一種非常強大的事件通信機制。這是一個重要的概念&#xff0c;特別是對于初學者來說&#xff0c;理解它…

Spring原理揭秘--Spring的AOP

在這之前我們已經介紹了AOP的基本功能和概念&#xff0c;那么當AOP集成到spring則會發生改變。Spring AOP 中的Joinpoint&#xff1a;之前提高了很多Joinpoint的類型&#xff0c;但是在spring中則只會有方法級別的Joinpoint&#xff0c;像構造方法&#xff0c;字段的調用都沒適…

C++學習筆記五

C繼承//基類 class Animal{};//派生類 class Dog : public Animal{};#include<iostearm> using namespace std;//基類 class Shape{public:void setwidth(int w){width w;}void setheight(int h){height h;}protected:int width;int height;}//派生類 class Rectangle …

AndroidStudio環境搭建

一、AndroidStudio下載 正常百度出來的站會自動翻譯成中文&#xff0c;導致歷史版本的界面總是顯示不出可下載的地方&#xff0c;點擊成切回英文&#xff0c;就能看出了。 歷史版本&#xff1a;https://developer.android.google.cn/studio/archive

Java大廠面試實錄:從Spring Boot到AI大模型的深度技術拷問

場景&#xff1a;互聯網大廠Java后端面試 面試官&#xff08;嚴肅&#xff09;&#xff1a;小曾&#xff0c;請坐。今天主要考察Java后端技術棧&#xff0c;包括微服務、大數據、AI等。我們先從簡單問題開始。 小曾&#xff08;搓手&#xff09;&#xff1a;好嘞&#xff01;面…

深入解析Hadoop中的HDFS架構設計

HDFS概述與核心設計原則作為Hadoop生態系統的基石&#xff0c;HDFS&#xff08;Hadoop Distributed File System&#xff09;是一種專為大規模數據處理而設計的分布式文件系統。它的核心設計理念源于對互聯網時代數據特征的深刻洞察——數據規模呈指數級增長&#xff0c;而硬件…

ota之.加密算法,mcu加密方式

一、ota之.加密算法&#xff0c;mcu加密方式 前面一篇文章&#xff0c;講了soc的加密方式&#xff0c;但是soc資源充足&#xff0c;mcu沒有&#xff0c;所以不會用openss生成公私鑰 切計算哈希用rsa256位。 ECC&#xff08;橢圓曲線加密&#xff09; 是一種非對稱加密算法&…

LangChain面試內容整理-知識點23:實戰案例:檢索增強生成(RAG)系統

檢索增強生成(Retrieval-Augmented Generation, RAG)是一種將LLM與外部知識庫結合的方法,通過實時檢索相關信息來輔助生成答案。這極大緩解了LLM“封閉知識”過期或不足的問題。LangChain非常適合構建RAG系統,因為它提供了文檔加載、向量存儲、檢索接口、LLM組合的一站式方…

探索阿里云ESA:開啟邊緣安全加速新時代

阿里云 ESA 是什么&#xff1f;阿里云 ESA&#xff0c;全稱邊緣安全加速&#xff08;Edge Security Acceleration&#xff09; &#xff0c;其前身為全站加速 DCDN&#xff08;Dynamic Content Delivery Network&#xff09;。在 2024 年 9 月 30 日&#xff0c;阿里云完成了這…

醋酸鈰:賦能科技創新的稀土之力

一、什么是醋酸鈰醋酸鈰是鈰元素與醋酸根離子形成的化合物。鈰作為稀土元素中的重要一員&#xff0c;廣泛應用于材料科學、催化劑、電子產品等領域。醋酸鈰以無色結晶或淺黃色結晶的形式存在&#xff0c;是鈰的有機鹽之一。它不僅具有穩定的化學性質&#xff0c;而且在某些特定…