Java____数组and练习题

1.数组定义

数组:第一个引用类型 (顺序表)
一次定义并保存多个同类型的数
数据结构:数据如何存储
顺序表:元素按顺序存储的结构

2.数组的声明与初始化

定义一个长度为3的整型数组

int[] arr = new int[3];//此时数组中元素都是默认值0
                       //只定义不初始化
int[] arr = new int[]{
    
    1,3,5};//定义了一个长度为3的数组,值为1,3,5

int[] arr = {
    
    1,3,5};//简写

3.数组的索引(偏移量)

为何第一个元素要从0开始?
取出数组中的元素,需要使用数组名称[索引]
索引取值范围:0----长度-1
数组长度:数组名称.Length

public class ArrayLearn {
    
    
    public static void main(String[] args) {
    
    
        //定义一个长度为3的整型数组
        int[] arr = new int[3];
        int[] arr1 = new int[]{
    
    1,3,5};
        int[] arr2 = {
    
    1,3,5};
        //取出arr数组长度
        System.out.println(arr.length);
        //取出arr1数组中第二个元素
        System.out.println(arr1[2]);
    }
}

在这里插入图片描述
注意:当访问数组中不存在的元素时(越界问题)索引不存在合法取值内[0…arr.length - 1]在这里插入图片描述

4.数组的遍历

数组的遍历:依次取出数组中的每个元素并访问(输出)–for循环

public class ArrayLearn {
    
    
    public static void main(String[] args) {
    
    
        int[] arr = new int[]{
    
    1,3,5};
        //取出数组中的每个元素并打印
        for (int i = 0; i < arr.length; i++) {
    
    
            System.out.print(arr[i]+",");
        }
    }
}
public class ArrayLearn {
    
    
    public static void main(String[] args) {
    
    
        int[] arr = new int[]{
    
    1,3,5};
       
        //取出数组中的每个元素并打印
        for (int i = 0; i < arr.length; i++) {
    
    
            //修改第二个元素的值
            if (i == 1) {
    
    
                arr[i] = 10;
            }
            System.out.print(arr[i] + ",");
        }
        System.out.println(arr[1]);
    }
}

在这里插入图片描述

for-each循环

当只需要访问数组元素并不修改的前提下,可以使用for-each循环
语法结构

语法结构

for(临时变量 :数组名称)
每走一次循环,就将数组的元素依次赋值给临时变量,此时for-each循环无法修改原数组。

public class ArrayLearn {
    
    
    public static void main(String[] args) {
    
    
        int[] arr = new int[]{
    
    1,3,5};
        for (int i : arr){
    
    
        //定义了一个局部变量叫i
        //:号表示依次从数组中的第一个元素开始取值
        //取一个赋值给i作为输出
        System.out.print(i + ",");
        }
    }
}

问题1:数组作为方法的参数问题

方法值传递
数组可以交换

public class ArrayLearn {
    
    
    public static void main(String[] args) {
    
    
        int[] arr = new int[]{
    
    1,3};
       swap(arr);
        System.out.println(arr[0]+","+arr[1]);
        }
public static void swap(int[] arr){
    
    
        int tmp = arr[0];
        arr[0] = arr[1];
        arr[1] = tmp;
    }


    //定义一个方法,传入一个整型数组并打印
    public static void printArr(int[] arr){
    
    
        for (int i : arr){
    
    
            System.out.print(i + ",");
        }
    }
}

5.数据类型:基本类型和引用类型

基本类型:int long double 存储的是具体数值

引用类型:存储的是地址

            引用实际上就是起个别名
            有new就有新空间
           引用类似是个指针,就保存了内存中的一个地址(也是个数)

认识null

在这里插入图片描述
当一个引用变量赋值为null时,表示此变量不保存任何地址,因此无法使用该变量进行操作。

6.Java中的内存划分:栈和堆

栈空间:保存的是函数中的局部变量(方法中的形参和实参)

