java之数组篇*

Python3.8

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

目录

1.数组的基本用法

2. 数组的使用

2.1异常

2.2获取长度&遍历数组

3.引用类型

3.1内存

3.2引用类型与基本类型

3.3认识NULL

​编辑

4.数组的应用场景 

4.1数组作为参数

4.2数组作为返回值

5.数组练习

5.1数组转字符串

5.2数组的拷贝 

5.3求数组中元素的平均值

5.4查找数组中指定元素

5.4.1普通方法(效率低)

5.4.2 二分查找

5.4.2.* Array中的其他方法(常用)

 5.5数组排序(冒泡排序)

5.6数组逆序

5.7二维数组 


1.数组的基本用法

  • 数组的本质:可以看成是相同类型元素的一个集合,在内存中是一段连续的空间
  • 数组的初始化:
数据类型 [ ] 数组名称 = new 数据类型 [ ] { 初始化数据 };
数据类型 [ ] 数组名称 = { 初始化数据 };
public class F {
    public static void main(String[] args) {
        //数组的定义

        int[] array = {1, 2, 3, 4};    //语法的精简
        //整型数组 数组变量

        int[] array2 = new int[10];//定义了一个大小为10的整型数组
        //默认将里面的10个空间初始化为10个0

        int[] array3 = new int[]{1, 2, 3, 4, 5, 6, 7};

        System.out.println(array);
        System.out.println(array2);
        System.out.println(array3);

        int[] array4;
        array4 = new int[10];

        /*
        int[] array5;
        array5 = {1,2,3,4};
        这样写会报错!!!!
        new可以分开写,直接赋值不行(只能在定义的同时进行赋值)
         */

    }
}

输出结果如下: 

