Java数组的定义与使用

目录

1 数组的基本用法

1.1数组是什么

1.2创建数组

 1.3数组的使用

 2 数组作为方法的参数

2.1基本用法

2.2引用的理解

 2.3认识null

2.4认识JVM内存区域划分

3数组作为方法的返回值

 4 数组练习

4.1数组转字符串

4.2查找数组中的指定元素(二分查找)


1 数组的基本用法

1.1数组是什么

数组是用一段连续的空间来储存一些相同类型的数据。

数组中的每一个数据都有自己的唯一下标,这个下标也是访问这个元素的标识。下标是从0开始的

例如数组中有5个数,它里面的数据于数据所对应分下标如图

 

例如:

1,2,3,4,5,6,7就可以用一个数组来存储

1.2创建数组

基本语法:

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

数据的类型[]数组名称=new 数据类型[要存放的数据的个数]{初始化数据};

示例代码:

int[]array1={1,2,3,4,5};
int[]array2=new int[5]={1,2,3,4,5};

 1.3数组的使用

数组的基本的使用有两个,1是或去数组的长度,2是访问数组的每一个元素

示例代码:

 public static void main(String[] args) {
        int[]array={1,2,3,4,5};
        //获取数组的长度
        int len=array.length;
        System.out.println(len);
        //通过数组的下标访问数组
        System.out.println(array[0]);
    }

 注意事项

1. 使用 arr.length 能够获取到数组的长度 . . 这个操作为成员访问操作符 . 后面在面向对象中会经常用到 .
2. 使用 [ ] 按下标取数组元素 . 需要注意 , 下标从 0 开始计数
3. 使用 [ ] 操作既能读取数据 , 也能修改数据 .
4. 下标访问操作不能超出有效范围 [0, length - 1] , 如果超出有效范围 , 会出现下标越界异常.
数组使用示例代码:数组的遍历
public static void main(String[] args) {
        int[]array={1,2,3,4,5};
        //for循环遍历
     for(int i=0;i<array.length;i++){
         System.out.print(array[i]+" ");
     }
        System.out.println();
     //foreach遍历数组,
        for (int x:
             array) {
            System.out.print(x);
        }
        System.out.println();
    }

 2 数组作为方法的参数

2.1基本用法

示例代码:数组的遍历

 public static void playArray(int[]array){
        for (int i = 0; i <array.length ; i++) {
            System.out.print(array[i]+" ");
        }
        System.out.println();
    }
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};
        playArray(arr);

    }

 在这个代码中arr是实参,array是形参,array.legth也可以获取数组的长度

2.2引用的理解

首先我们来看下面的代码:

 public static void change(int num){
        num=20;
        System.out.println("num="+num);
    }
    public static void main(String[] args) {
        int a=10;
        change(a);
        System.out.println("a="+a);
    }

很明显我们想要通过方法去改变a是做不到的,因为num是a的拷贝而已,它们只是值相同而已

那么我们如果就要对某个空间上数据通过方法进行修改要怎么做呢?

这里就引入了引用的概念

引用:引用也是一种变量,不过它储存的是一个对象的地址(对象的概念在以后讨论)。

下面我们来看一段代码

 public static void change(int[]array){
        for(int i=0;i<array.length;i++){
            array[i]*=2;
        }
    }
    public static void main(String[] args) {
       int arr[]={1,2,3,4,5};
       change(arr);
       playArray(arr);
    }

 

我们可以看到数组中的数据被改变了,这到底是为什么呢,下面我们来讨论这个问题。

首先,我要告诉大家数组是一个引用类型,数组名就是这个引用类型的变量名,这个变量里面存放这数组中元素的地址。那么array对arr的一份拷贝,也就是说array中也存放这相同的地址,所有通过地址就可以改变地址所对应空间的值。

如图:

 2.3认识null

null Java 中表示 " 空引用 " , 也就是一个无效的引用 .
null 的作用类似于 C 语言中的 NULL ( 空指针 ), 都是表示一个无效的内存位置 . 因此不能对这个内存进行任何读写操
. 一旦尝试读写 , 就会抛出 NullPointerException.
注意: Java 中并没有约定 null 0 号地址的内存有任何关联.

2.4认识JVM内存区域划分

JVM的内寸被划分为了几个不同的区域

程序计数器 (PC Register): 只是一个很小的空间 , 保存下一条执行的指令的地址 .
虚拟机栈 (JVM Stack): 重点是存储 局部变量表 ( 当然也有其他信息 ). 我们刚才创建的 int[] arr 这样的存储地 址的引用就是在这里保存.
本地方法栈 (Native Method Stack): 本地方法栈与虚拟机栈的作用类似 . 只不过保存的内容是 Native 方法的局 部变量. 在有些版本的 JVM 实现中 ( 例如 HotSpot), 本地方法栈和虚拟机栈是一起的 .
(Heap): JVM 所管理的最大内存区域 . 使用 new 创建的对象都是在堆上保存 ( 例如前面的 new int[]{1, 2, 3} )
方法区 (Method Area): 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数
. 方法编译出的的字节码就是保存在这个区域 .
运行时常量池 (Runtime Constant Pool): 是方法区的一部分 , 存放字面量 ( 字符串常量 ) 与符号引用 . ( 注意 JDK 1.7 开始 , 运行时常量池在堆上)
Native 方法 :
JVM 是一个基于 C++ 实现的程序 . Java 程序执行过程中 , 本质上也需要调用 C++ 提供的一些函数进行和操
作系统底层进行一些交互 . 因此在 Java 开发中也会调用到一些 C++ 实现的函数 .
这里的 Native 方法就是指这些 C++ 实现的 , 再由 Java 来调用的函数

3数组作为方法的返回值

示例代码:将一个数组中的每一个元素扩大2倍并返回

public static  int[]toDouble(int[]array){
    int[]returnArray=new int[array.length];
        for (int i = 0; i <array.length ; i++) {
            returnArray[i]=array[i];
        }
        return returnArray;
    }   
public static void main(String[] args) {
       int arr[]={1,2,3,4,5};
       playArray(toDouble(arr));
    }

 4 数组练习

4.1数组转字符串

代码:

 /**
     * 数组转字符串
     * @param array 要转换的数组
     * @return 转换好的字符串
     */
    public static String toString(int[]array){
        String str="[";
        for(int i=0;i<array.length;i++){
            str+=array[i];
            if(i<array.length-1){
                str+=",";
            }
        }
        str+="]";
        return str;
    }
 public static void main(String[] args) {
       int arr[]={1,2,3,4,5};
        System.out.println(toString(arr));
    }

4.2查找数组中的指定元素(二分查找)

针对 有序数组 , 可以使用更高效的二分查找 .
啥叫有序数组 ?
有序分为 " 升序 " " 降序 "
1 2 3 4 , 依次递增即为升序 .
4 3 2 1 , 依次递减即为降序 .
以升序数组为例 , 二分查找的思路是先取中间位置的元素 , 看要找的值比中间元素大还是小 . 如果小 , 就去左边找 ; 否则去右边找
代码:
 /**
     * 二分查找
     * @param array 待查找的数组
     * @param key 要查找的数
     * @return 如果找的返回要查找的数的下标,如果找不到返回错误信息
     */ 
public static int binarySearch(int[]array,int key){
        int left=0;
        int right=array.length-1;
        while(left<=right){
            int mid=(left+right)/2;
            if(array[mid]>key){
                right=mid-1;
            }else if(array[mid]<key){
                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,2));
    }

 

 

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值