public static void 方法名称(方法参数 形参){
    
    
      int a = 10;(实参)
}

堆空间:所有new的对象都在堆空间

数组引用作为方法的返回值

题:定义一个方法,将传入数组的每个元素*2处理(数组遍历)

public class ArrayLearn {
    
    
    public static void main(String[] args) {
    
    
        int[] arr = new int[]{
    
    10,20};
        int[] result = doubleArr(arr);
        System.out.println(arr[0]);
        }
//数组引用作为方法的返回值
    public static int[] doubleArr(int[] arr){
    
    
        for (int i = 0; i < arr.length; i++) {
    
    
            arr[i] *= 2;
        }
        return arr;
    }

在这里插入图片描述

数组练习

1.数组转换为字符串

import java.util.Arrays;

public class ArrayLearn {
    
    
    public static void main(String[] args) {
    
    
        int[] arr = new int[]{
    
    1, 3, 5};
        //将arr数组对象转换为——————>String
        //JDK提供的工具类————>[1,3,5]
        String arrStr = Arrays.toString(arr);
        //自定义转换方法
        String arrNewStr = arr2Str(arr);
        System.out.println(arrStr);
        System.out.println(arrNewStr);
    }

    //自己写一个方法,将数组对象——————》String
    //[1,3,5]
    public static String arr2Str(int[] arr) {
    
    
        //int ---->String (字符串和任何数据类型 + )
        String ret = "[";
        //遍历数组arr ,将每个元素取出来进行字符串的拼接(+)
        for (int i = 0; i < arr.length; i++) {
    
    
            //arr[i]
            ret += arr[i];


            //当前元素不是最后一个
            if (i != arr.length - 1){
    
    
                ret += ",";
            }


        }
        ret += "]";
        return ret;
    }
}

在这里插入图片描述

2.数组的拷贝

import java.util.Arrays;

public class ArrayLearn {
    
    
    public static void main(String[] args) {
    
    
        int[] arr = new int[]{
    
    1, 3, 5};
        //JDK提供的类进行数组拷贝
        int[] newArr = Arrays.copyOf(arr,arr.length);
        System.out.println(arr2Str(arr));
        System.out.println(arr2Str(newArr));

        //如何证明arr和 newArr是否指向同一块空间
        System.out.println(arr);
        System.out.println(newArr);

        /*//将arr数组对象转换为——————>String
        //JDK提供的工具类————>[1,3,5]
        String arrStr = Arrays.toString(arr);
        //自定义转换方法
        String arrNewStr = arr2Str(arr);
        System.out.println(arrStr);
        System.out.println(arrNewStr);*/
    }
 }

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

自己实现数组拷贝(全拷贝)

import java.util.Arrays;

public class ArrayLearn {
    
    
    public static void main(String[] args) {
    
    
        int[] arr = new int[]{
    
    1, 3, 5};
        int[] newArr = arrCopy(arr);
        System.out.println(arr2Str(arr));
        System.out.println(arr2Str(newArr));
    }
    //自己实现数组拷贝
    public static int[] arrCopy(int[] arr){
    
    
        //创建一块和arr大小完全相同的数组对象
        int [] ret = new int[arr.length];
        //将原数组arr的每个元素复制给新数组ret
        for (int i = 0; i < arr.length; i++) {
    
    
            ret[i] = arr[i];

        }
        return ret;
 }

在这里插入图片描述

部份拷贝
import java.util.Arrays;

public class ArrayLearn {
    
    
    public static void main(String[] args) {
    
    
        int[] arr = new int[]{
    
    1, 3, 5,7,9};
        int[] newArr = Arrays.copyOfRange(arr,1,4);
        System.out.println(arr2Str(arr));
        System.out.println(arr2Str(newArr));
    }
    //自己实现数组拷贝
    public static int[] arrCopy(int[] arr){
    
    
        //创建一块和arr大小完全相同的数组对象
        int [] ret = new int[arr.length];
        //将原数组arr的每个元素复制给新数组ret
        for (int i = 0; i < arr.length; i++) {
    
    
            ret[i] = arr[i];

        }
        return ret;
}

在这里插入图片描述
结论:部份拷贝—左闭右开区间。Arrays.copyOfRange(原数组引用,原数组开始索引,原数组的结束索引)
原数组arr和拷贝后的数组索引相差startindex个索引
3.

3.找到数组的最大元素!!!重点

要找最大元素,需要进行元素的比较(和谁比)
//假设数组的第一个元素是最大值
在遍历的过程中,不断将数组元素与当前最大值作比较,若发现有元素比当前元素大——》将最大值赋值给max

public class Homework3 {
    
    
    public static void main(String[] args) {
    
    
        int[] arr = new int[]{
    
    1,3,5,7,9};
        //找到arr的最大元素
        int max = findMax(arr);
        System.out.println(max);
    }
    public static int findMax(int[] arr){
    
    
        //假设第一个元素是最大值
        int max = arr[0];
        for (int i = 1; i < arr.length; i++) {
    
    
            if (arr[i] > max){
    
    
                //此时arr[i]比当前最大值大,当最大值更新为arr[i]
                max = arr[i];
            }

        }
        return max;
    }
}

在这里插入图片描述

4.求一个数组的平均值

首先,先求出数组的和

public class Homework3 {
    
    
    public static void main(String[] args) {
    
    
        int[] arr = new int[]{
    
    1,3,5,7,9};
        int sum = sumRecursion(arr,0,4);
        System.out.println(sum);

 public static int sumRecursion(int[] arr,int startIndex,int endIndex){
    
    
        //终止条件
        if (endIndex == startIndex){
    
    
            return arr[endIndex];
        }
        return arr[startIndex] + sumRecursion(arr,startIndex +1,endIndex);
    }

    /*public static double avg(int[] arr){
        double ret = 0.0;
        //取得当前数组arr的和
        int sun = sum(arr);
        ret = (double) sum / arr.length;
        return ret;
    }*/

在这里插入图片描述

5,如何判断一个数组是有序的?

有序 :升序 和 降序
无序

public class Homework3 {
    
    
    public static void main(String[] args) {
    
    
        int[] arr = new int[]{
    
    1,3,5,7,9};
        int[] arrTest = new int[] {
    
    1,5,2,3,4};
        System.out.println(isSorted(arr));
        System.out.println(isSorted(arrTest));
    }


    public static boolean isSorted(int[] arr){
    
    
        //遍历集合,每次将当前元素和下一个元素做大小比较
        //若发现当前有当前元素大于下一个元素,该集合一定是无序集合
        for (int i = 0; i < arr.length - 1; i++) {
    
    
            if (arr[i] > arr[i+1]){
    
    
                return false;
            }
        }
        return true;
    }
}

在这里插入图片描述

6.查找数组中的指定元素

(1)暴力求解版

public class Homework3 {
    
    
    public static void main(String[] args) {
    
    
        int[] arr = new int[]{
    
    1,3,5,7,9};
        System.out.println(find(arr,7));
        System.out.println(find(arr,11));
    }


    public static int find(int[] arr,int toFind){
    
    
        for (int i = 0; i < arr.length; i++) {
    
    
            if (arr[i] == toFind){
    
    
                return i;
            }
        }
        //此时集合中没有要查找的元素
        return -1;
    }
}

在这里插入图片描述

二分查找

每次将查找元素和区间的中间元素进行比较,若当前元素恰好等于中间元素----》结束
若当前元素<中间
1 3 5 7 9
7比5大,7比5之前所有都大
升序:当前元素>中间元素,此时当前元素大于前半区间的所有元素
将区间一分为二

猜你喜欢

转载自blog.csdn.net/biteqq/article/details/122708858