其中:[代表是一个数组 I代表是一个整型数组,@后面可以理解为“地址”  --> 不是真实的地址,哈希值

因此 array就是引用变量:存储“地址”的变量  -->简称引用

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

2. 数组的使用

2.1异常

1.算数异常

2.数组越界异常 

int[] arr = {1, 2, 3};
System.out.println(arr[4]);

2.2获取长度&遍历数组

public class F {
    public static void main(String[] args) {
       int[] array1 = {1,2,3,4};
        System.out.println(array1.length);

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

        //for-each 循环/增强for循环   
        //与for循环的区别:对于下标依赖的区别
        //for-each拿不到下标!!!    对于想让某个元素扩大2倍的场景 ,做不到

       //左边存什么样的值(数据类型):右边数组的名字
       for(int x:array){
            System.out.print(x + " ");
        }
        System.out.println();  
     
    }
}

3.引用类型

为什么说数组是引用类型呢?因为这个变量当中,存储的是地址

3.1内存

内存也是需要划分的,JVM的内存划分

平时所说的栈,其实指的是Java虚拟机栈区   局部变量 存在栈里

堆:一般用来存储 对象的,new所创建的对象都是在堆上保存

每一块内存都有自己的使命

3.2引用类型与基本类型

数据类型

1.基本数据类型

8种类型 4大类

2.引用数据类型

当前这个变量 里面存储的是地址

例题:

public static void func(){
    int[] array1 = new int[3];
    array1[0] = 10;
    array1[1] = 20;
    array1[2] = 30;
    
    int[] array2 = new int[]{1,2,3,4,5};
    array2[0] = 100;
    array2[1] = 200;
    
    array1 = array2;
    array1[2] = 300;
    array1[3] = 400;
    array2[4] = 500;
    for(int i = 0;i < array2.length;i++) {
        System.out.println(array2[i]);
    }
}

解析:

当func方法执行完毕,此时array1,array2是局部变量会被回收

总结:

1.局部变量的生命周期和作用域是什么?

2.当对象没有人引用的时候,那么就会被自动回收掉

3.引用的指向到底是什么样子的?

3.3认识NULL

int[] array3 = null;
System.out.println(array3.length);//错误的

 代表:array3这个引用 不指向任何对象!!!

 Java里面不是没有指针吗?就是没有的,"空指针异常'只是一种英文翻译

空指针异常会伴随整个学习的过程!如果以后遇到空指针异常,那么要定位,看哪个引用是空的!

4.数组的应用场景 

4.1数组作为参数

public class F {
   public static void func1(int[] array){
       array= new int [10];
   }
    public static void func2(int[] array){
        array[0]= 99;
        //array = null;
    }

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

}
//结果:1 2 3 4
//99 2 3 4

 第一部分分析:

只是改变了形参array的指向,不要以为传引用就万事大吉!!!你拿引用干什么了?

在这种情况下,并不会影响实参的指向

第二部分分析:

 注意区别两部分的区别,一个是改变了形参的指向,一个是改变了两个引用指向的对象的值

4.2数组作为返回值

public class F {
    public static int[] func3(){
        int[] array = {1,2,3,4,5,6};
        return array;
//代码简化
        //return new int[]{1,2,3,4,5,6};
    }

    public static void main(String[] args) {
        int[] ret = func3();
        for(int i = 0;i< ret.length;i++){
            System.out.println(ret[i]+" ");
        }
    }

}

对象一定是在堆上的,引用变量不一定是在栈上的

5.数组练习

5.1数组转字符串

import java.util.Arrays;
//  Arr回车自动导               java当中专门用来操作数组的!



public class F {
    public static int[] func3() {
        int[] array = {1, 2, 3, 4, 5, 6};
        return array;
    }
        public static void main(String[] args) {
        int[] ret = func3();
        //借助工具类    将参数的数组 转化为字符串输出!
        String s = Arrays.toString(ret);
        //ctr+鼠标点击可以调到这个方法的源码
        System.out.println(s);

        //快捷键    Arrays.toString(ret).sout
        System.out.println(Arrays.toString(ret));
        }



}

Java 中提供了 java.util.Arrays , 其中包含了一些操作数组的常用方法

什么是包?

        例如做一碗油泼面 , 需要先和面 , 擀面 , 扯出面条 , 再烧水 , 下锅煮熟 , 放调料 , 泼油。
但是其中的 " 和面 , 擀面 , 扯出面条 " 环节难度比较大 , 不是所有人都能很容易做好 于是超市就提供了一些直接已经扯好的面条, 可以直接买回来下锅煮 从而降低了做油泼面的难度 , 也提高了制作效率。
       程序开发也不是从零开始 , 而是要站在巨人的肩膀上。
像我们很多程序写的过程中不必把所有的细节都自己实现 , 已经有大量的标准库 (JDK 提供好的代码 ) 和海量的第三方库( 其他机构组织提供的代码 ) 供我们直接使用 这些代码就放在一个一个的 " " 之中。
       所谓的包就相当于卖面条的超市。 只不过 , 超市的面条只有寥寥几种 , 而我们可以使用的 " " , 有成千上万。

我们实现一个自己版本的数组转字符串:

import java.util.Arrays;
public class F {
    public static void main(String[] args) {
        int[] arr = {1,2,3,4,5,6};
        System.out.println(toString(arr));
    }
    public static String toString(int[] arr) {
        String ret = "[";
        for (int i = 0; i < arr.length; i++) {
        // 借助 String += 进行拼接字符串
            ret += arr[i];
        // 除了最后一个元素之外, 其他元素后面都要加上 ", "
            if (i != arr.length - 1) {
                ret += ", ";
            }
        }
        ret += "]";
        return ret;
    }
}

5.2数组的拷贝 

import java.util.Arrays;
public class F {
    public static void main(String[] args) {
        int[] array = {1, 2, 3, 4, 5};

        //拷贝方法一:
        int[] copy = new int[array.length];
        for (int i = 0; i < array.length; i++) {
            copy[i] = array[i];
        }
        System.out.println(Arrays.toString(copy));

        //以下代码,是不是拷贝?
        int[] array2 = {1, 2, 3, 4, 5};
        int[] array3 = array2;
        System.out.println(Arrays.toString(array3));
        //不是!!!!


        //拷贝方法二:
        int[] copy2 = Arrays.copyOf(array, array.length);
        System.out.println(Arrays.toString(copy2));
        //此时就相当于扩容了
        int[] copy3 = Arrays.copyOf(array, array.length*2);
        System.out.println(Arrays.toString(copy3));

        //拷贝局部变量   能拷贝多少拷贝多少
        //Java当中from to相当于 【1,3)
        int[] copy4 = Arrays.copyOfRange(array,1,3);
        System.out.println(Arrays.toString(copy4));
    }
}

import java.util.Arrays;
public class F {
    public static void main(String[] args) {
      //拷贝第三种方法
        int[] array = {1,2,3,4,5};
        int[] copy = new int[array.length];
        System.arraycopy(array,0,copy,0,array.length);
        System.out.println(Arrays.toString(copy));
    }
}

5.3求数组中元素的平均值

public static void main(String[] args) {
    int[] arr = {1,2,3,4,5,6};
    System.out.println(avg(arr));
}
public static double avg(int[] arr) {
    int sum = 0;
    for (int x : arr) {
        sum += x;
    }
    return (double)sum / (double)arr.length;
}

注意强转为double类型!!!

5.4查找数组中指定元素

5.4.1普通方法(效率低)

public class F {
    public static int findVal(int[] array,int x) {
        for(int i = 0;i < array.length;i++){
            if(array[i] == x){
                return i;
            }
        }
        return -1;

    }

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

5.4.2 二分查找

针对有序数组

import javax.imageio.stream.ImageInputStream;
import java.util.Arrays;

public class F {
    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) {
                left = mid + 1;
            } else if (array[mid] > key) {
                right = mid - 1;
            } else {
                return mid;
            }
        }
        return -1;//没有一个下标等于用负数



    }

    public static void main(String[] args) {
        int[] array = {1,2,13,4,15};
        Arrays.sort(array);//排序
        System.out.println(Arrays.toString(array));
        System.out.println(binarySearch(array, 15));
    }



}

 直接调用工具类中的二分查找

