Java基础之数组详解

前言

我们了解数组这个概念之前,我们先思考下面几个问题。

如果我们需要两个数据,那么直接创建两个变量即可

int a;
int b;

如果需要五个数据,那么可以创建五个变量

int a;
int b;
int c;
int d;
int f;

但如果我们需要100个甚至是1万个数据,那么我们创一万个变量?显然这是不现实的。这个时候就需要我们的数组来起作用!帮我们“批量”创建变量。

由上可以得出:数组的本质就是让我们能“批量”创建相同类型的变量!

一.数组的概念

数组是一种数据结构,用来存储同一类型的集合,也就是说数组包含的变量必须是相同类型!

二.创建数组

基本语法如下:

//动态初始化
数据类型[] 数组名称 = new 数据类型 []{初始化数据};
//静态初始化
数据类型[] 数组名称 = {初始化数据};

代码示例

public class TestDemo {
    public static void main(String[] args) {
        //动态初始化
        //数据类型[] 数组名称 = new 数据类型 []{初始化数据};
        int[] arr1 = new int[]{1,2,3};
        //静态初始化
        //数据类型[] 数组名称 = {初始化数据};
        int[] arr2 ={1,2,3};
    }
}

注意:静态初始化的时候,数组元素的个数和初始化数据的格式是一样的!

如果你学过其他语言,例如C语言,c语言的数组创建是这样的

数据类型 数组名[]={初始化数据};

例如: int arr[] = {1,2,3};

其实Java中也可以做到这样,但是不推荐这么写,Java是一种强类型语言,变量前面就是类型,一目了然!

三.数组的使用

我们看一个例子,如何获取数组的长度?

如果你学过C语言,那么肯定会说

int sz = sizeof(arr) / sizeof(arr[0]);

其实Java比c语言更方便,直接使用“数组名.length”就可以求出来数组的长度。

代码如下:

public class TestDemo {
    public static void main(String[] args) {
         int[] arr ={1,2,3};
         int len = arr.length;
        System.out.println(len);//3
    }
}

毫无疑问这个代码运行结果是3;

那么我们如何访问数组元素呢?

我们来看下面的代码:

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
    }
}

显而易见的是,直接使用数组名[数组元素下标]来访问数组元素。但出现了一个问题,为什么arr[0]是1而arr[1]是2?为什么不是arr[1]是1 arr[2]是2吗?

这里我们得出一个结论,数组的下标是从0开始的,不是从1开始的。

我们来尝试访问一下arr[3]看会出现什么情况.

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]);
    }
}

我们发现前面都和我们预想一样输出结果都正确,但唯独出现了一串红字,这串红字说明存在数组越界。

我们由此得出一个结论:在Java下标访问操作中不能超出有效范围也就是[0,length-1],如果超出有效范围,会抛出下标越界异常。

四.数组的遍历

所谓遍历,是指将数组中的所有元素都访问一遍,不重不漏,需要搭配循环语句!

我们学了数组的访问,那么我们如何遍历数组呢?有两种常用方法 一种是for循环,一种是foreach循环。

for循环示例

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]+" ");
        }
    }
}

我们发现打印出来了数组的元素。

for-each示例

foreach基本使用方法:元素类型 变量:数组名

public class TestDemo {
    public static void main(String[] args) {
        int[] arr = {1,2,3,4,5};
        for(int x:arr){
            System.out.print(x+" ");
        }
    }
}

执行结果一致。

那么我们什么时候使用for循环,什么时候使用foreach循环?

foreach循环适用于不知道循环次数,或者是循环次数很难计算。

for循环适用于知道循环次数,在复杂的循环中效率更高。

如果是在循环中使用增删查改操作,for循环可以实现,因为foreach循环不能实现这些操作。

五.数组作为方法的参数

基本用法:

1.打印数组内容

代码示例:

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.求数组元素的和

public class TestDemo {
    public static int sum(int []arr) {
        int sum = 0;//一定要初始化为0,不然是随机值
        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.数组每个元素乘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);
    }
}

六.数组相关方法Arrays

Arrays是操作Java数组的工具类。

如果要对数组做什么事情,可以通过它来做,当然,有些事情是它做不了的,但是只要它能做到,我们调用它就OK。

1.数组转字符串:使用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);
    }
}

这个方法打印出来是以字符串形式打印,把我们要打印的数组,放到toString里面,那么就会帮我们把当前数组,转变为字符串进行输出

2.数组拷贝

如何将数组拷贝?最直观的方法是创建一个与当前数组大小相同,类型相同的数组,使用循环一个一个赋值。但Java中存在一些方法可以直接拷贝。

使用Arrays.copyOf(数组名,数组的长度);

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("拷贝的数组元素为:"+Arrays.toString(arr2));
    }
}

范围拷贝使用Arrays.copyOfRange(数组名,从开始下标,到结束下标)

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("范围拷贝的数组内容为:"+Arrays.toString(arr2));
    }
}

注意:copyOfRange函数中,数组元素依然是从下标为0开始,且最后一个参数是取不到的,也就是说是取[1,3)左闭右开的元素。

3.数组排序

如果你学过C++,那么一定会对sort函数很熟悉,C++中sort函数使用代码示例如下

#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中也存在这样的函数: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函数均是以升序排列。

4.数组查找

①.顺序查找:

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));
    }
}

②.二分查找

手动实现:

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;//循环结束,说明没找到;
    }
    public static void main(String[] args) {
        int [] arr = {1,2,3,4,5};
        System.out.println(binarySearch(arr,4));
    }
}

