Java基础之数组详解

作者:听风无涯JixT 时间:2021-08-06 08:15:28 

前言

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

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


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基础之数组详解

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

我们由此得出一个结论:在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]+" ");
       }
   }
}

Java基础之数组详解

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

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

Java基础之数组详解

执行结果一致。

那么我们什么时候使用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);
   }
}

Java基础之数组详解

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

Java基础之数组详解

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

Java基础之数组详解

六.数组相关方法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);
   }
}

Java基础之数组详解

这个方法打印出来是以字符串形式打印,把我们要打印的数组,放到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));
   }
}

Java基础之数组详解

范围拷贝使用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));
   }
}

Java基础之数组详解

注意: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基础之数组详解

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

Java基础之数组详解

我们可以看到,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));
   }
}

Java基础之数组详解

②.二分查找

手动实现:


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基础之数组详解

但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基础之数组详解

来源:https://blog.csdn.net/JixTlhh/article/details/115704835

标签:java,数组,用法
0
投稿

猜你喜欢

  • IDEA 2022 中的Lombok 使用基础教程

    2023-04-09 21:57:09
  • java guava主要功能介绍及使用心得总结

    2023-07-30 11:01:54
  • c#中@的3种作用

    2022-03-23 17:18:07
  • C#如何对多线程、多任务管理(demo)

    2023-05-19 06:00:21
  • Java HtmlEmail 邮件发送的简单实现代码

    2023-04-14 21:29:25
  • java中for和forEach的速度比较实例Demo

    2022-06-20 07:09:58
  • spring boot 注入 property的三种方式(推荐)

    2023-01-23 05:10:27
  • java实现国产sm4加密算法

    2022-02-14 06:27:08
  • C#获取web.config配置文件内容的方法

    2023-12-24 12:22:27
  • Android中利用xml文件布局修改Helloworld程序

    2023-10-24 08:45:05
  • 解决SpringCloud下spring-boot-maven-plugin插件的打包问题

    2022-03-10 14:35:59
  • Spring Cloud Alibaba 本地调试介绍及方案设计

    2023-05-26 21:24:26
  • C#泛型的使用案例

    2023-10-01 23:24:00
  • springboot整合quartz项目使用案例

    2023-02-13 19:57:12
  • 在IntelliJ IDEA中使用gulp的方法步骤(图文)

    2022-10-12 06:29:08
  • SpringCloud Eureka搭建的方法步骤

    2021-10-10 11:03:29
  • Jetpack Compose实现列表和动画效果详解

    2022-07-16 21:14:44
  • 解决IDEA springboot"spring-boot-maven-plugin"报红问题

    2023-08-15 21:29:19
  • C#读取文本文件到listbox组件的方法

    2022-11-18 02:54:05
  • java中的各种修饰符作用及范围

    2022-02-10 01:03:54
  • asp之家 软件编程 m.aspxhome.com