import javax.imageio.stream.ImageInputStream;
import java.util.Arrays;

public class F {
    public static void main(String[] args) {
        int[] array = {1,2,13,4,15};
        Arrays.sort(array);//排序
        System.out.println(Arrays.toString(array));

        //直接使用
        System.out.println(Arrays.binarySearch(array, 15));
    }

}
5.4.2.* Array中的其他方法(常用)
import javax.imageio.stream.ImageInputStream;
import java.util.Arrays;

public class F {
    public static void main(String[] args) {
        int[] array1 = {1, 2, 13, 4, 15};
        int[] array2 = {1, 2, 13, 4, 15};
        //比较两个数字 对应位置 数据是否一样!!!
        boolean flg = Arrays.equals(array1, array2);
        System.out.println(flg);
        System.out.println("===============");
        int[] array3 = new int[10];
        //帮你直接填充数据!
        Arrays.fill(array3,-1);
        System.out.println(Arrays.toString(array3));
        int[] array4 = new int[10];
        //[1,4)
        Arrays.fill(array4,1,4,-1);
        System.out.println(Arrays.toString(array4));


    }



}

 5.5数组排序(冒泡排序)

import javax.imageio.stream.ImageInputStream;
import java.util.Arrays;

public class F {
       public static void bubbleSort(int[] array){
           //i代表的是趟数!!!
           for(int i= 0;i <array.length-1;i++){
               //j代表每一趟比较的次数
               //冒泡排序的优化:在某一趟比较之后,数组完全可能有序了
               boolean flg = false;
               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;
                       flg = true;
                   }
               }
               if(flg == false){
                   break;//说明有序了!!
               }

        }

    }

    public static void main(String[] args) {
        int[] array = {1,2,13,4,15};
        bubbleSort(array);
        System.out.println(Arrays.toString(array));
    }



}

5.6数组逆序

import java.util.Arrays;

public class s {
    public static void reverse(int[] array){
        int left = 0;
        int right = array.length - 1;
        while (left < right){
            int tmp = array[left];
            array[left] = array[right];
            array[right] = tmp;
            left++;
            right--;
        }
    }
    public static void main(String[] args){
        int[] array = {1,2,34,3,4,5,8,23,12};
        reverse(array);
        System.out.println(Arrays.toString(array));
    }

}

5.7二维数组 

import java.util.Arrays;

public class s {
    public static void main(String[] args) {
        //array[行的坐标][列的坐标]

        //二维数组的定义:
        int[][] array1 = {{1, 2, 3}, {4, 5, 6}};
        int[][] array2 = new int[][]{{1, 2, 3}, {4, 5, 6}};
        int[][] array3 = new int[2][3];//0

        //二维数组的遍历
        int[][] array4 = {{1, 2, 3}, {4, 5, 6}};
        /*for(int i= 0;i < 2;i++){
            for(int j = 0;j < 3;j++){
                System.out.print(array4[i][j] + " ");
            }
            System.out.println();*/
        //二维数组是特殊的一维数组

            for(int i = 0;i < array4.length;i++){
                for(int j = 0;j < array1[i].length;j++){
                    System.out.print(array4[i][j] + " ");
                }
                System.out.println();
        }

        //打印二维数组
        System.out.println(Arrays.deepToString(array1));
        //不规则的二维数组
        int [][] array5 = new int[2][];
        array3[0] = new int[]{1,2,3};
        array3[1] = new int[]{1,2,3,4,5,6,7};
    }
}

空指针异常,未指定列,引用类型,为null !

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值