但Java中 这个方法以及被封装好了 我们可以使用Arrays.binarySearch(数组名,要找的元素);来实现

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));
    }
}

以上就是Java的数组讲解,感谢观看。

到此这篇关于Java基础之数组详解的文章就介绍到这了,更多相关java数组详解内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 使用java一维数组模拟压栈弹栈

    思路 先进后出,优先解决压栈的问题,之后解决弹栈和main方法 功能 随时模拟压栈 随时模拟弹栈 防止异常和各种错误 随时可以遍历"栈"中存在的变量的方法,压栈弹栈栈帧清晰可见! 使用演示: 压栈: 栈满检测: 遍历栈内存和栈帧: 只要栈中有变量就会输出栈帧: 弹栈: 栈空检测:(没有变量,栈帧不输出!) 源码: import java.util.Scanner; public class MoveTest01 { //局部变量供栈方法的遍历数组使用 static int i; //创

  • Java 自定义动态数组方式

    Java自定义动态数组 1.静态数组向动态数组转变 (1)静态数组,数组空间固定长度 这个数组空间总长为4,如果此时新插入一个数据就会报数组空间不足 (2)静态数组如何转变成动态数组 第一步:创建一个空间是data数组两倍的newData数组(扩容): 第二步:把data数组中的元素全部赋值到newData数组: 2.数组扩容程序 // 数组扩容 private void resize(int newCapacity){ E[] newData = (E[]) new Object[newCap

  • Java循环队列原理与用法详解

    本文实例讲述了Java循环队列原理与用法.分享给大家供大家参考,具体如下: 在正式进行循环队列学习之前,我们先来看看在顺序队列中删除队首元素出现的问题 (1)设一个容量为capacity=8,size=5(a,b,c,d,e)的数组,左侧为队首.右侧为队尾. (2)出队一个元素后,需整体往前移动一位 #出队 #2整体前移一位 关于该种操作方式我们很容易得出时间复杂度为O(n). 这时我们就想可不可以在出队元素后,整体元素不往前移,而是在数组中记下队首front是谁,同时队尾tail指向在下一次元

  • java循环练习的简单代码实例

    ★打印九九乘法表 复制代码 代码如下: public class TestDemo {     public static void main(String[] args){         for(int b=1;b<10;b++){             for(int a=1;a<=b;a++)                 System.out.print(a+"*"+b+"="+a*b+"\t");           

  • Java循环调用多个timer实现定时任务

    通常在使用java实现定时任务时,有两种方法,一种是spring中的schedule(cron = " */5 * * * ?"),另一种就是java中的timer, timer+TimerTask配合实现,这里附上Timer对象的一些常用api Timer() 创建-个新计时器. Timer(boolean isDaemon) 创建一个新计时器, 可以指定其相关的线程作为守护程序运行. Timer(String, name) 创建一个新计时器,其相关的线程具有指定的名称. Timer

  • java 定义长度为0的数组/空数组案例

    如下: int[] array = new int[0]; // 定义一个长度为 0 的数组 / 空数组 Sring[] arr = new String[0]; // 定义一个长度为 0 的数组 / 空数组 长度为 0 的数组 / 空数组 并不是 null 有时数组里可能只有一个空字符串 "",这时数组长度是 1.这种情况也要注意判断. if ( arr.length == 1 && arr[ 0 ].equals( "" ) ) { System

  • Java基础之数组模拟循环队列

    一.队列简介 队列是一个有序列表,遵循"先入先出"的原则,即先存入队列的数据要先取出,后存入的数据后取出. 队列有两种存储表示,顺序表示和链式表示.顺序表示可以用数组来实现. 二.数组模拟队列 用数组模拟队列时,设两个值front=0,rear=0.front表示队列首部第一个数据所在位置,rear表示尾部最后一个数据的下一个位置. 将数据插入数组队列时(入队),从尾部进行插入,即array[rear] = value,同时rear后移,rear++.取出数据时(出队),从头部取出数据

  • java中用数组实现环形队列的示例代码

    本篇文章主要讲述了使用数组实现环形队列的思路以及具体代码 一.队列是什么 我们先来看下百科的解释: 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,队列是一种操作受限制的线性表.进行插入操作的端称为队尾,进行删除操作的端称为队头. 总结起来两点: 1.一种线性表 2.添加操作只能在表尾,删除操作在表头(先进先出) 二.实现队列的思路 1.初始化一个空队列 初始化一个大小固定的数组,并将头指针,尾指针都指向下表为0的位置,但其

  • 几道java循环练习题(适合新人)

    1.求水仙花数 打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数, 其各位数字立方和等于该数本身. 例如:153是一个"水仙花数", 因为153=1的三次方+5的三次方+3的三次方. //第一题,水仙花数 public class demo4 { public static void main(String[] args) { System.out.println("1000以内的数字"); int u=0; for(

  • java二维数组指定不同长度实例方法

    我们知道二维数组,是在一维数组的基础上进行了维度的增加.那么在实际使用的过程中,有时候我们所需要的二维数组,它们其中的维度是不同的,这就需要我们手动的进行设置.下面我们就来一起探究,二维数组在改变维度长度大小的方法,并辅以实例进行代码展示. 1.二维数组的每个元素都是一个一维数组,这些数组不一定都是等长的.声明二维数组的时候可以只指定第一维大小,空缺出第二维大小,之后再指定不同长度的数组.但是注意,第一维大小不能空缺(不能只指定列数不指定行数). public class ArrayTest4

随机推荐