一維數(shù)組
一、基本概念
數(shù)組是編程語言中最常見的一種數(shù)據(jù)結(jié)構(gòu),可以用它來存儲一個元素個數(shù)固定且元素類型相同的有序集,每個數(shù)組元素存放一個數(shù)據(jù),通常可通過數(shù)組元素的索引來訪問數(shù)組元素,包括為數(shù)組元素賦值和取出數(shù)組元素的值。
特點:個數(shù)固定,參數(shù)數(shù)據(jù)類型相同,有序集
數(shù)組也是一種數(shù)據(jù)類型,它本身是一種引用數(shù)據(jù)類型。像int、double、char等等這些屬于基本數(shù)據(jù)類型,但int[ ] 就是一種引用數(shù)據(jù)類型了;除了數(shù)組,類、接口也是引用數(shù)據(jù)類型。
二、聲明及使用
1)聲明創(chuàng)建
先聲明
dataType[ ] arrayName;
數(shù)據(jù)類型[ ] 數(shù)組引用變量;
再創(chuàng)建
arrayName = new dataType[arraySize];
可以用一條語句完成:
dataType[] arrayName = new dataType[arraySize];
2)訪問數(shù)組元素
數(shù)組里面每個元素都可以通過下面語法表示,下標(索引)是從0開始的,所以它的范圍是0~arrayName.length-1。
arrayName[index];
(數(shù)組引用變量[下標];)
三、初始化
注意:數(shù)組使用前必須初始化。
1)動態(tài)初始化
特點:只告知數(shù)組需要幾個存儲空間,但是并未決定要存哪些值,由系統(tǒng)為每個元素指定初始值。
arrayName = new type[length];
2)靜態(tài)初始化
特點:初始化數(shù)組和給數(shù)組賦值同時完成,在開辟數(shù)組的空間時依據(jù)已給定的元素個數(shù)來開辟相應的空間數(shù)。
/*語法結(jié)構(gòu)*/
//第一種: elementType[] arrayName = new elementType[]{value0,value1,value2,...,valuek}; //第二種:更簡捷 elementType[] arrayName={value0,value1,value2,...,valuek};
//(元素類型[] 數(shù)組引用變量={值1,值2,...,值k};
/*示例*/
public class ArrayDemo { public static void main(String[] args) { //一條語句聲明創(chuàng)建 float[] scores = new float[100]; System.out.println(scores[1]); scores[2] =86; //索引從0開始 System.out.println(scores[2]); //System.out.println(scores[100]); //java.lang.ArrayIndexOutOfBoundsException數(shù)組越界異常 //先聲明,再創(chuàng)建 // String[] name; // name = new String[100]; // //數(shù)組使用前需要進行初始化 String[] name = new String[12]; //動態(tài)初始化:只需要告知存儲空間,不用賦值 String[] sing = new String[] {"aq","12sw","qswde"}; //靜態(tài)初始化:聲明之后要賦值 System.out.println(name[5]); System.out.println(sing.length); } }
四、數(shù)組遍歷
數(shù)組的元素類型和數(shù)組的大小都是確定的,所以當處理數(shù)組元素的時候,通常使用基本循環(huán)或者foreach循環(huán)
數(shù)組大小:arrayName.length
如:for ( int i = 0 ; i < candyArray.length ; i ++){
System.out.print(candyArray[i]);
}
/* * 示例:輸出數(shù)組及求和 * 1、打印數(shù)組 * 2、求所有元素之和 * @author longhj */ package edu.study.array.practice_1031; import java.util.Arrays; public class PrintAndSumArray { //主方法 public static void main(String[] args) { int[] number = {8,4,2,1,23,344,12}; System.out.println("打印數(shù)組:"); printArray(number); System.out.printf("數(shù)組所有元素之和為:sum = %d ",sum(number)); } /** * 打印數(shù)組(三種方式)即遍歷數(shù)組 * @param list int型數(shù)組list */ public static void printArray(int[] list) { //方式一:利用for循環(huán) System.out.print("["); for(int i = 0 ;i < list.length;i++) { System.out.print(list[i]+(i == list.length - 1 ? "]\r\n" : ", ")); } //利用System.array類 System.out.println(Arrays.toString(list)); //foreach循環(huán)輸出 for(int a:list) System.out.print(a + " "); System.out.println(); } /** * 求所有數(shù)組元素的和 * @param list 數(shù)組 * @return sum 累加和 */ public static int sum(int[] list) { int sum = 0; for(int i = 0 ;i < list.length ; i++) { sum +=list[i]; } return sum; } }
foreach循環(huán):比for循環(huán)簡便,不使用下標變量就可以順序的遍歷整個數(shù)組
//語法結(jié)構(gòu)
for(elementType element : arrayName){
//Process the element
}
//如:
for(double e : list){ System.out.println(e);//解釋:對list中每個元素e進行以下操作。注意,變量e必須聲明為與list中元素相同的數(shù)據(jù)類型。 }
五、對數(shù)組的操作
1)數(shù)組的處理
通過一些例子來更好的理解
//import java.util.Arrays; import java.util.Scanner; public class ArrayTest { //主函數(shù) public static void main(String[] args) { int[] number = {12,23,45,67};//初始化數(shù)組 inputInitArray(); randomInitArray(); //調(diào)用找出最大值方法 System.out.println(getMax(number)); //調(diào)用生肖方法 System.out.println(zodiac(2023)); } /** * 1)使用輸入值初始化數(shù)組:循環(huán)使用用戶輸入的數(shù)值初始化數(shù)組。 */ public static void inputInitArray() { //聲明創(chuàng)建了大小為10的double型數(shù)組 double[] list = new double[5]; Scanner input = new Scanner(System.in); System.out.println("請輸入" + list.length + "個值:"); for(int i = 0; i < list.length; i++) list[i] = input.nextDouble(); input.close(); printArray(list); } /** * 2)打印數(shù)組中的每個元素 * @param arr double型數(shù)組 */ public static void printArray(double[] arr) { //第一種方式:使用for循環(huán) System.out.print("["); for(int i = 0; i < arr.length; i++) System.out.print(arr[i] + (i == arr.length - 1 ? "]\r\n" : ", ")); //第二種形式:使用Arrays工具類完成打印 //System.out.println(Arrays.toString(arr)); } /** * 3)使用隨機數(shù)初始化數(shù)組 */ public static void randomInitArray() { double[] list = new double[5]; for(int i = 0; i < list.length; i++) { list[i] = Math.random() * 100; } printArray(list); }/** * 4)找出最大值 * @param list * @return */ public static int getMax(int[] list) { int number = list[0]; for(int i = 1 ; i < list.length ; i++) { if(number < list[i]) number = list[i]; } System.out.println("最大值為:"); return number; } /** * 5)返回數(shù)組中最大元素第一次出現(xiàn)的索引下標 * @param list * @return index 索引下標 */ public static int getIndextMax(int[] list) { int max = list[0]; int index = 0; for(int i = 1 ; i < list.length ; i++) { if(max < list[i]) { max = list[i]; index = i; } } return index; } /** * 6)打印生肖 * @param year * @return */ public static String zodiac(int year) { String[] years = {"猴","雞","狗","豬","鼠","牛","虎","兔","龍","蛇","馬","羊"}; System.out.println(year + "年的生肖為:" + years[year % 12]); return "1"; }
}
示例:打亂順序
/* * 需求:將數(shù)組中的數(shù)據(jù)打亂順序 */ import java.util.Arrays; public class Work5 { public static void main(String[] args) { int [] list = randomInitArray(); System.out.println("打亂前:" + Arrays.toString(list)); disrupt(list); System.out.println("打亂后:" +Arrays.toString(list) ); } /** * 生成隨機數(shù)組 * */ public static int[] randomInitArray() { int[] list = new int[10]; for(int i = 0; i < list.length; i++) { list[i] =(int)( Math.random() * 100); } return list; } /** * 打亂順序 * @param list */ public static void disrupt(int[] list) { for(int i = 0 ; i<list.length ; i++) { int index = (int)(Math.random()*list.length); int temp = list[i]; list[i] = list[index]; list[index] = temp; } } }
示例:給定兩個數(shù)組,打印它們的共同元素
/* * 需求:打印兩個有序數(shù)組中的共同元素 * */ import java.util.Arrays; public class Work { public static void main(String[] args) { int[] list1 = {3,7,5,11,12,9}; int[] list2 = {11,4,5,3}; compareArray(list1,list2); } public static void compareArray(int[] list1,int[] list2) { Arrays.sort(list1); Arrays.sort(list2); for(int i = 0;i<list1.length;i++) { for(int j=0;j<list2.length;j++) { if(list1[i]==list2[j]) { System.out.print(list1[i]+" "); } } } } }
2)數(shù)組的復制
在Java中,可以使用復制語句復制基本數(shù)據(jù)類型的變量,但不能復制數(shù)組。將一個數(shù)組變量賦值給另一個數(shù)組變量,實際上是將一個數(shù)組的引用賦值給另一個變量,使兩個變量都指向相同的內(nèi)存地址。
1、使用循環(huán)語句逐個地復制數(shù)組的元素。
int[] sourceArray = {1,5,7,11,12,-20};
int[] targetArray = new int[sourceArray.length];
for(int i = 0; i < sourceArray.length; i++)
targetArray[i] = sourceArray[i];
System.out.println(Arrays.toString(sourceArray));
System.out.println(Arrays.toString(targetArray));
語法:System.arraycopy(sourceArray,srcPos,targetArray,tarPos,length);
其中,參數(shù)srcPos和tarPos分別表示在源數(shù)組sourceArray和目標數(shù)組targetArray中的起始位置,從sourceArray復制到targetArray中的元素個數(shù)由參數(shù)length指定。
System.arraycopy(sourceArray,0,targetArray,0,sourceArray.length);
3、使用clone方法復制數(shù)組。
int [] array3 = sourceArray.clone(); System.out.println(Arrays.toString(array3));
3)數(shù)組的傳遞
Java使用按值傳遞的方式將實參傳遞給方法。
- 對于基本數(shù)據(jù)類型參數(shù),傳遞的是實參的值。
- 對于數(shù)組類型參數(shù),參數(shù)值是數(shù)組的引用,給方法傳遞的這個引用。
示例1:
/** * 從方法返回一個數(shù)組(反轉(zhuǎn)后的數(shù)組) * @param list 源數(shù)組 * @return 反轉(zhuǎn)后的數(shù)組 */
//將數(shù)組傳遞給方法;從方法中返回數(shù)組
public static int[] reverse(int[] list) {
int[] result = new int[list.length];
for(int i = 0,j = result.length - 1; i < list.length; i++,j--)
result[j] = list[i]; return result;
}
示例2:
/*隨機生成100個小寫字母并將其放入到一個字符數(shù)組中, 對該數(shù)組中每個字母出現(xiàn)的次數(shù)進行統(tǒng)計。*/ package edu.study.array; public class StatisticsLetterCount { public static void main(String[] args) { //創(chuàng)建一個大小為100的字符數(shù)組,存入隨機小寫字母 char[] letters = new char[100]; for(int i=0;i<letters.length ; i++) { letters[i]=randomLowerLetter(); } // int[] times = new int[26]; for (char letter : letters) { times[letter - 'a']++; } for(int i = 0;i<times.length ;i++) { System.out.println((char)('a'+i)+":"+times[i]); } } /** * 隨機生成的小寫字母 * @return */ public static char randomLowerLetter() { return (char)('a' + Math.random() * ('z' - 'a')); } }
4)數(shù)組的排序
1、選擇排序
原理:首先找到數(shù)組中最小的數(shù),然后將它和第一個元素進行交換;在剩下的數(shù)中找到最小數(shù),然后將它和第二個元素進行交換;依次類推,直到數(shù)列中只剩下一個元素

public static void selectionSort(int[] array) { for(int i = 0; i < array.length - 1; i++) { int currentMin = array[i]; int currentMinIndex = i; for(int j = i + 1; j < array.length; j++) { if(currentMin > array[j]) { currentMin = array[j]; currentMinIndex = j; } } if(currentMinIndex != i) { array[currentMinIndex] = array[i]; array[i] = currentMin; } } }
2、冒泡排序 (下沉排序)
原理:前一個跟后一個比較,大的往后移

public static int[] bubbleSorted(int[] array) { //i表示次數(shù) for (int i = 0; i < array.length - 1; i++) { //j代表每次比較完后結(jié)束的位置 for (int j = 0; j < array.length - 1; j++) { if (array[j] > array[j + 1]) { int tmp=array[j]; array[j]=array[j+1]; array[j+1]=tmp; } } } return array; }
5)數(shù)組的查找
1、線性查找
原理:從數(shù)組的第一個元素依次比較,若相同,則返回該元素對應索引
public static int linearSearch(int key,int[] list) { for(int i = 0; i < list.length; i++) { if(list[i] == key) return i; } return -1; }
2、二分查找(折半查找)
原理:每次折半取中間數(shù),如果關鍵字小于中間元素,只需要在數(shù)組的前一半進行查找;如果關鍵字大于中間元素,只需要在數(shù)組的后一半進行查找;相等,就返回mid
前提:數(shù)組是一個有序數(shù)組
public static int binarySearch(int key, int[] list) { //參數(shù):要查找的數(shù) ,數(shù)組 int low = 0; int high = list.length - 1; while(high >= low) {int mid = (low + high)/2; if(key < list[mid]) high = mid - 1; else if(key > list[mid]) low = mid + 1; else return mid; } return -low - 1; }
六、Arrays類(java.util.Arrays)
Arrays類包含各種各樣的靜態(tài)方法,用于實現(xiàn)數(shù)組的排序和查找、數(shù)組的比較和填充數(shù)組元素,以及返回數(shù)組的字符串表示。這些方法都有對所有基本類型的重載方法。
排序:sort ; parallelSort
二分查找:binarySearch
是否相等:equals
填充數(shù)組:fill
打印數(shù)組:toString
等等......
練習:給定一個整數(shù)數(shù)組,例如{6,4,7,2,5,8}和一個數(shù)字,例如10,請設計一個函數(shù)找出兩個元素(或同一個元素加自身),并且使這兩個數(shù)的和為給定數(shù)字,并打印出來(提示:先進行數(shù)組排序)
package edu.study.array.practice_1031; import java.util.Arrays; import java.util.Scanner; public class Work7 { public static void main(String[] args) { int[] list = {6,4,7,2,5,8}; Arrays.sort(list); System.out.println("請輸入一個數(shù):"); Scanner input = new Scanner(System.in); int num = input.nextInt(); input.close(); sumOfgetNumber(list,num); } /** * 判斷兩數(shù)之和或本身2倍是否等于number(遍歷兩遍) * @param list 數(shù)組 * @param number 要比較的數(shù) * */ public static void sumOfgetNumber(int[] list,int number) { for(int i=0;i<list.length;i++) { for(int j =i+1;j<list.length;j++) { if(list[i]+list[j]==number) { System.out.println(list[i]+"+"+list[j]+"="+number); } } if(list[i]*2==number) { System.out.println(list[i]+"*"+2+"="+number); } } } }
浙公網(wǎng)安備 33010602011771號