【Java SE】数组题目

本文详细讲解了Java中的数组操作,包括数组转换为字符串,数组拷贝(浅拷贝与深拷贝),Arrays类的各种函数(如copyOf、copyOfRange、equals、fill),以及数组的浅拷贝与深拷贝概念,最后介绍了冒泡排序算法。
摘要由CSDN通过智能技术生成

🥰🥰🥰来都来了,不妨点个关注叭!
👉博客主页:欢迎各位大佬!👈

在这里插入图片描述
上期内容讲解数组的知识,本期内容讲解数组有关的题目,学会就赶紧用起来吧!将会对Java中的数组有一个更深刻的了解,一起来看看吧

1. 数组转换字符串

在这里插入图片描述
经过分析,应该很快就可以把代码写出来啦~

public static String myToString(int[] array) {
       if(array == null) {
        System.out.println("null");
       }
       String ret = "[";
       for(int i = 0; i < array.length;i++) {
           ret += array[i];
           if(i != array.lenth-1) {
           ret += ",";
       }
   }
   ret += "]";
   return ret;
}
public static void main(String args[]) {
  int[] array = {1,2,3};
  System.out.println(myToString(array));
}

【注意】考虑数组为空的情况
【总结】这就告诉我们,拿到一个问题,我们需要一步一步分析,发现问题,解决问题,不断调试

2. 数组的拷贝

2.1 数组拷贝

上一期内容,我们写了这个代码,array2 = array1,这个是不是就是数组的拷贝呢?

public static void main(String[] args) {
     int[] array1 = {22,43,56,77};
     int[] array2 = array1;
    
     System.out.println(Arrays.toString(array1));
     System.out.println(Arrays.toString(array2));
    }

答案:不是的,我们知道,这两个引用都指向了一个对象,如图,所以不是数组的拷贝,需要有一个数组,指向新的对象,而这个对象存储的值与需拷贝数组的值想的相同
在这里插入图片描述
用for循环写的将其一个个拷贝,代码如下:

public static void main(String[] args) {
     int[] array1 = {22,43,56,77};     
     int[] array2 = new int[array.length];
     for(int i = 0; i < array1.length; i++) {
       array2[i] = array1[i];
     }
     System.out.println(Arrays.toString(array1));
     System.out.println(Arrays.toString(array2));
    }

这样才是数组的拷贝
在这里插入图片描述

2.2 Arrays的各种函数

接下来进一步介绍Arrays的各种常用函数
例如,数组的拷贝,可以使用

2.2.1 Arrays.copyOf

功能:可进行数组的拷贝,可进行数组的扩容

Arrays.copyOf(数组名称,拷贝长度)

array2 = Arrays.copyOf(array1,array1.length)

同时这个函数还可以扩容

array = Arrays.copyOf(array,2*array.length)

2.2.2 Arrays.copyOfRange

功能:可进行数组的拷贝,有起始位置与终止位置,也可进行数组的扩容

Arrays.copyOfRange(数组名称,起始位置,终止位置)

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

当然,也可以当做扩容用~

2.2.3 Arrays.equals

功能:判断2个数组的值是否相等
Arrays.equals(数组名称1,数组名称2)

public class Test {
    public static void main(String[] args) {
        int[] array1 = {1,2,3};
        int[] array2 = {1,2,3};
        System.out.println(array1.equals(array2));
        //等价于
         System.out.println(array1 == array2);
    }
}

输出为true,这两个数组的每一个值都相等

2.2.4 equals与==的区别

【==】
==比较基本数据类型,比较的是值
==比较引用数组类型,比较的是地址
【equals】
比较地址,同时我们可以自己改写,按照自己的规则进行比较

2.2.5 Arrays.fill

功能:将数组填充为指定的值

Arrays.fill(数组名称,填充的值)

public class Test {
    public static void main(String[] args) {
        int[] array = new int[5]; //array = {0,0,0,0,0} 默认值为0
        System.out.println(Arrays.fill(array,-1));
    }
}

4. 克隆

克隆的含义:产生一个副本

4.1 函数使用

功能:数组的克隆

Arrays.clone()

public class Test {
    public static void main(String[] args) {
       int[] array1 = {1,2,3};
       int[] array2 = array1.clone();
       System.out.println(Arrays.toString(array1));
       System.out.println(Arrays.toString(array2));
       array2[0] = 33;
       System.out.println(Arrays.toString(array1)); //{1,2,3}
       System.out.println(Arrays.toString(array2)); //{33,2,3}    
    }
}

4.2 浅拷贝和深拷贝

在这里插入图片描述
在这里插入图片描述

浅拷贝和深拷贝的区别
浅拷贝:只是复制了对象的引用地址,两个对象指向同一个地址,修改任意一个值,另一个也会随之改变
深拷贝:将对象的值复制过来,两个对象修改其值,不影响另一个的值

5. 冒泡排序

将一个数组元素从小到大排序

原理:从左到右,两个相邻元素进行比较,每次比较一趟,就会找到序列中最大的一个。这个数就会从序列的最右边冒出来,经过多趟比较后完成从小到大的排序

来看看如何具体实现吧!
这是一趟的结果,以此类推
在这里插入图片描述
i控制趟数,j控制一趟需要来两两比较的次数

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

    }

上面代码可以优化,请看下面这张更进一步比较
在这里插入图片描述
可以发现,j不是非得比较array.length-1次,第一趟比较晚后,最后一个数已经确定是最大的,所以倒数第二个数不需要和最后一个数比较了,第二趟结束后,倒数第二个数已经确定是第二大的数,所以倒数第三个数不需要和倒数第二个数比较,以此类推,故比较的次数j可以小于array.length-1-i
在这里插入图片描述
本期内容到这里结束啦!下期见~继续加油嘿嘿

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值