JavaSE 基础(六) 数组

目录

前言

一.数组的基本概念

1.什么是数组

2.数组的创建和初始化 

2.1 数组的创建

例如: 

2.2 数组的初始化 

2.2.1 动态初始化 

2.2.2 静态初始化

注意事项 

 数组中元素类型的默认值

 3.数组的使用 

3.1 数组中元素的访问

3.2 遍历数组 

二. 数组是引用类型 

1 初始JVM的内存分布

     2. 基本类型变量与引用类型变量的区别 

 三.数组的应用场景

1.保存数据

2.作为函数的参数

3.作为函数的返回值

 四.数组练习题

1.数组转字符串

2,数组的拷贝

3,求数组中元素的平均值 

4.查找数组中指定元素(顺序查找) 

 5.查找数组中指定元素(二分查找)

6. 数组排序(冒泡排序)

7.数组逆序

五. 二维数组

后记


前言

Hi~ 你好! 

欢迎点击我的博客 : )       

这是我的学习总结,希望也能帮助到你

我的博客地址:hi~,我在这里~,欢迎关注哦,

三连不迷路,优质内容持续更新!

一.数组的基本概念

1.什么是数组

数组就是相同类型元素的一个集合

在内存中是一段连续的空间

2.数组的创建和初始化 

2.1 数组的创建
元素类型 []数组名 = new 元素类型[数组长度]
例如: 
        int []arr1 = new int[5];      //创建一个可以容纳5个整数类型的数组
        double []arr2 = new double[3];//创建一个可以容纳3个双精度浮点数类型的数组
        String []arr3 = new String[4];//创建一个可以容纳4个字符串类型的数组
        System.out.println(Arrays.toString(arr1));
        System.out.println(Arrays.toString(arr2));
        System.out.println(Arrays.toString(arr3));
  
结果如下:
             [0, 0, 0, 0, 0]
             [0.0, 0.0, 0.0]
             [null, null, null, null]
2.2 数组的初始化 
2.2.1 动态初始化 

在创建数组时,直接指定数组中元素的个数

        int[]array = new int[5];
2.2.2 静态初始化

在创建数组时,直接指定具体的数据内容

        int []arr1 = new int[]{1,2,3,4,5};
        double []arr2 = new double[]{1.1,1.2,1.3};
        String []arr3 = new String[]{"Q","w","E","R"};
注意事项 

1.静态初始化没指定数组的长度,编译器在编译时会根据{}中元素个数来确定数组的长度

2.{}中数据类型必须与[]前数据类型一致

3.可以简写,省去后面的new 元素类型[]

4.如果没有对数组进行初始化,数组中元素有其默认值,引用类型默认值为null

 数组中元素类型的默认值
类型默认值
byte

0

short0
int0
long0
float0.0f
double0.0
char/u0000
booleanfalse

 3.数组的使用 

3.1 数组中元素的访问

数组在内存中是一段连续的空间,空间的编号都是从0开始的,

依次递增,该编号称为数组的下标,数组可以通过下标访问其任意位置的元素

        int []arr1 = new int[]{1,2,3,4,5};
        double []arr2 = new double[]{1.1,1.2,1.3};
        String []arr3 = new String[]{"Q","w","E","R"};
        System.out.println(arr1[0]);
        System.out.println(arr2[1]);
        System.out.println(arr3[3]);
 
       结果如下:
                1
                1.2
                R
 

1. 因为数组是一段连续的内存空间,所以支持随机访问,通过下标快速访问数组中的元素

2.下标从 0 开始到N( 不包含 N) N 为元素个数,不能越界,否则会报出下标越界异
3.2 遍历数组 

  "遍历" 是指将数组中的所有元素都访问一遍, 访问是指对数组中的元素进行某种操作

 在数组中可以通过 数组对象.length 来获取数组的长度

          String []arr3 = new String[]{"Q","w","E","R"};
          System.out.println(arr3.length);

          结果为:4

for循环遍历:

        for (int i = 0; i < arr3.length; i++) {
            System.out.println(arr3[i]);
        }

Q
w
E
R

for-each遍历

        for (String x:arr3) {
            System.out.println(x);
        }

二. 数组是引用类型 

1 初始JVM的内存分布

1.程序计数器 :  保存下一条执行的指令的地址(空间小)

2.虚拟机栈 每个方法在执行时,都会先创建一个栈帧,栈帧中包含有:局部变量表、操作数栈动态链接返回地址以及其他信息,保存的都是与方法执行时相关的信息。比如:局部变量。当方法运行结束后,栈帧就被销毁了,即栈帧中保存的数据也被销毁了。

3.本地方法栈 :与虚拟机栈类似 . 保存的内容是 本地方法的局 部变量  在有些版本的 JVM 实现中 ( 例如 HotSpot), 本地方法栈和虚拟机栈是一起的
4. 堆 :  JVM所管理的最大内存区域. 使用 new 创建的对象都是在堆上保存,随着程序开始运行时而创建,随着程序的退出而销毁,堆中的数据只要还有在使用,就不会被销
5.方法区 : 用于 存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数 . 方法编译出的的字节码就是保存在这个区域

     2. 基本类型变量与引用类型变量的区别 

