JavaSE系列批量处理数据神器——Java数组与引用

Posted 未见花闻

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaSE系列批量处理数据神器——Java数组与引用相关的知识,希望对你有一定的参考价值。

⭐️前面的话⭐️

本篇文章带大家认识Java数组使用以及引用,我们都知道数组中的元素类型都是相同的,这使它具有强大的相同数据类型处理能力,由此可知它有多么的重要。Java使用数组与C语言还是存在差别的,从数组定义方式就能看出来,让我们来一探究竟吧。

📒博客主页:未见花闻的博客主页
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📌本文由未见花闻原创,CSDN首发!
📆首发时间:🌴2021年10月30日🌴
✉️坚持和努力一定能换来诗与远方!
💭参考书籍:📚《Java核心技术卷1》,📚《Java核心技术卷2》,📚《Java编程思想》
💬参考在线编程网站:🌐牛客网🌐力扣
🙏作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!
博主的码云gitee,平常博主写的程序代码都在里面。




🎨1.Java数组的基本用法

🎳1.1数组的定义方式

🍁方式1:
数 据 类 型 [ ]   变 量 名   =   { 元 素 1 , 元 素 2 , 元 素 3 , . . . , 元 素 n } ; 数据类型[]\\ 变量名\\ =\\ \\{元素1,元素2,元素3,...,元素n\\}; []  = {1,2,3,...,n};
i n t [ ]   a r r   =   { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 } ; int[]\\ arr\\ =\\ \\{1,2,3,4,5,6,7,8,9,0\\}; int[] arr = {1,2,3,4,5,6,7,8,9,0};

🍁方式2:
数 据 类 型 [ ]   变 量 名   =   n e w   i n t [ ] { 元 素 1 , 元 素 2 , 元 素 3 , . . . , 元 素 n } ; 数据类型[]\\ 变量名\\ =\\ new\\ int[]\\{元素1,元素2,元素3,...,元素n\\}; []  = new int[]{1,2,3,...,n};
i n t [ ]   a r r   =   n e w   i n t [ ] { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 } ; int[]\\ arr\\ =\\ new\\ int[]\\{1,2,3,4,5,6,7,8,9,0\\}; int[] arr = new int[]{1,2,3,4,5,6,7,8,9,0};
❗️new后面那个中括号里面不能指定元素个数,必须是空的!

🍁方式3:
数 据 类 型 [ ]   变 量 名   =   n e w   i n t [ 元 素 个 数 ] ;   ( 数 组 全 部 元 素 会 初 始 化 为 0 ) 数据类型[]\\ 变量名\\ =\\ new\\ int[元素个数];\\ (数组全部元素会初始化为0) []  = new int[]; (0)

🎳1.2数组的创建与使用

🍁数组的创建:

int[] data1 = {1,2,3,4,5,6,7,8,9,0};
int[] data2 = new int[]{1,2,3,4,5,6,7,8,9,0};
int[] data3 = new int[10];

🍁数组的使用:

import java.util.Arrays;

public class TestBlog {
    public static void main(String[] args) {
        //创建数组
        int[] arr = new int[]{1,2,3,4,5,6,7,8,9,0};
        //访问数组长度
        System.out.println(arr.length);
        //访问数组元素
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
        //遍历数组 1.for循环   2.foreach循环   3.toString函数

        //方式1:for循环
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "  ");
        }
        System.out.println();
        //方式2:foreach循环
        for (int a: arr) {
            System.out.print(a + "  ");
        }
        System.out.println();
        //方式3:toString函数
        System.out.println(Arrays.toString(arr));
    }
}

对于数组遍历方式2:

for (接受变量: 数组) {
	//语句块;
	//此方法不能获取下标
}

对于遍历方式3:
toString是JavaArrays类中的一个方法,能够将数组转换成字符串,有,隔开元素,中括号[]包裹数组所有元素!

🎨2.Java类型之引用

🎳2.1引用类型

在Java当中数组其实是一个对象,我们知道在数组定义时有两种方式都用到了关键字new,这个关键字就是实现类的实例化,实例出一个对象,使用一个能接收“实例化对象的值”的类型就是引用类型。这个“实例化对象的值”其实是一个地址,该地址指向该数组(对象),比如下面定义的x变量定义一个数组,这个x就是引用变量。这个与C语言中的指针有一点相似,但是它并不是指针,引用变量是一个值,在这里,该值是这个数组的地址。我们知道我们所定义的x变量是局部变量所以它在栈上生成,而这个数组(对象)是在堆上开辟内存的。
null表示空引用,与C语言中的NULL很相似,表示一个无效的内存位置,既然这个内存是无效的,那肯定就不能对这个内存指向的空间进行读写。注意: Java 中并没有约定 null0 号地址的内存有任何关联.

