什么是數(shù)組?
1、數(shù)組也是一種數(shù)據(jù)類型(應(yīng)用數(shù)據(jù)類類型)
2、數(shù)組是可以存放多個值
為什么要用數(shù)組?
當(dāng)我們要存儲相同類型的多個數(shù)據(jù)的時候,需要定義多個變量,這樣在使用的不方便。因為數(shù)組是可以存儲多個值,所以我們可以用數(shù)組來表示這個多個數(shù)據(jù)。
數(shù)組如何定義
基本數(shù)據(jù)類型定義
數(shù)據(jù)類型 變量名 = 變量值;
int a = 10;
數(shù)組定義:
數(shù)據(jù)類型 數(shù)組名;
int[] arr; 或者 int arr[];
數(shù)組的賦值
靜態(tài)初始化
int[] arr = {10,15,12,7,20};
或者int[] arr1 = new int[]{1,2,3,4,5};
獲取數(shù)組元素 數(shù)組[下標(biāo)] arr[0]
動態(tài)初始化 長度必須要定義
int[] arr = new int[長度];
賦值 arr[0] = 1;
arr[1] = 10;
......
獲取數(shù)組元素 數(shù)組[下標(biāo)] arr[0]
數(shù)組遍歷
- for循環(huán)遍歷
//定義一個數(shù)組,輸出數(shù)組中的每一個元素
String[] arr = {"cxk","lsis","wangwu","jack","rose","趙四"};
//int len = arr.length; //獲取數(shù)組中的所有的元素------>遍歷
for(int i =0 ; i < arr.length; i++) {
// i 被當(dāng)做是數(shù)組的下標(biāo)
System.out.println( arr[i] );
}
}
- 增強for循環(huán)
/*
* foreach循環(huán)
*
* 語法:
* (定義變量名)
* for(數(shù)組中的每一個元素的類型 遍歷出來的每一個元素 :要遍歷的數(shù)組){
*
* }
*/
String[] arr = {"cxk","lsis","wangwu","jack","rose","趙四"};
for(String a : arr) {
System.out.println(a);
}
// fore 快捷鍵 alt+/
for (String a : arr) {
System.out.println(a);
}
數(shù)組的默認(rèn)值
/**
* 數(shù)組的默認(rèn)值
基本數(shù)據(jù)類型
* 類型 默認(rèn)值
* int 0
* byte 0
* short 0
* long 0
*
* float 0.0
* double 0.0
*
* char \u0000 GBK UTF-8 ASCII
*
* boolean false
*
*
* 引用數(shù)據(jù)類型
* String null 所有的引用數(shù)據(jù)類型的默認(rèn)值都是null
*
* null 和 ""
null 指的是這個變量沒有指向內(nèi)存中的某一塊空間
"" 指向的是內(nèi)存中為""的字符串
* String s1 = null;
* String s2 = "";
*
*/
數(shù)組的特點
/**
* 1、數(shù)組是定長的(數(shù)組一旦定義,長度不能改變)
* 2、數(shù)組的長度用 數(shù)組名length獲取
* 3、數(shù)組的下標(biāo)從0開始,到長度-1結(jié)束
* 4、數(shù)組中的每一個元素的類型一致的
* 5、如果數(shù)組的下標(biāo)超出范圍,會報錯(異常) ArrayIndexOutOfBoundsException 數(shù)組下標(biāo)越界異常
*/
測試
1、定義一個數(shù)組, 輸入一個數(shù)字, 得到這個數(shù)字在數(shù)組中的下標(biāo) (用方法做)
2、定義一個數(shù)字, 求最大值,最小值,平均值
參考代碼
/**
* 1、定義一個數(shù)組, 輸入一個數(shù)字, 得到這個數(shù)字在數(shù)組中的下標(biāo) (用方法做)
* 思路: 遍歷數(shù)組,然用輸入的數(shù)字與數(shù)組的每一個元素進(jìn)行比較,如果相等,直接返回當(dāng)前元素的下標(biāo)
*
*/
public class Test1 {
public static void main(String[] args) {
int[] arr = {10,29,18,7,65,11};
Scanner sc = new Scanner(System.in);
System.out.println("請輸入一個數(shù)字");
int num = sc.nextInt();
int index = method1(num,arr);
System.out.println("您輸入的數(shù)字在數(shù)組中的下標(biāo)為"+index);
}
public static int method1(int num,int[] arr) {
for (int i = 0; i < arr.length; i++) {
if(num == arr[i]) {
return i;
}
}
return -1;
}
}
/**
* 2、定義一個數(shù)組, 求最大值,最小值,平均值
* 思路:假設(shè)第一個數(shù)為最大值。與數(shù)組中的每一個元素進(jìn)行比較,元素比最大值大,就把當(dāng)前這個值賦給最大值
*
*/
public class Test2 {
public static void main(String[] args) {
int[] arr = {12,45,87,24,68};
//method(arr);
int[] arr1 = method1(arr);
System.out.println("數(shù)組的最大值為:"+arr1[0]);
System.out.println("數(shù)組的最小值為:"+arr1[1]);
System.out.println("數(shù)組的平均值為:"+arr1[2]);
}
//返回的是數(shù)組,將三個值放到數(shù)組中一起返回
public static int[] method1(int[] arr) {
int max = arr[0];
int min = arr[0];
int sum = 0;
for (int i = 0; i < arr.length; i++) {
if(max < arr[i]) {
max = arr[i];
}
if(min > arr[i]) {
min = arr[i];
}
sum += arr[i];
}
//定義一個數(shù)組,將最大值,最小值,平均值,放到數(shù)組中。
int[] arr1 = {max,min,sum/arr.length};
return arr1;
}
//求出最大值,最小值,平均值并輸出
public static void method(int[] arr) {
int max = arr[0];
int min = arr[0];
int sum = 0;
for (int i = 0; i < arr.length; i++) {
if(arr[i] > max) {
max = arr[i];
}
if(arr[i] < min) {
min = arr[i];
}
sum = sum + arr[i];
}
System.out.println("數(shù)組的最大值為:"+max);
System.out.println("數(shù)組的最小值為:"+min);
System.out.println("數(shù)組的平均值為:"+sum/arr.length);
}
}
數(shù)組排序
冒泡排序
/**
* 對數(shù)組進(jìn)行升序排列
*
*
* @param arr 要排序的數(shù)組
* @return 排序之后的數(shù)組
*/
public static int[] sort(int[] arr) {
// arr.length -1 比較輪數(shù) i 外層 循環(huán)控制 比較輪數(shù)
for (int i = 0; i < arr.length -1; i++) {
//arr.length -1 比如 5個數(shù)最多只能比較4次 每一輪比較的次數(shù) j 內(nèi)層 循環(huán)控制 比較次數(shù)
// arr.length -1 -i 每一輪可以少比較一次
for (int j = 0; j < arr.length -1 -i ; j++) {
if(arr[j] > arr[j+1]) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
return arr;
}
- 優(yōu)化
public static int[] sort1(int[] arr) {
int count = 0;
for (int i = 0; i < arr.length -1; i++) {
//定義一個信號量 1,2,3,4,5
boolean flag = true;
for(int j = 0 ; j < arr.length-1 -i; j++) {
if(arr[j] > arr[j+1]) {
flag = false;
int temp = arr[j];
arr[j] =arr[j+1];
arr[j+1] = temp;
}
}
count++;
System.out.println("這個數(shù)組比較了"+count+"輪");
//判斷flag
if(flag == true) {
return arr;
}
}
return arr;
}
- 選擇排序
public static int[] sort(int[] arr) {
for (int i = 0; i < arr.length; i++) {
//假設(shè)當(dāng)前這個數(shù)為最小的數(shù)字 min是這個數(shù)的下標(biāo)
int min = i;
for (int j = i+1; j < arr.length; j++) {
if(arr[min] > arr[j]) {
min = j;
}
}
//等比較結(jié)束 min所對應(yīng)的值為最小值
//arr[i] arr[min] min == i
if(min != i) {
int temp = arr[i];
arr[i] = arr[min];
arr[min] = temp;
}
}
return arr;
}
二分查找法
public class Demo8 {
public static void main(String[] args) {
//折半查找法前提:數(shù)組必須是有序的
int[] arr = {12,56,78,92,106,207,300};
int index = method(107, arr);
System.out.println(index);
}
public static int method(int num , int[] arr) {
int min = 0;
int max = arr.length -1;
while(min <= max) {
int middle = (max+min)/2;
if(num > arr[middle]) {
min = middle+1;
}else if(num < arr[middle]) {
max = middle -1;
}else {
return middle;
}
}
return -1;
}
}