1.基本数据类型创建的变量,叫做基本变量,变量空间直接存放对应的值

2.引用数据类型创建的变量,称为对象的引用,空间中存的是对象所在空间的地址值

    引用变量并不直接存储对象本身,可以理解成存储的是对象在堆中空间的起始地址。通过该地址,引用变量便可以去操作对象

     null Java 中表示 "空引用" , 也就是一个不指向对象的引用,  null 的作用类似于 C 语言中的 NULL (空指针), 都是表示一个无效的内存位置. 因此不能对这个内存进行任何读写操

. 一旦尝试读写 , 就会抛出 NullPointerException(空指针异常)

                 

 三.数组的应用场景

1.保存数据

      String []arr3 = new String[]{"Q","w","E","R"};
        for (int i = 0; i < arr3.length; i++) {
            System.out.println(arr3[i]);
        }

2.作为函数的参数

   public static int[] myCopyOf(int[]arr){
        int []newArr = new int[arr.length];
        for (int i = 0; i < arr.length; i++) {
            newArr[i]=arr[i];
        }
        return newArr;
    }
" 引用 " 本质上只是存了一个地址 .Java 将数组设定成引用类型 , 后续进行数组参数传参 , 其实
只是将数组的地址传入到函数形参中 . 这样可以避免对整个数组的拷贝 ( 数组可能比较长 , 那么拷贝开销就会很大 )

3.作为函数的返回值

    public static int jumpFloor(int n) { //动态规划
        if (n <= 2) {
            return n;
        }
        int[] arr = new int[n + 1];
        arr[1] = 1;
        arr[2] = 2;
        for (int i = 3; i <= n; i++) {
            arr[i] = arr[i - 1] + arr[i - 2];
        }
        return arr[n];
    }

 四.数组练习题

1.数组转字符串

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

2,数组的拷贝

    public static void main(String[] args) {
        int []arr ={1,2,3,4,5};
        int []newArr = arr;
        newArr[0]=9;
        System.out.println(Arrays.toString(arr));
        System.out.println(Arrays.toString(newArr));
    

        [9, 2, 3, 4, 5]//引用的是相同的地址
        [9, 2, 3, 4, 5]


        int[] newArr = Arrays.copyOf(arr, arr.length);
        arr[0]=9;
        System.out.println(Arrays.toString(arr));
        System.out.println(Arrays.toString(newArr));

        [9, 2, 3, 4, 5] //拷贝到了newArr,对Arr的操作不影响newArr
        [1, 2, 3, 4, 5]

        int[] ints = Arrays.copyOfRange(arr, 2, 5);
        System.out.println(Arrays.toString(ints));//拷贝某个范围
       
    }
        [3, 4, 5]

3,求数组中元素的平均值 

给定一个整型数组 , 求平均值
    public static void main(String[] args) {
        int []arr ={1,2,3,4,5,6,7,8,9,10};
        System.out.println(avg(arr));
    }
    public static double avg(int []arr){
        double sum = 0.0;
        for (int i = 0; i < arr.length; i++) {
            sum += arr[i];
         }
        return sum/arr.length;
    }

4.查找数组中指定元素(顺序查找) 

给定一个数组 , 再给定一个元素 , 找出该元素在数组中的位置 .
    public static void main(String[] args) {
        int []arr ={1,2,3,4,5,6,7,8,9,10};
       // System.out.println(avg(arr));
        System.out.println(findNumberIndex(arr, 10));
    }
    public static int findNumberIndex(int []arr,int number){
        for (int i = 0; i < arr.length; i++) {
            if (number==arr[i]){
                return i;
            }
        }
        return -1;
    }

 5.查找数组中指定元素(二分查找)

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

6. 数组排序(冒泡排序)

给定一个数组 , 让数组升序 ( 降序 ) 排序
public static void main(String[] args) {
        int []arr = {4,1,5,3,8,2,9};
//
        Arrays.sort(arr);

        System.out.println(Arrays.toString(arr));//[1, 2, 3, 4, 5, 8, 9]
    }
    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 temp = arr[j];
                 arr[j]=arr[j+1];
                 arr[j+1]=temp;
                 flag = true;
                }
            }
            if(flag==false){
                return;
            }
        }
    }

7.数组逆序

给定一个数组 , 将里面的元素逆序排列
 public static void revers(int[] arr) {
        int left = 0;
        int right = arr.length - 1;
        for (int i = 0; i < arr.length; i++) {
            if (left < right) {
                int temp = arr[left];
                arr[left] = arr[right];
                arr[right] = temp;
                left++;
                right--;
            }
        }
    }

五. 二维数组

二维数组本质上也就是一维数组 , 只不过每个元素又是一个一维数组
  public static void main(String[] args) {
        int [][]arr = {{1,2,3},{4,5,6},{7,8,9}};
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                System.out.print(arr[i][j]+" ");
            }
            System.out.println();
        }
    }

        1 2 3 
        4 5 6 
        7 8 9 

 

后记

看到这里,希望能帮到你~

您的点赞 ,收藏 ,关注 是我创作的最大动力!

同时也欢迎在评论区进行交流,共同进步~       

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值