数据类型[] 变量名 = new int[元素个数]; (数组全部元素会初始化为0)
int[] x = new int[3];
x[0] = 10;
x[1] = 20;
x[2] = 30;

所谓的 “引用” 本质上只是存了一个地址. Java 将数组设定成引用类型, 这样的话后续进行数组参数传参, 其实只是将数组的地址传入到函数形参中. 这样可以避免对整个数组的拷贝(数组可能比较长, 那么拷贝开销就会很大)
下面用一个数组传参的例子来进一步理解引用。

🎳2.2数组传参

public class TestBolg {
    public static void arrFunc(int[] arr) {
        if (arr == null) {
            return;
        }
        for (int i = 0; i < arr.length; i++) {
            arr[i] = 10 * (i+1);
        }
    }
    public static void main(String[] args) {
        int[] x = new int[3];
        arrFunc(x);
        System.out.println(Arrays.toString(x));
    }
}


对于数组的传参就是将一引用变量的值传递给方法的形参,由于引用变量存的是对象的地址,所以方法会根据传入的参数对数组(实例化的对象)进行修改或读写操作,从而使数组内元素的值发生改变,这就是引用传递。

🎳2.3认识JVM区域划分

🎨3.Java数组应用

🎳3.1利用数组求平均值与交换两个数

public class AvgSwap {
    public static void swap(int[] data) {
        int tmp = data[0];
        data[0] = data[1];
        data[1] = tmp;
    }
    public static double avg(int[] data) {
        int sum = 0;
        for (int i = 0; i < data.length; i++) {
            sum += data[i];
        }
        return 1.0 * sum / data.length;
    }

    public static void main(String[] args) {
        int[] swap = {22, 33};
        int[] avg = {1,2,3,4,5,6,7,8,9,0};
        System.out.println("数据交换前:a = " + swap[0] + ", b = " + swap[1]);
        swap(swap);
        System.out.println("数据交换后:a = " + swap[0] + ", b = " + swap[1]);
        System.out.println("数组平均值为:" + avg(avg));
    }
}

🎳3.2拷贝数组

import java.util.Arrays;

public class Copy {
    public static int[] copy(int[] arr) {
        if (arr == null) {
            return null;
        }
        int[] copy = new int[arr.length];//新建一个数组
        for (int i = 0; i < arr.length; i++) {
            copy[i] = arr[i];//遍历拷贝
        }
        return copy;
    }
    public static void main(String[] args) {
        int[] arr1 = {1,2,3,4,5,6,7,8,9};
        System.out.println("数组1:");
        System.out.println(Arrays.toString(arr1));
        int[] arr2 = copy(arr1);
        System.out.println("数组2:");
        System.out.println(Arrays.toString(arr2));
    }
}

当然Java中的Arrays类有内置的拷贝方法:
s t a t i c   数 据 类 型 [ ]   c o p y O f ( 数 据 类 型 [ ]   o r i g i n a l ,   i n t   n e w L e n g t h ) static\\ 数据类型[]\\ copyOf(数据类型[]\\ original,\\ int\\ newLength) static [] copyOf([] original, int newLength)
复制指定的数组,用零截取或填充(如有必要),以便复制具有指定的长度。

s t a t i c   数 据 类 型 [ ]   c o p y O f R a n g e ( 数 据 类 型 [ ]   o r i g i n a l ,   i n t   f r o m ,   i n t   t o ) static\\ 数据类型[]\\ copyOfRange(数据类型[]\\ original,\\ int\\ from,\\ int\\ to) static [] copyOfRange([] original, int from, int to)
将指定数组的指定范围[from, to)复制到新数组中。

以上是关于JavaSE系列批量处理数据神器——Java数组与引用的主要内容,如果未能解决你的问题,请参考以下文章

JavaSE系列Java异常处理机制

大数据批量处理神器 - 自定义周期批量消费队列的实现

#yyds干货盘点#JavaSE系列Java程序设计基础——数据类型变量与运算符

Java全栈JavaSE:17.基础API与常见算法

#yyds干货盘点#JavaSE系列Java程序的选择与轮回——分支结构与循环结构

《Java从入门到放弃》JavaSE篇:综合练习——单身狗租赁系统(数组版)