目錄
一.數(shù)組和列表的區(qū)別
1.數(shù)組(Array)
(1)數(shù)組(Array)
(2)數(shù)組的聲明與創(chuàng)建
(3)多維數(shù)組
(4)數(shù)組的優(yōu)缺點(diǎn)
2.列表(ArrayList)
(1)列表(ArrayList)
(2)列表的聲明與創(chuàng)建
(3)列表的優(yōu)缺點(diǎn)
3.數(shù)組(Array)與列表(ArrayList)的區(qū)別
(1)空間大小
(2)存儲(chǔ)內(nèi)容
(3)刪除方法
二.Arrays類常用方法
1.賦值
fill()
2.排序
sort()
3.查找
binarySearch()
4.比較
equals()
5.復(fù)制
copyOf()
copyOfRange()
java.util.Arrays類是一個(gè)操作數(shù)組的工具類,包含各種操作數(shù)組的方法,允許將數(shù)組視為列表
一.數(shù)組和列表的區(qū)別
1.數(shù)組(Array)
(1)數(shù)組(Array)
????????Java語言中提供的數(shù)組是用來存儲(chǔ)固定大小的同類型元素。
- 數(shù)組是數(shù)據(jù)結(jié)構(gòu)中的一種線性數(shù)據(jù)結(jié)構(gòu)。
- 數(shù)組可以說是一個(gè)容器或者是一個(gè)集合。
- 在數(shù)組中只能存儲(chǔ)同一類型的數(shù)據(jù),在定義數(shù)組的時(shí)候必須要指定數(shù)據(jù)類型。
- 如果數(shù)組中要添加不同的數(shù)據(jù)類型,只需把數(shù)組的類型定義為Object。
- 數(shù)組能存儲(chǔ)的元素個(gè)數(shù)是固定的,因?yàn)閿?shù)組在定義的時(shí)候必須要指定長度。
- Java中數(shù)組是類,它只有唯一一個(gè)屬性length(數(shù)組的長度)。
- length屬性的計(jì)算值是從1開始計(jì)算的,而數(shù)組的下標(biāo),是從0開始計(jì)算的。
(2)數(shù)組的聲明與創(chuàng)建
? ? ? ? 首先必須聲明數(shù)組變量,才能在程序中使用數(shù)組。
dataType[] arrayRefVar;? (首選)? ? ? ? 或? ? ???dataType?arrayRefVar[];?? ? ? ? ? ? ? ?
????????Java使用new操作符來創(chuàng)建數(shù)組。
arrayRefVar = new dataType[arraySize];?
? ? ? ? 我們也可以將聲明和創(chuàng)建用一條語句完成:
dataType[] arrayRefVar = new dataType[arraySize];
? ? ? ? ?我們也可以這樣來創(chuàng)建數(shù)組:
dataType[] arrayRefVar = {value0,value1,value2,value3,value4,value5};
(3)多維數(shù)組
????????Java 中沒有多維數(shù)組的概念,從數(shù)組底層的運(yùn)行機(jī)制上來看 Java 沒有多維數(shù)組,但是 Java 提供了支持多維數(shù)組的語法,可以實(shí)現(xiàn)多維數(shù)組的功能。
? ? ? ? Java 語言里的數(shù)組類型是引用類型,因此數(shù)組變量其實(shí)是一個(gè)引用,這個(gè)引用指向真實(shí)的數(shù)組內(nèi)存。數(shù)組元素的類型也可以是引用,如果數(shù)組元素的引用再次指向真實(shí)的數(shù)組內(nèi)存,這種情形看上去很像多維數(shù)組。
? ? ? ?所以, 多維數(shù)組可以看成是數(shù)組的數(shù)組,比如二維數(shù)組就是一個(gè)特殊的一維數(shù)組,其每一個(gè)元素都是一個(gè)一維數(shù)組。
多維數(shù)組的動(dòng)態(tài)初始化(以二維為例)
type[][] typeName = new type[typeLength1][typeLength2];? ?(首選)
type[] typeName[] = new type[typeLength1][typeLength2];?
type typeName[][] = new type[typeLength1][typeLength2];?
(typeLength1是行數(shù),typeLength2是列數(shù)?)
由于多維數(shù)組可以看成是數(shù)組的數(shù)組,我們同樣可以分別為每一維分配引用空間
String[][] str = new String;
str[0] = new String[2];? ? ? ? ? ?//該二維數(shù)組有2行
str[1] = new String[2];? ? ? ? ? ?//該二維數(shù)組有2列
多維數(shù)組的引用 (以二維為例)
對二維數(shù)組中的每個(gè)元素,引用方式為arrayName[index1][index2],index1為行索引,index2為列索引
str[1][0];? ? ? ? ? ?//第二行第一列
(4)數(shù)組的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):數(shù)組是所有數(shù)據(jù)結(jié)構(gòu)中存儲(chǔ)和獲取速度最快的一種。
缺點(diǎn):數(shù)組的長度是固定的,如果要?jiǎng)h除或添加數(shù)據(jù)會(huì)不方便,刪除的時(shí)候空間會(huì)浪費(fèi),添加的時(shí)候如果數(shù)據(jù)已經(jīng)加滿了,就無法添加新的數(shù)據(jù)。
2.列表(ArrayList)
本文的列表主要用于和數(shù)組做對比,ArrayList的實(shí)現(xiàn)基于數(shù)組,LinkedList的實(shí)現(xiàn)基于雙向鏈表,故本文主要介紹ArrayList
(1)列表(ArrayList)
ArrayList 類是一個(gè)可以動(dòng)態(tài)修改的數(shù)組,與普通數(shù)組的區(qū)別就是它是沒有固定大小的限制,我們可以添加或刪除元素。
(2)列表的聲明與創(chuàng)建
ArrayList 類位于 java.util 包中,使用前需要引入它
import java.util.ArrayList;
?
ArrayList<E> objectName = new ArrayList<>();? ? ??
//E:泛型數(shù)據(jù)類型,只能為引用數(shù)據(jù)類型
(3)列表的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
- 支持自動(dòng)改變大小
- 可以靈活的插入元素
- 可以靈活的刪除元素
缺點(diǎn):犧牲效率,比一般的數(shù)組慢
3.數(shù)組(Array)與列表(ArrayList)的區(qū)別
列表(ArrayList)是對數(shù)組(Array)的一個(gè)加強(qiáng)
(1)空間大小
- Array的空間大小是固定的,空間不夠時(shí)也不能再次申請,所以需要事前確定合適的空間大小。
- ArrayList的空間是動(dòng)態(tài)增長的,如果空間不夠,它會(huì)創(chuàng)建一個(gè)空間比原空間大0.5倍的新數(shù)組,然后將所有元素復(fù)制到新數(shù)組中,接著拋棄舊數(shù)組。而且,每次添加新的元素的時(shí)候都會(huì)檢查內(nèi)部數(shù)組的空間是否足夠。
(2)存儲(chǔ)內(nèi)容
- Array數(shù)組可以包含基本類型和對象類型。
- ArrayList卻只能包含對象類型。
(3)刪除方法
- Array數(shù)組沒有提供刪除方法
- ArrayList中有remove()方法
建議:基于效率和類型檢驗(yàn),應(yīng)盡可能使用Array,?無法確定數(shù)組大小時(shí)使用ArrayList,
解決一般化的問題時(shí),建議使用ArrayList。
二.Arrays類常用方法
Arrays類里的方法均被static修飾(即為靜態(tài)方法),故可以直接通過Arrays.xxx(xxx)的形式調(diào)用方法,下面介紹Arrays類的一些常用方法,常用方法大致可以分為:賦值,排序,查找,比較,復(fù)制
1.賦值
fill()
將指定的值分配給指定數(shù)組指定范圍中的每個(gè)元素。
public static void?fill(arrayname,value)
或
public static void?fill(arrayname ,starting index ,ending index ,value)
import java.util.*;
public class Example{
public static void main(String[] args) {
int array[] = new int[10];
Arrays.fill(array, 1);
for (int arrays:array) {
System.out.print(arrays+" ");
}
System.out.println();
Arrays.fill(array, 3, 6, 9);
for (int arrays:array) {
System.out.print(arrays+" ");
}
}
}
1 1 1 1 1 1 1 1 1 1
1 1 1 9 9 9 1 1 1 1
2.排序
sort()
對指定對象數(shù)組根據(jù)其元素的自然順序進(jìn)行升序排列。
public static void sort(Object[] arrayname)? ? ?
//對一個(gè)數(shù)組的所有元素進(jìn)行排序,并且是按從小到大的順序
public static void sort(Object[] arrayname,int fromIndex, int toIndex)
//對數(shù)組部分排序,也就是對數(shù)組a的下標(biāo)從fromIndex到toIndex-1的元素排序
import java.util.*;
public class Example{
public static void main(String[] args) {
int array[] = {2,5,85,30,75,66,-18,0};
Arrays.sort(array,2,5);
for (int arrays:array) {
System.out.print(arrays+" ");
}
System.out.println();
Arrays.sort(array);
for (int arrays:array) {
System.out.print(arrays+" ");
}
}
}
2 5 30 75 85 66 -18 0
-18 0 2 5 30 66 75 85
Arrays.sort()的底層原理:
假設(shè)數(shù)組長度為n
- 1<=n<47,使用插入排序
- 47<=n<286,使用快速排序
- n>=286,使用歸并排序或快速排序(有一定順序使用歸并排序,毫無順序使用快速排序)
這里簡單了解即可,關(guān)于各種排序的算法原理和復(fù)現(xiàn),后續(xù)在講算法的時(shí)候會(huì)單獨(dú)發(fā)一篇博客來說明的
3.查找
binarySearch()
用二分查找算法在給定數(shù)組中搜索給定值的對象。
數(shù)組在調(diào)用前必須排序好的。
public static int binarySearch(Object[] a,Object key)
//在一個(gè)數(shù)組的所有元素中進(jìn)行查找
返回值:
- 在數(shù)組范圍內(nèi),索引值為“ - 插入點(diǎn)索引值”
- 小于數(shù)組內(nèi)元素,索引值為 – 1
- 大于數(shù)組內(nèi)元素,索引值為 – (length + 1)
public static int binarySearch(Object[] a,int fromIndex,int toIndex,Object key)
//在該數(shù)組指定的范圍內(nèi)進(jìn)行查找
返回值:
- 在搜索范圍內(nèi),索引值為“ - 插入點(diǎn)索引值”
- 小于搜索范圍內(nèi)元素,返回–(fromIndex + 1)
- 大于搜索范圍內(nèi)元素,返回 –(toIndex + 1)
import java.util.*;
public class Example{
public static void main(String[] args) {
int array[] = {2,5,85,30,75,66,-18,0};
Arrays.sort(array);
for (int arrays:array) {
System.out.print(arrays+" ");
}
System.out.println();
System.out.println(Arrays.binarySearch(array,5));
System.out.println(Arrays.binarySearch(array,-99));
System.out.println(Arrays.binarySearch(array,100));
System.out.println(Arrays.binarySearch(array,60));
System.out.println(Arrays.binarySearch(array,1,5,5));
System.out.println(Arrays.binarySearch(array,1,5,-99));
System.out.println(Arrays.binarySearch(array,1,5,100));
System.out.println(Arrays.binarySearch(array,1,5,60));
}
}
-18 0 2 5 30 66 75 85
3 //5在數(shù)組內(nèi),返回排完序后的索引3
-1 //-99小于數(shù)組內(nèi)元素,返回索引值為-1
-9 //100大于數(shù)組內(nèi)元素,返回索引值為-(length+1)=-(8+1)
-6 //60在數(shù)組范圍內(nèi),返回索引值為-插入點(diǎn)索引值=-6
3 //5在搜索范圍內(nèi),返回排完序后的索引3
-2 //-99小于搜索范圍內(nèi)元素,返回–(fromIndex + 1)=-(1+1)=-2
-6 //100大于搜索范圍內(nèi)元素,返回–(toIndex + 1)=-(5+1)=-6
-6 //60在搜索范圍內(nèi),索引值為-插入點(diǎn)索引值=-6
二分查找算法原理和復(fù)現(xiàn)也會(huì)在之后的博客里提到
4.比較
equals()
如果兩個(gè)指定的數(shù)組彼此相等,則返回 true。如果兩個(gè)數(shù)組包含相同數(shù)量的元素,并且兩個(gè)數(shù)組中的所有相應(yīng)元素對都是相等的,則認(rèn)為這兩個(gè)數(shù)組是相等的。換句話說,如果兩個(gè)數(shù)組以相同順序包含相同的元素,則兩個(gè)數(shù)組是相等的。
public static boolean equals(Object[] arrayname,Object[] arrayname2)
import java.util.*;
public class Example{
public static void main(String[] args) {
int[] array1 = {2,5,85,30,75,66,-18,0};
int[] array2 = {75,2,66,30,5,85,0,-18};
if(Arrays.equals(array1, array2)){
System.out.println("array1等于array2");
}
else{
System.out.println("array1不等于array2");
}
Arrays.sort(array1);
Arrays.sort(array2);
for(int arrays:array1){
System.out.print(arrays+" ");
}
System.out.println();
for(int arrays:array2){
System.out.print(arrays+" ");
}
System.out.println();
if(Arrays.equals(array1, array2)){
System.out.println("排序后,array1等于array2");
}
else{
System.out.println("排序后,array1不等于array2");
}
}
}
array1不等于array2
-18 0 2 5 30 66 75 85
-18 0 2 5 30 66 75 85
排序后,array1等于array2
5.復(fù)制
copyOf()
將原始數(shù)組的元素,復(fù)制到新的數(shù)組中,可以設(shè)置復(fù)制的長度(即需要被復(fù)制的元素個(gè)數(shù))
public static Object[] copyOf(original,newLength)
copyOfRange()
將某個(gè)范圍內(nèi)的元素復(fù)制到新的數(shù)組中
public static Object[] copyOfRange(original,int from,int to)文章來源:http://www.zghlxwxcb.cn/news/detail-407038.html
//from為拷貝的開始位置(包含),to為拷貝的結(jié)束位置(不包含)文章來源地址http://www.zghlxwxcb.cn/news/detail-407038.html
import java.util.*;
public class Example{
public static void main(String[] args) {
int[] array1 = {2,5,85,30,75,66,-18,0};
int[] array2 = Arrays.copyOf(array1, 6);
int[] array3 = Arrays.copyOfRange(array1, 2, 4);
System.out.println(Arrays.toString(array1));
System.out.println(Arrays.toString(array2));
System.out.println(Arrays.toString(array3));
}
}
[2, 5, 85, 30, 75, 66, -18, 0]
[2, 5, 85, 30, 75, 66]
[85, 30]
到了這里,關(guān)于Java 淺談數(shù)組(Array)和列表(ArrayList)的區(qū)別 介紹Arrays常用方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!