Java的引用类型之数组


前言

有关于数组的知识点。


提示:以下是本篇文章正文内容,下面案例可供参考

一、数组

1、数组是一组相同类型数据的集合。

String[] arr = {"abc", "aer"};//{相同类型}
double[] arr2 = {1.2, 2.1, 3.5};
int[] arr3 = {1, 2, 3};```

2、数组的定义方式:

int[] array = {2,3,4,5};
int[] array2 = new int[10];
int[] array3 = new int[]{1,2,3,4};

3、初始化数组

int[] array = null;
//System.out.println(array.length);//会报空指针异常错误

二、数组的功能

1.输出方式

主要三种方式:
(1)for循环;
(2)foreach;
(3)toString()方法,将数组转换为字符串后输出。
代码如下(示例):

int[] array = {2,3,4,5};
int[] array2 = new int[10];
int[] array3 = new int[]{1,2,3,4};

for (int i = 0; i < array.length; i++) {
    System.out.print(array[i]+" ");
}
System.out.println();
for (int x: array) {
    System.out.print(x+" ");
}
System.out.println();
System.out.println(Arrays.toString(array));

2.排序与查找

(1)封装好的方法:

Arrays.sort(array);

(2)自己实现冒泡排序(示例):

public static void bubbleSort(int[] arr) {
        for (int i = 0; i < arr.length-1; i++) {
            boolean flag = false;//标记是否需要排序
            for (int j = 0; j < arr.length-1-i; j++) {
                if(arr[j]>arr[j+1]) {
                    int tmp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = tmp;
                    flag = true;
                }
            }
            if(flag == false) {
                return;
            }
        }
    }

(3)封装好的方法:

int ret = Arrays.binarySearch(array4, 3);

(4)自己实现二分查找(示例):

public static int binarySearch(int[] arr,int target) {
        int left = 0;
        int right = arr.length-1;
        int mid = (left+right)/2;
        while (left<=right) {
            if(arr[mid] == target) {
                return mid;
            }else if(arr[mid] > target) {
                right = mid-1;
            }else {
                left = mid+1;
            }
            mid = (left+right)/2;
        }
        return -1;//没找到
    }

3.拷贝

拷贝的方式:
1.Arrays.copyOf(int[] original,int newLength);

int[] copy = Arrays.copyOf(array,array.length);
System.out.println(Arrays.toString(copy));

2.arraycopy(Object src, int srcPos,Object dest,
int destPos,int length);

int[] copy2 = new int[array.length];
System.arraycopy(array,0,copy2,0,array.length);
System.out.println(Arrays.toString(copy2));

3.实现copyOf

代码如下(示例):

public static int[] copyOf(int[] arr) {
        if(arr == null) {
            return null;
        }
        int[] tmp = new int[arr.length];
        for (int i = 0; i < arr.length; i++) {
            tmp[i] = arr[i];
        }
        return tmp;
    }

深拷贝:改变拷贝后数组中的值不会改变原数组中的值。
JVM内存划分:
https://editor.youkuaiyun.com/md/?articleId=124622933


### Java引用类型数组与基本数据类型数组的区别 #### 定义与声明 在Java中,基本数据类型和引用数据类型的数组有着不同的特性和行为。对于基本数据类型数组而言,其元素直接保存数值;而对于引用类型数组,则是存储指向对象的引用。 ```java // 基本数据类型数组 int[] basicArray = new int[5]; // 引用类型数组 String[] referenceArray = new String[5]; ``` 当创建一个基本数据类型数组时,实际上是在内存中分配了一块连续的空间用于存放具体的值[^1]。而引用类型数组则会为每一个位置预留空间用来放置对象实例的地址或引用[^2]。 #### 参数传递差异 考虑函数调用过程中参数传递的情况: - **基本数据类型** 当把基本数据类型作为方法参数传递给另一个方法时,实际上传递的是该变量的一个副本而不是原始变量本身。因此,在被调用的方法内部对该参数所做的任何修改都不会影响到原变量。 - **引用数据类型** 对于引用类型来说,情况有所不同。如果将引用类型数组作为参数传递给某个方法,那么这个方法接收到的就是原来那个数组对象的引用。这意味着在这个方法内对数组内容做出的变化会影响到原来的数组对象。 ```java public class ArrayPassingExample { public static void changeBasicTypeValue(int value){ value += 10; System.out.println("Inside method, changed value is:" + value); } public static void changeReferenceTypeValue(Integer[] array){ array[0] = 999; System.out.println("Inside method, first element of the array has been set to: " + array[0]); } } ``` 上述例子展示了两种不同类型的数据如何通过方法调用受到影响的不同方式。`changeBasicTypeValue()` 方法不会改变外部 `value` 的值,但是 `changeReferenceTypeValue()` 可以更改传入整数数组的第一个元素并反映在外层作用域中。 #### 使用场景分析 选择使用哪种类型的数组取决于具体的应用需求和技术考量: - 如果只需要简单地存储一系列相同类型的数值,并且不需要复杂的功能(比如动态调整大小),那么基本数据类型数组可能是更好的选择因为它更加轻量级。 - 若涉及到更为复杂的逻辑运算或是需要利用面向对象特性的地方——例如要管理多个字符串或其他自定义的对象集合——此时应该优先选用引用类型数组[^3]。 此外,考虑到性能因素以及垃圾回收机制的影响,合理规划这两种类型之间的转换也是非常必要的。特别是要注意自动拆箱/装箱可能带来的潜在风险,即从包装器类向基础类型转变的过程中可能出现空指针异常等问题[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值