<Java SE> 数组详解大全(附带练习题).一维数组、二维数组、数组拷贝、数组遍历...

简介: <Java SE> 数组详解大全(附带练习题).一维数组、二维数组、数组拷贝、数组遍历

一.一维数组


1.定义数组的三种方式

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

array是一个引用变量,创建在栈上,存放的是堆上的一个地址

如果没有初始化,默认值是0

boolean类型的默认值是false

2.遍历数组的三种方法

1.下标遍历

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

2.for each 遍历(加强for循环)

public class TestDemo {
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5};
        for (int x:array){
            System.out.print(x+" ");
        }
    }
}

3.Array.toString遍历(需要导包,输出自动补中括号)

public class TestDemo {
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5};
        String ret = Arrays.toString(array);
        System.out.println(ret);
    }
}

三种输出结果

3.数组是引用类型

1.引用指向(引用)一个对象的内存分布

4.array1=array2

其意思就是把array2的值赋给array1,因为array2的值是其指向的地址,所以array1现在的值变成了array2所指向的地址,则array1与array2共同指向这一块地址。

当没有人引用array1这个对象时,其就会被JVM的垃圾回收器回收了。

5.思考题

下面这段代码会输出什么??

public class TestDemo {
    public static void fuc1(int[]array){
        array = new int[]{1,2,3};
    }
    public static void fuc2(int[]array){
        array[0]=99;
    }
    public static void main(String[] args) {
        int[] array={5,6,7};
        fuc1(array);
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i]+" ");
        }
        System.out.println();
 
        fuc2(array);
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i]+" ");
        }
        System.out.println();
    }
}

6.数组作为返回值

public class TestDemo {
    public static int[] test(){
        int[] array = {1,2,3,4,5,6};
        return array;
    }
    public static void main(String[] args) {
        int[] ret = test();
        System.out.println(Arrays.toString(ret));
    }
}

虽然test3的栈帧销毁了,但此时tmp引用的对象不被销毁,因为ret对他引用了,只要对象有被引用,就不会被销毁。

7.实现数组转字符串函数

    public static String my_toString(int[] array){
        String ret = "[";
        for (int i = 0; i < array.length; i++) {
            ret +=array[i];
            if(i==array.length - 1)
                break;
            ret +=",";
        }
        ret+="]";
        return ret;
    }

8.数组拷贝的三种方式

1.for

    public static void main(String[] args) {
        int[] array = {1,2,3,4,5,6};
        int[] copy = new int[array.length];
        for (int i = 0; i < array.length; i++) {
            copy[i] = array[i];
        }
        System.out.println(Arrays.toString(copy));
    }

2.copyOf

    public static void main(String[] args) {
        int[] array = {1,2,3,4,5,6};
        int[] copy = Arrays.copyOf(array,6);
        System.out.println(Arrays.toString(copy));
    }

3.copyOfRange

    public static void main(String[] args) {
        int[] array = {1,2,3,4,5,6};
        int[] copy = Arrays.copyOfRange(array,0,6);//左闭右开
        System.out.println(Arrays.toString(copy));
    }

4.arraycopy

    public static void main(String[] args) {
        int[] array = {1,2,3,4,5,6};
        int[] copy = new int[5];
        System.arraycopy(array,0,copy,0,5);
        System.out.println(Arrays.toString(copy));
    }

这五个参数的含义

a.你要拷贝的数组

b.你要从这个数组的那个下标开始拷贝

c.你要拷贝到哪个数组

d.你要拷贝这个数组到哪个位置开始

e.你要拷贝多大

5.clone

    public static void main(String[] args) {
        int[] array = {1,2,3,4,5,6};
        int[] copy = array.clone();
        System.out.println(Arrays.toString(copy));
    }

9.二分查找

   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){
                return mid;
            }else if(array[mid]>key){
                right = mid - 1;
            }else {
                left = mid + 1;
            }
        }
        return -1;
    }

10.冒泡排序

    public static void bubbleSort(int[] array){
        boolean flag = true;
        for (int i = 0; i < array.length - 1; i++) {
            for (int j = 0; j < array.length - 1 - i; j++) {
                if (array[j] > array[j + 1]) {
                    int tmp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = tmp;
                    flag = false;
                }
            }
        }
        if(flag){
            return;
        }
    }

二.二维数组


1.二维数组的创建

    public static void main(String[] args) {
        int[][] array1 = {{1,2,3},{4,5,6}};
        int[][] array2 = new int[][]{{1,2,3},{4,5,6}};
        int[][] array3 = new int[2][3];
    }

2.打印二维数组的三种方式

1.for

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

2.for each

        for(int[]tmp:array){
            for(int x:tmp){
                System.out.println(x+" ");
            }
        }

3.deepToString

System.out.println(Arrays.deepToString(array));

3.不规则数组

    public static int[] test(){
        int[] array = {1,2,3,4,5,6};
        return array;
    }


目录
相关文章
|
1月前
|
存储 Java
【编程基础知识】 分析学生成绩:用Java二维数组存储与输出
本文介绍如何使用Java二维数组存储和处理多个学生的各科成绩,包括成绩的输入、存储及格式化输出,适合初学者实践Java基础知识。
67 1
|
10天前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
21天前
|
Java 程序员 编译器
Java|如何正确地在遍历 List 时删除元素
从源码分析如何正确地在遍历 List 时删除元素。为什么有的写法会导致异常,而另一些不会。
18 3
|
22天前
|
存储 缓存 算法
Java 数组
【10月更文挑战第19天】Java 数组是一种非常实用的数据结构,它为我们提供了一种简单而有效的方式来存储和管理数据。通过合理地使用数组,我们能够提高程序的运行效率和代码的可读性。更加深入地了解和掌握 Java 数组的特性和应用,为我们的编程之旅增添更多的精彩。
31 4
|
22天前
|
存储 缓存 算法
提高 Java 数组性能的方法
【10月更文挑战第19天】深入探讨了提高 Java 数组性能的多种方法。通过合理运用这些策略,我们可以在处理数组时获得更好的性能表现,提升程序的运行效率。
19 2
|
1月前
|
存储 Java
Java“(array) <X> Not Initialized” (数组未初始化)错误解决
在Java中,遇到“(array) &lt;X&gt; Not Initialized”(数组未初始化)错误时,表示数组变量已被声明但尚未初始化。解决方法是在使用数组之前,通过指定数组的大小和类型来初始化数组,例如:`int[] arr = new int[5];` 或 `String[] strArr = new String[10];`。
|
1月前
|
前端开发 小程序 Java
java基础:map遍历使用;java使用 Patten 和Matches 进行正则匹配;后端传到前端展示图片三种情况,并保存到手机
这篇文章介绍了Java中Map的遍历方法、使用Pattern和matches进行正则表达式匹配,以及后端向前端传输图片并保存到手机的三种情况。
19 1
|
1月前
|
存储 算法 Java
带你学习java的数组军队列
带你学习java的数组军队列
34 0
|
8天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
4天前
|
安全 Java 开发者
深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
22 9