Java數(shù)組拷貝的四種常用方式總結(jié)
引言
數(shù)組是 Java 最基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)之一,而 數(shù)組的拷貝(復(fù)制) 是開發(fā)中經(jīng)常遇到的需求,例如:
- 擴容數(shù)組
- 復(fù)制部分元素
- 深拷貝/防御性拷貝
- 避免直接引用修改原數(shù)組
Java 提供了多種數(shù)組復(fù)制方式,每種方式都有自己的特點和適用場景。
本篇文章將系統(tǒng)總結(jié) Java 中 數(shù)組拷貝的 4 種常用方式。
一、Java 數(shù)組拷貝的四種方式
1. 使用for循環(huán)(最原始、最靈活)
示例代碼:
int[] src = {1, 2, 3, 4};
int[] dest = new int[src.length];
for (int i = 0; i < src.length; i++) {
dest[i] = src[i];
}
優(yōu)點:
- 簡單直接
- 可自定義拷貝規(guī)則(如過濾、條件拷貝)
缺點:
- 代碼冗長
- 性能較低(相比原生 API)
適用于 需要完全自定義拷貝行為的場景。
2. 使用System.arraycopy()(性能最優(yōu))
示例代碼:
int[] src = {1, 2, 3, 4};
int[] dest = new int[4];
System.arraycopy(src, 0, dest, 0, src.length);
參數(shù)解釋:
System.arraycopy(
Object src, // 源數(shù)組
int srcPos, // 源數(shù)組起始下標(biāo)
Object dest, // 目標(biāo)數(shù)組
int destPos, // 目標(biāo)數(shù)組起始下標(biāo)
int length // 拷貝長度
);
優(yōu)點:
- 底層為 JVM 實現(xiàn)(native native 方法),性能最高
- 可指定部分區(qū)域拷貝
缺點:
- 參數(shù)較多,容易出錯
- 類型必須兼容(否則拋異常)
最推薦用于 高性能場景。
3. 使用Arrays.copyOf()/Arrays.copyOfRange()(最常用)
3.1Arrays.copyOf()
適合復(fù)制整個數(shù)組或擴容數(shù)組。
int[] src = {1, 2, 3};
int[] dest = Arrays.copyOf(src, 5); // 擴容成長度 5
輸出:
[1, 2, 3, 0, 0]
3.2Arrays.copyOfRange()
適合復(fù)制部分區(qū)域。
int[] src = {1, 2, 3, 4, 5};
int[] part = Arrays.copyOfRange(src, 1, 4);
輸出:
[2, 3, 4]
優(yōu)點:
- 使用簡單,參數(shù)不多
- 可以返回不同長度的新數(shù)組
- 返回泛型,支持所有類型
缺點:
- 性能略遜于 System.arraycopy(內(nèi)部也是基于它實現(xiàn))
最常用于 普通開發(fā)、快速復(fù)制、數(shù)組擴容。
4. 使用clone()(最簡潔的深拷貝)
示例代碼:
int[] src = {1, 2, 3};
int[] dest = src.clone();
優(yōu)點:
- 語法最簡單
- 創(chuàng)建的是獨立數(shù)組,不會影響原數(shù)組
- 性能很好,底層仍然是
System.arraycopy
缺點:
- 只適用于一維數(shù)組
- 對于二維數(shù)組只復(fù)制外層,是淺拷貝:
int[][] arr2d = {{1,2}, {3,4}};
int[][] clone = arr2d.clone();
clone[0][0] = 99;
System.out.println(arr2d[0][0]); // 99(淺拷貝)
適用于 簡單復(fù)制整個數(shù)組的場景。
二、四種數(shù)組復(fù)制方式對比總結(jié)
| 方法 | 是否新數(shù)組 | 是否支持部分復(fù)制 | 性能 | 是否淺拷貝 | 適用場景 |
|---|---|---|---|---|---|
for循環(huán) | ? | ?(自定義) | ?☆☆ | 深拷貝 | 自定義規(guī)則 |
System.arraycopy | ? | ? | ??? | 淺拷貝 | 高性能需求 |
Arrays.copyOf | ? | ?(復(fù)制整個) | ??? | 淺拷貝 | 擴容 / 常規(guī)復(fù)制 |
Arrays.copyOfRange | ? | ? | ??? | 淺拷貝 | 區(qū)間復(fù)制 |
clone() | ? | ? | ??? | 淺拷貝 | 快速整體復(fù)制 |
一句話總結(jié):
普通場景用 Arrays.copyOf
高性能場景用 System.arraycopy
語法最簡單用 clone()
自定義邏輯用 for 循環(huán)
到此這篇關(guān)于Java數(shù)組拷貝的四種常用方式總結(jié)的文章就介紹到這了,更多相關(guān)Java數(shù)組拷貝方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java刷題之最小k個數(shù)的思路及具體實現(xiàn)
這篇文章主要介紹了Java刷題之最小k個數(shù)的思路及具體實現(xiàn),最小K個數(shù)是一個經(jīng)典的top-K問題,可以通過整體排序、建立小根堆或大根堆的方式解決,排序方式時間復(fù)雜度較高,適合數(shù)據(jù)量小的場景,小根堆適合k較小的情況,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-10-10
不使用他人jar包情況下優(yōu)雅的進(jìn)行dubbo調(diào)用詳解
這篇文章主要為大家介紹了不使用他人jar包情況下優(yōu)雅的進(jìn)行dubbo調(diào)用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
啟動springboot應(yīng)用因未配置數(shù)據(jù)庫報錯的解決方案
這篇文章主要介紹了啟動springboot應(yīng)用因未配置數(shù)據(jù)庫報錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
Java通過數(shù)據(jù)庫表生成實體類詳細(xì)過程
這篇文章主要介紹了Java通過數(shù)據(jù)庫表生成實體類,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-02-02
Spring?Boot集成JasperReport生成文檔的方法
由于工作需要,要實現(xiàn)后端根據(jù)模板動態(tài)填充數(shù)據(jù)生成PDF文檔,通過技術(shù)選型,使用Ireport5.6來設(shè)計模板,結(jié)合JasperReports5.6工具庫來調(diào)用渲染生成PDF文檔,這篇文章主要介紹了Spring?Boot集成JasperReport生成文檔,需要的朋友可以參考下2023-09-09
Java深入學(xué)習(xí)圖形用戶界面GUI之創(chuàng)建窗體
圖形編程中,窗口是一個重要的概念,窗口其實是一個矩形框,應(yīng)用程序可以使用其從而達(dá)到輸出結(jié)果和接受用戶輸入的效果,學(xué)習(xí)了GUI就讓我們用它來創(chuàng)建一個窗體2022-05-05
淺談springboot升級版本引發(fā)的災(zāi)難
本文詳細(xì)描述了升級spring-boot 1.x到2.x版本過程中遇到的多個問題,包括默認(rèn)值變更導(dǎo)致的JSON時間戳序列化問題和依賴沖突,下面就來詳細(xì)的介紹一下springboot升級版本會遇到的問題,感興趣的可以了解一下2026-02-02

