數(shù)組是一種非常有用和常用的數(shù)據(jù)類(lèi)型,存在于每種程序語(yǔ)言之中,java中的數(shù)組是一種最簡(jiǎn)單的復(fù)合數(shù)據(jù)類(lèi)型,剛學(xué)習(xí)java數(shù)組的小白們大多都會(huì)聽(tīng)到一句這樣的話(huà):java是純面向?qū)ο蟮恼Z(yǔ)言,它的數(shù)組也是一個(gè)對(duì)象。所以很多人就按照一個(gè)對(duì)象的方式來(lái)使用數(shù)組,后來(lái)你會(huì)發(fā)現(xiàn),將數(shù)組作為一個(gè)類(lèi)來(lái)使用在實(shí)現(xiàn)上是多么的“不自然”。下面就來(lái)全面了解一下關(guān)于java中數(shù)組的知識(shí)。
int a = 10;
Integer integer = new Integer(a);
int b = integer.intValue();
System.out.println(a = b);
int[] arr = new int[5];
arr[0] = 1;
arr[1] = 2;
int[] arr = new int[]{3,5,1,7};
int[] arr = {3,5,1,7};
int [] arr
示例:String[] aArray = new String[5];
String[] bArray = {"a","b","c", "d", "e"};
String[] cArray = new String[]{"a","b","c","d","e"};
注意:int arr[] 也是一種創(chuàng)建數(shù)組的格式。推薦使用int [] arr 的形式聲明數(shù)組。public static void main(String[] args) {
// 1.方式一 聲明 分配空間并賦值
int[] arr1 = {1,2,3};
// 2.方式二 顯示初始化
int[] arr2;
arr2 = new int[]{1,2,3};
// 3.方式三 顯示初始化()
int[] arr3;
arr3 = new int[3];
}
他們的區(qū)別,方式一:在聲明的時(shí)候直接就已經(jīng)分配空間,并賦值,方式一是不能寫(xiě)成如下這種形式的。
int[] arr1;
arr1 = {1,2,3};//錯(cuò)誤寫(xiě)法 編譯不通過(guò)
方式二和方式三,聲明和內(nèi)存分配是分開(kāi)的,如上面的例子,
int[] arr2; 和 int[] arr3;
這一步是在??臻g分配一個(gè)引用,存放的是一個(gè)引用,null
arr2 = new int[]{1,2,3};<span style="font-family: Arial, Helvetica, sans-serif;">arr3 = new int[3];</span>
到這一步的時(shí)候jvm才開(kāi)始在內(nèi)存堆區(qū)域分配空間,并賦值,方式二直接賦值 1,2,3 方式三 默認(rèn)初始化,基本類(lèi)型是 0 布爾類(lèi)型是 false 引用類(lèi)型為null,
int[]arr = { 1, 2, 3, 4, 5 };
方式二:使用運(yùn)算符new
int[] arr2 = new int[] { 1, 2, 3, 4, 5 };
int[] arr3=new int[3];
arr3[0]=1;
arr3[1]=5;
arr3[2]=6;
如果數(shù)組初始化中不使用運(yùn)算符new。需要注意:下列寫(xiě)法是錯(cuò)誤的。
int[] arr;
arr={1,2,3,4,5};
此時(shí)初始化數(shù)組,必須將聲明,創(chuàng)建,初始化都放在一條語(yǔ)句中個(gè),分開(kāi)會(huì)產(chǎn)生語(yǔ)法錯(cuò)誤。
所以只能如下寫(xiě):
int[] arr={1,2,3,4,5};
import java.util.Arrays;
/**
* 數(shù)組綜合測(cè)試
*
* @author leizhimin 2009-7-28 12:35:41
*/
public class TestArrays {
public static void main(String[] args) {
int[] i = new int[10];
//填充數(shù)組
Arrays.fill(i, 2);
//遍歷數(shù)組
for (int x : i) {
System.out.print(x + " ");
}
//toString()數(shù)組
System.out.println("\n" + Arrays.toString(i));
//復(fù)制數(shù)組
int[] b = new int[12];
System.arraycopy(i, 0, b, 2, 5);
System.out.println(Arrays.toString(b));
//一維數(shù)組的比較
int[] c = new int[3];
int[] d = new int[3];
Arrays.fill(c, 3);
Arrays.fill(d, 3);
System.out.println(c.equals(d));
System.out.println(Arrays.equals(c, d));
System.out.println("-------------");
int[][] a1 = {{1, 2, 3}, {4, 5, 6}};
int[][] a2 = {{1, 2, 3}, {4, 5, 6}};
System.out.println(a1.equals(a2));
System.out.println(Arrays.equals(a1, a2));
System.out.println(Arrays.deepEquals(a1, a2));
//深度toString()
System.out.println(Arrays.toString(a1));
System.out.println(Arrays.deepToString(a1));
//數(shù)組的排序
int[] a3 = {3, 2, 5, 4, 1};
System.out.println(Arrays.toString(a3));
Arrays.sort(a3);
System.out.println(Arrays.toString(a3));
//一維數(shù)組數(shù)值檢索
int index1 = Arrays.binarySearch(a3, 4);
int index2 = Arrays.binarySearch(a3, -12);
int index3 = Arrays.binarySearch(a3, 8);
System.out.println(index1 + " " + index2 + " " + index3);
}
}
2 2 2 2 2 2 2 2 2 2
[2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
[0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0]
false
true
-------------
false
false
true
[[I@3e25a5, [I@19821f]
[[1, 2, 3], [4, 5, 6]]
[3, 2, 5, 4, 1]
[1, 2, 3, 4, 5]
3 -1 -6
Process finished with exit code 0
public static void main(String[] args) {
int[] x = { 1, 2, 3 };
for (int y = 0; y < 3; y++) {
System.out.println(x[y]);
// System.out.println("x["+y+"]="+x[y]); 打印效果 x[0]=1;
} // 那么這就是數(shù)組的第一個(gè)常見(jiàn)操作.遍歷
}
public static void main(String[] args) {
int[] x = { 1, 2, 3 };
for (int y = 0; y < x.length; y++) {
System.out.println(x[y]);
// System.out.println("x["+y+"]="+x[y]); 打印效果 x[0]=1;
} // 那么這就是數(shù)組的第一個(gè)常見(jiàn)操作.遍歷
}
java.lang.System
public static void arraycopy(Object src,
int srcPos,
Object dest,
int destPos,
int length)
public static void main(String[] args) {
int[] x = { 1, 2, 3 };
System.out.println(x[3]);
//java.lang.ArrayIndexOutOfBoundsException
}
2、空指針異常:
public static void main(String[] args) {
int[] x = { 1, 2, 3 };
x = null;
System.out.println(x[1]);
// java.lang.NullPointerException
}
數(shù)組:
*/
public static int getMax(int[] arr)
{
//定義變量記錄較大的值,初始化為數(shù)組中的任意一個(gè)元素。
int max = arr[0];
for(int x=1; x<arr.length; x++)
{
if(arr[x]>max)
max = arr[x];
}
return max;
}
使用直接排序?qū)?shù)組進(jìn)行排序:
/*
選擇排序。
以一個(gè)角標(biāo)的元素和其他元素進(jìn)行比較。
在內(nèi)循環(huán)第一次結(jié)束,最值出現(xiàn)的頭角標(biāo)位置上。
*/
public static void selectSort(int[] arr)
{
for(int x=0; x<arr.length-1; x++)
{
for(int y=x+1; y<arr.length; y++)//為什么y的初始化值是 x+1?因?yàn)槊恳淮伪容^,
//都用x角標(biāo)上的元素和下一個(gè)元素進(jìn)行比較。
{
if(arr[x]>arr[y])
{
int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
}
}
}
3、冒泡排序
/*
冒泡排序。
比較方式:相鄰兩個(gè)元素進(jìn)行比較。如果滿(mǎn)足條件就進(jìn)行位置置換。
原理:內(nèi)循環(huán)結(jié)束一次,最值出現(xiàn)在尾角標(biāo)位置。
*/
public static void bubbleSort(int[] arr)
{
for(int x=0; x<arr.length-1; x++)
{
for(int y=0; y<arr.length-x-1; y++)//-x:讓每次參與比較的元減。
//-1:避免角標(biāo)越界。
{
if(arr[y]>arr[y+1])
{
int temp = arr[y];
arr[y] = arr[y+1];
arr[y+1] = temp;
}
}
}
}
/*
為了提高查找效率,可使用折半查找的方式,注意:這種查找只對(duì)有序的數(shù)組有效。
這種方式也成為二分查找法。
*/
public static int halfSeach(int[] arr,int key)
{
int min,mid,max;
min = 0;
max = arr.length-1;
mid = (max+min)/2;
while(arr[mid]!=key)
{
if(key>arr[mid])
min = mid + 1;
else if(key<arr[mid])
max = mid - 1;
if(min>max)
return -1;
mid = (max+min)/2;
}
return mid;
}
/*
反轉(zhuǎn)其實(shí)就是頭角標(biāo)和尾角標(biāo)的元素進(jìn)行位置的置換,
然后在讓頭角標(biāo)自增。尾角標(biāo)自減。
當(dāng)頭角標(biāo)<尾角標(biāo)時(shí),可以進(jìn)行置換的動(dòng)作。
*/
public static void reverseArray(int[] arr)
{
for(int start=0,end=arr.length-1; start<end; start++,end--)
{
swap(arr,start,end);
}
}
//對(duì)數(shù)組的元素進(jìn)行位置的置換。
public static void swap(int[] arr,int a,int b)
{
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
type arrayName[ ][ ];
type [ ][ ]arrayName;
int intArray[ ][ ]={{1,2},{2,3},{3,4,5}};
Java語(yǔ)言中,由于把二維數(shù)組看作是數(shù)組的數(shù)組,數(shù)組空間不是連續(xù)分配的,所以不要求二維數(shù)組每一維的大小相同。
arrayName = new type[arrayLength1][arrayLength2];
int a[ ][ ] = new int[2][3];
從最高維開(kāi)始,分別為每一維分配空間:
arrayName = new type[arrayLength1][ ];
arrayName[0] = new type[arrayLength20];
arrayName[1] = new type[arrayLength21];
…
arrayName[arrayLength1-1] = new type[arrayLength2n];
例: 二維簡(jiǎn)單數(shù)據(jù)類(lèi)型數(shù)組的動(dòng)態(tài)初始化如下:
int a[ ][ ] = new int[2][ ];
a[0] = new int[3];
a[1] = new int[5];
對(duì)二維復(fù)合數(shù)據(jù)類(lèi)型的數(shù)組,必須首先為最高維分配引用空間,然后再順次為低維分配空間。而且,必須為每個(gè)數(shù)組元素單獨(dú)分配空間。
String s[ ][ ] = new String[2][ ];
s[0]= new String[2];//為最高維分配引用空間
s[1]= new String[2]; //為最高維分配引用空間
s[0][0]= new String("Good");// 為每個(gè)數(shù)組元素單獨(dú)分配空間
s[0][1]= new String("Luck");// 為每個(gè)數(shù)組元素單獨(dú)分配空間
s[1][0]= new String("to");// 為每個(gè)數(shù)組元素單獨(dú)分配空間
s[1][1]= new String("You");// 為每個(gè)數(shù)組元素單獨(dú)分配空間
arrayName[index1][index2]
num[1][0];
public
class MatrixMultiply{
public
static
void main(String args[]){
int i,j,k;
int a[][]=new
int [2][3]; //動(dòng)態(tài)初始化一個(gè)二維數(shù)組
int b[][]={{1,5,2,8},{5,9,10,-3},{2,7,-5,-18}};//靜態(tài)初始化
一個(gè)二維數(shù)組
int c[][]=new
int[2][4]; //動(dòng)態(tài)初始化一個(gè)二維數(shù)組
for (i=0;i<2;i++)
for (j=0; j<3 ;j++)
a[j]=(i+1)*(j+2);
for (i=0;i<2;i++){
for (j=0;j<4;j++){
c[j]=0;
for(k=0;k<3;k++)
c[j]+=a[k]*b[k][j];
}
}
System.out.println("*******Matrix C********");//打印Matrix C標(biāo)記
for(i=0;i<2;i++){
for (j=0;j<4;j++)
System.out.println(c[j]+" ");
System.out.println();
}
}
}
List list = new ArrayList();
list.add("1");
list.add("2");
final int size = list.size();
String[] arr = (String[])list.toArray(new String[size]);
調(diào)用Arrays的asList方法.
asList
public static <T> List<T> asList(T... a)返回一個(gè)受指定數(shù)組支持的固定大小的列表。(對(duì)返回列表的更改會(huì)“直寫(xiě)”到數(shù)組。)此方法同 Collection.toArray 一起,充當(dāng)了基于數(shù)組的 API 與基于 collection 的 API 之間的橋梁。返回的列表是可序列化的,并且實(shí)現(xiàn)了 RandomAccess。
此方法還提供了一個(gè)創(chuàng)建固定長(zhǎng)度的列表的便捷方法,該列表被初始化為包含多個(gè)元素:
List stooges = Arrays.asList("Larry", "Moe", "Curly");
參數(shù):
a - 支持列表的數(shù)組。
返回:
指定數(shù)組的列表視圖。
另請(qǐng)參見(jiàn):
Collection.toArray()
具體用法:
String[] arr = new String[] {"1", "2"};
List list = Arrays.asList(arr);
更多建議: