前言
我們了解數(shù)組這個(gè)概念之前,我們先思考下面幾個(gè)問題。
如果我們需要兩個(gè)數(shù)據(jù),那么直接創(chuàng)建兩個(gè)變量即可
int a;
int b;
如果需要五個(gè)數(shù)據(jù),那么可以創(chuàng)建五個(gè)變量
int a;
int b;
int c;
int d;
int f;
但如果我們需要100個(gè)甚至是1萬個(gè)數(shù)據(jù),那么我們創(chuàng)一萬個(gè)變量?顯然這是不現(xiàn)實(shí)的。這個(gè)時(shí)候就需要我們的數(shù)組來起作用!幫我們“批量”創(chuàng)建變量。
由上可以得出:數(shù)組的本質(zhì)就是讓我們能“批量”創(chuàng)建相同類型的變量!
一.數(shù)組的概念
數(shù)組是一種數(shù)據(jù)結(jié)構(gòu),用來存儲(chǔ)同一類型的集合,也就是說數(shù)組包含的變量必須是相同類型!
二.創(chuàng)建數(shù)組
基本語法如下:
//動(dòng)態(tài)初始化
數(shù)據(jù)類型[] 數(shù)組名稱 = new 數(shù)據(jù)類型 []{初始化數(shù)據(jù)};
//靜態(tài)初始化
數(shù)據(jù)類型[] 數(shù)組名稱 = {初始化數(shù)據(jù)};
代碼示例
public class TestDemo {
public static void main(String[] args) {
//動(dòng)態(tài)初始化
//數(shù)據(jù)類型[] 數(shù)組名稱 = new 數(shù)據(jù)類型 []{初始化數(shù)據(jù)};
int[] arr1 = new int[]{1,2,3};
//靜態(tài)初始化
//數(shù)據(jù)類型[] 數(shù)組名稱 = {初始化數(shù)據(jù)};
int[] arr2 ={1,2,3};
}
}
注意:靜態(tài)初始化的時(shí)候,數(shù)組元素的個(gè)數(shù)和初始化數(shù)據(jù)的格式是一樣的!
如果你學(xué)過其他語言,例如C語言,c語言的數(shù)組創(chuàng)建是這樣的
數(shù)據(jù)類型 數(shù)組名[]={初始化數(shù)據(jù)};
例如: int arr[] = {1,2,3};
其實(shí)Java中也可以做到這樣,但是不推薦這么寫,Java是一種強(qiáng)類型語言,變量前面就是類型,一目了然!
三.數(shù)組的使用
我們看一個(gè)例子,如何獲取數(shù)組的長度?
如果你學(xué)過C語言,那么肯定會(huì)說
int sz = sizeof(arr) / sizeof(arr[0]);
其實(shí)Java比c語言更方便,直接使用“數(shù)組名.length”就可以求出來數(shù)組的長度。
代碼如下:
public class TestDemo {
public static void main(String[] args) {
int[] arr ={1,2,3};
int len = arr.length;
System.out.println(len);//3
}
}
毫無疑問這個(gè)代碼運(yùn)行結(jié)果是3;
那么我們?nèi)绾卧L問數(shù)組元素呢?
我們來看下面的代碼:
public class TestDemo {
public static void main(String[] args) {
int[] arr ={1,2,3};
int len = arr.length;
System.out.println(len);//3
System.out.println(arr[0]);//1
System.out.println(arr[1]);//2
System.out.println(arr[2]);//3
}
}
顯而易見的是,直接使用數(shù)組名[數(shù)組元素下標(biāo)]來訪問數(shù)組元素。但出現(xiàn)了一個(gè)問題,為什么arr[0]是1而arr[1]是2?為什么不是arr[1]是1 arr[2]是2嗎?
這里我們得出一個(gè)結(jié)論,數(shù)組的下標(biāo)是從0開始的,不是從1開始的。
我們來嘗試訪問一下arr[3]看會(huì)出現(xiàn)什么情況.
public class TestDemo {
public static void main(String[] args) {
int[] arr ={1,2,3};
int len = arr.length;
System.out.println(len);//3
System.out.println(arr[0]);//1
System.out.println(arr[1]);//2
System.out.println(arr[2]);//3
System.out.println(arr[3]);
}
}
我們發(fā)現(xiàn)前面都和我們預(yù)想一樣輸出結(jié)果都正確,但唯獨(dú)出現(xiàn)了一串紅字,這串紅字說明存在數(shù)組越界。
我們由此得出一個(gè)結(jié)論:在Java下標(biāo)訪問操作中不能超出有效范圍也就是[0,length-1],如果超出有效范圍,會(huì)拋出下標(biāo)越界異常。
四.數(shù)組的遍歷
所謂遍歷,是指將數(shù)組中的所有元素都訪問一遍,不重不漏,需要搭配循環(huán)語句!
我們學(xué)了數(shù)組的訪問,那么我們?nèi)绾伪闅v數(shù)組呢?有兩種常用方法 一種是for循環(huán),一種是foreach循環(huán)。
for循環(huán)示例
public class TestDemo {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
for(int i = 0 ;i < arr.length;i++){
System.out.print(arr[i]+" ");
}
}
}
我們發(fā)現(xiàn)打印出來了數(shù)組的元素。
for-each示例
foreach基本使用方法:元素類型 變量:數(shù)組名
public class TestDemo {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
for(int x:arr){
System.out.print(x+" ");
}
}
}
執(zhí)行結(jié)果一致。
那么我們什么時(shí)候使用for循環(huán),什么時(shí)候使用foreach循環(huán)?
foreach循環(huán)適用于不知道循環(huán)次數(shù),或者是循環(huán)次數(shù)很難計(jì)算。
for循環(huán)適用于知道循環(huán)次數(shù),在復(fù)雜的循環(huán)中效率更高。
如果是在循環(huán)中使用增刪查改操作,for循環(huán)可以實(shí)現(xiàn),因?yàn)閒oreach循環(huán)不能實(shí)現(xiàn)這些操作。
五.數(shù)組作為方法的參數(shù)
基本用法:
1.打印數(shù)組內(nèi)容
代碼示例:
public class TestDemo {
public static void printArray(int[] arr){
for(int x:arr){
System.out.print(x+" ");
}
}
public static void main(String[] args) {
int[] arr = {2,3,4,5,6};
printArray(arr);
}
}
2.求數(shù)組元素的和
public class TestDemo {
public static int sum(int []arr) {
int sum = 0;//一定要初始化為0,不然是隨機(jī)值
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
}
return sum;
}
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
int ret = sum(arr);
System.out.println(ret);
}
}
3.數(shù)組每個(gè)元素乘2輸出
public class TestDemo {
public static void multiplication(int[] arr){
for(int i = 0 ;i < arr.length;i++){
arr[i]=arr[i]*2;
}
}
public static void printArray(int[] arr){
for(int x:arr){
System.out.print(x+" ");
}
}
public static void main(String[] args) {
int [] arr = {1,2,3,4};
System.out.println("乘2前:");
printArray(arr);
System.out.println();
System.out.println("乘2后:");
multiplication(arr);
printArray(arr);
}
}
六.數(shù)組相關(guān)方法Arrays
Arrays是操作Java數(shù)組的工具類。
如果要對(duì)數(shù)組做什么事情,可以通過它來做,當(dāng)然,有些事情是它做不了的,但是只要它能做到,我們調(diào)用它就OK。
1.數(shù)組轉(zhuǎn)字符串:使用Arrays.toString();
import java.util.Arrays;
public class TestDemo {
public static void main(String[] args) {
int[] arr= {1,2,3,4,5,6};
String arr1 = Arrays.toString(arr);
System.out.println(arr1);
}
}
這個(gè)方法打印出來是以字符串形式打印,把我們要打印的數(shù)組,放到toString里面,那么就會(huì)幫我們把當(dāng)前數(shù)組,轉(zhuǎn)變?yōu)樽址M(jìn)行輸出
2.數(shù)組拷貝
如何將數(shù)組拷貝?最直觀的方法是創(chuàng)建一個(gè)與當(dāng)前數(shù)組大小相同,類型相同的數(shù)組,使用循環(huán)一個(gè)一個(gè)賦值。但Java中存在一些方法可以直接拷貝。
使用Arrays.copyOf(數(shù)組名,數(shù)組的長度);
import java.util.Arrays;
public class TestDemo {
public static void main(String[] args) {
int[] arr1 ={1,2,3,4,5,6};
int[] arr2 = Arrays.copyOf(arr1,arr1.length);
System.out.println("拷貝的數(shù)組元素為:"+Arrays.toString(arr2));
}
}
范圍拷貝使用Arrays.copyOfRange(數(shù)組名,從開始下標(biāo),到結(jié)束下標(biāo))
import java.util.Arrays;
public class TestDemo {
public static void main(String[] args) {
int[] arr1 = {1,2,3,4,5,6};
int[] arr2 = Arrays.copyOfRange(arr1,1,3);
System.out.println("范圍拷貝的數(shù)組內(nèi)容為:"+Arrays.toString(arr2));
}
}
注意:copyOfRange函數(shù)中,數(shù)組元素依然是從下標(biāo)為0開始,且最后一個(gè)參數(shù)是取不到的,也就是說是取[1,3)左閉右開的元素。
3.數(shù)組排序
如果你學(xué)過C++,那么一定會(huì)對(duì)sort函數(shù)很熟悉,C++中sort函數(shù)使用代碼示例如下
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100;
int main()
{
int arr[N];
int n = 0;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> arr[i];
}
sort(arr,arr+n);
for (int i = 0; i < n; i++)
{
cout << arr[i] << ' ';
}
return 0;
}
而Java中也存在這樣的函數(shù):Arrays.sort
import java.util.Arrays;
public class TestDemo {
public static void main(String[] args) {
int[] arr = {5,4,3,2,1};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
}
}
我們可以看到,sort函數(shù)均是以升序排列。
4.數(shù)組查找
①.順序查找:
public class TestDemo {
public static int find(int[] arr,int x){
for(int i = 0;i<arr.length;i++){
if(arr[i]==x) return i;
}
return -1;//表示沒有找到
}
public static void main(String[] args) {
int [] arr = {1,2,3,4,5};
System.out.println(find(arr,10));
}
}
②.二分查找
手動(dòng)實(shí)現(xiàn):
public class TestDemo {
public static int binarySearch(int [] arr,int x){
int left = 0;
int right = arr.length-1;
while(left<=right){
int mid = left+right>>1;
if(x<arr[mid]){
//表示在左邊
right=mid-1;
}
else if(x>arr[mid]){
//表示在右邊
left = mid + 1;
}
else {
//相等說明找到
return mid;
}
}
return -1;//循環(huán)結(jié)束,說明沒找到;
}
public static void main(String[] args) {
int [] arr = {1,2,3,4,5};
System.out.println(binarySearch(arr,4));
}
}
但Java中 這個(gè)方法以及被封裝好了 我們可以使用Arrays.binarySearch(數(shù)組名,要找的元素);來實(shí)現(xiàn)
import java.util.Arrays;
public class TestDemo {
public static void main(String[] args) {
int [] arr = {1,2,3,4,5};
System.out.println(Arrays.binarySearch(arr,4));
}
}
以上就是關(guān)于 Java 編程語言基礎(chǔ)中的數(shù)組知識(shí)點(diǎn)詳細(xì)總結(jié)的全部內(nèi)容,想要了解更多相關(guān) Java 數(shù)組詳細(xì)應(yīng)用的內(nèi)容請搜索W3Cschool以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持我們!