数组 妙用 —— Java篇

本文详细介绍了Java中的数组概念,包括数组的两种创建方式、数组的地址表示、数组的null化、遍历及长度获取、扩展for循环的使用,同时强调了数组越界访问的注意事项,并展示了如何通过数组引用传递值进行数值交换。此外,还讨论了Java数组与C语言数组在内存分配上的区别,凸显了Java的安全特性。
摘要由CSDN通过智能技术生成

数组 —— Java篇


数组的概念:

  • 数组就是一种存储多个数据的容器,数组中的每一个元素类型需要保持一致性,

  • 数组本身是也是一种引用类型,引用类型存放数组的首地址,与C语言中的指针相似,存放地址。

  • 数组是元素是在堆区存放的,与C语言不同,C语言是在栈区上开辟空间的


数组的创建

数组的创建有两种方式:

//数组的类型[] 数组名 = new 数组类型[]{元素1,元素2,元素3};
  int[] arr = new int[]{...}; // 动态初始化

  int[] arr = {...};
// 数组的类型[] 数组名 = {元素1,元素2,元素3};静态初始化

  • 它们在一定的程度上是没有什么区别的

public class Study05 {
 /*数组的声明,定义*/
    public static void main1 (String[] args) {
        int[] arr ={1,2,3};
        int[] arr1 = new int[]{4,5,6};
        int[] arr2 = new int[3];
//        new 实例化一个对象
//        int[] 引用类型 ——> 与C语言中的指针类似,arr ,arr1,arr2 存放地址;
//        int[] arr,arr,arr2 是在内存栈上的开辟占用空间,存放数据的(指向后面堆区开辟的首地址)
//        而后面的 new ... 是在堆区中开辟空间,存放数据的
        /*Java虚拟机栈    Java本地方法栈
        * 堆     方法区          程序计数器  */
    }
}


数组名的地址

  • 在 Java 当中你是取不到,数组真实的地址的,你所取到的地址只是被哈希加密过的一个数值,这一点鲜明的体现了 Java 不同于C语言的安全性。
  • 不过你可以间接的认为是一个地址,因为地址的特点就是唯一性,儿被哈希加密过返回的值,也是具有唯一性的

代码演示:

public class Study05 {
   public static void main (String[] args) {
        int[] array = new int[]{1,2,3,4,5,6};
        System.out.println("array ="+array);
        /*注意 Java 是无法拿到地址的,再次鲜明出Java是一种安全语言
        * Java中的地址是被哈希函数加密了过的,但也是具有唯一性的特征,
        * 所以你可以间接的认为是个地址*/
    }
}


在这里插入图片描述


数组的 null 化

  • null 在 Java 中是表示 ”空引用“,也就是一个无效的引用。
  • null 的作用类型于C语言中的 NULL (空指针),都是表示一个无效的内存位置,因此不能对这个内存进行任何的读写操作,一旦尝试读写,就会抛出 NUllPoninterException


public class Study05 {
    public static void main (String[] args) {
        int[] arr = null;
        System.out.println(arr);
        System.out.println(arr[0]);
    }

在这里插入图片描述


数组的遍历

求数组的长度:

  • 使用 {数组名+length} 可以求出对应数组的长度
代码实例:

public class Study05 {
    public static void main (String[] args) {
        int arr[] = new int[]{1,2,3,4,5,6,7,8,9,10};
        int len = arr.length;
        System.out.println("len ="+len);
    }
}


在这里插入图片描述


数组的遍历

  • 通过访问数组的下标,实现打印数组

代码实例:
public class study05 {
	public static void main3 (String[] args) {
        int[] array = new int[]{1,2,3,4,5,6};
        int len = array.length;  // 求数组的长度;
        for (int i = 0; i < len; i++) {
            System.out.println(array[i]);
        }
    }
}

打印数组:

扩展for 语句:
  • 我们已经学过了,for 循环语句的基本用法,
  • 这里我介绍另外一种 for 的用法,—— 扩展for语句 ( foreach ) ,就可以非常简洁地实现数组的遍历。
  • 我们可以使用 IDEA 的便捷方法:数组名 + for + 回车 ( arr. for ) 回车
  • 废话不多说,上操作

public class Study05 {
	public static void main8 (String[] args) {
        int[] arr = new int[]{1,2,3,4,5,6,7,8,9,10};
        for (int num:arr) { // 这里是 foreach 
            System.out.print(num);
        }
    }
}

  • 上述代码的解析:
    • 在扩展for语句中for (int num : arr ), 冒号{ : }的意思是 ”…中” ,可以将其读作英文的 “in"
    • 括号中的 { num } 表示的是当前正在查看的元素的一个临时寄放,遍历过程中正在查看的元素,所以其定义的类型要与数组元素的类型一致;
    • 使用扩展 foreach 语句的好处如下:
      • 省去了确认数组的长度(元素个数)的操作
      • 可以使用与迭代器相同的方法来执行遍历

注意不要越界访问数组
public class Study05 {
  // 下标越界访问示范
    public static  void main6 (String[] args) {
        int[] arr = new int[]{1,2,3};
        System.out.println(arr[3]); // 下标越界访问了
    }
}

在这里插入图片描述


在这里插入图片描述


数组的传参

  • 数组——> 引用类型——> 地址
  • 引用变量是在栈区上开辟空间的,而后面数组元素是在堆区中开辟空间的

public class Study05{
//    数组引用类型参数
    public static void printArray (int[] arr2) {
        for (int num:arr2) {
            System.out.print(num+"\t");
        }
    }

    public static int[] tranSform(int[] arr3) {
        int[] ret = new int[arr3.length];
        for (int i = 0; i < arr3.length; i++) {
            ret[i] = arr3[i]*2;
        }
        return ret;
    }
    public static void main13 (String[] args) {
        Study05 tranSform = new Study05();
        Study05 printArray = new Study05();
        
        int[] arr1 = new int[]{1,2,3};
        Study05.printArray(arr1);
        System.out.println("\n 变化后的数值");
        int[] output = Study05.tranSform(arr1);
        Study05.printArray(output);
    }
}

上述代码:图解

在这里插入图片描述


通过数组的引用类型(地址)方法交换数值
  • 通过数组传参,而实现方法的交换数值

public class Study05 {
//    通过数组进行数值的交换
    public static void printarray (int[] array) {
        int tmp = array[0];
        array[0] = array[1];
        array[1] = tmp;
    }
    public static void main11 (String[] args) {
        Study05 printarray = new Study05();
        int[] array = new int[]{10,90};
        for (int tmp:array) {
//            System.out.println("为交换前的数值:array[0]="+array[0]+"array[1]"+array[1]);
            System.out.print(tmp);
        }
        System.out.println("\n交换后的数值:");
        Study05.printarray(array);
        for (int tmp:array) {
            System.out.print(tmp);
        }

    }
}

最后:

每博一文案

面对利益的时候,人与人的交往中利益永远是很重要的。

试金石生活中总是会有这样的人,吃饭时指点江山,结账时不见人影,需要帮助好言好语,别人有难时,默不作声,

这样的人看着好卖肉请,其实却是口不对心。

面对利益的时候斤斤计较,连一分钱都要算清你这样的人,交往受伤的总会是自己。

​ —————— 一禅心灵庙语

限于自身水平,其中存在的错误,希望大家给予指教,韩信点兵——多多益善,谢谢大家,后会有期,江湖再见!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值