li

XXXXX

 

java---数组(重点概念)

一、什么是数组

  • 程序=算法+数据结构
  • 数据结构:把数据按照某种特定的结构保存,设计一个合理的数据是解决问题的关键;
  • 数组:是一种用于存储多个相同类型数据类型 的存储模型;
  • 数组的特定结构:相同类型组成元素集合
  • 通过氧元素的下标进行访问,切下标从0开始,最大元素下标为[数组长度-1];

二、数组的定义:

声明数组:

  • 数据类型[] 变量名:int[] arr:定义了一个int类型的数组,数组名为arr,推荐使用这种
  • 数据类型 变量名[]:int arr[]:定义了一个int类型的变量,变量名为arr数组

举例:

int [] i=new int[5];//长度为5;
含义:
    int:数组的元素类型必须为int
    i:数组的名称
    new:创建了一个数组对象
    5:数组的长度
    1、初始值为int的默认值
    2、元素为{0,0,0,0,0}

三、数组的初始化之动态初始化

1、数组初始化概述:

  • java中的数组必须先初始化后,才能使用;
  • 所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值

2、数组初始化方式:

  • 动态初始化
  • 静态初始化

3、动态初始化

  • 就是初始化时只指定数组长度,由系统为数组分配初始值;
  • 格式:
**数据类型[]  变量名 = new 数据类型[数组长度];**

- int[] arr=new int[3];

4、三种初始化方式:

int[] i=new int[5];//长度为5;
int[] i=new int[]{0,1,2,3,4};//长度即为元素个数
int[] i={1,2,3,4,5};//直接初始化元素,长度为元素的个数
1、这种写法只能再声明时对其初始化不能用于赋值
2、int[] arr;arr={1,2,34,4};编译错误
3、对于数组的赋值只能对其元素进行赋值,不能对数组定义直接赋值
4、可以采用第二种方式先用new关键字创建空间,再赋值arr=new[]{1,2,34,4}

四、数组的访问

数组变量访问方式:数组名

数组内部保存的数据的访问方式:数组名[索引]

索引是数组中数据的编导方式

作用:索引用于访问数组中的数据使用,数组名[索引]等同于变量名,是一种特殊的变量名

特征:

  • 索引从0开始;
  • 索引是连续的;
  • 索引逐一增加,每次加1

1、foreach:

for (类型名 变量名:数组名或集合名){

​            循环体;

}

2、引用类型:

  • 引用类型变量:一段空间,对象的起始地址;
  • 引用类型对象:一段空间,保存数据;
  • 引用类型变量=new ***();

3、二维数组:

本质就是一维数组;

数组中的元素的类型是一维数组类型;

变量:类型名[] 变量名;

对象:new  类型名整形表式;

五、内存分配:

1、java中内存分配:

java程序在运行时,需要在内存中分配空间,为了提高运算效率,就对空间进行了不同区域的划分;

因为每一片区域都有特定的处理数据方式和内存管理方式

  • 整形:初始值为0;
  • 浮点数:初始值为0.0;
  • 字符型:空字符;
  • 布尔型:初始值为false;
  • 引用数据类型:默认值为null

2、栈内存:存储局部变量

定义在方法中的变量,例如:arr,使用完毕,立即消失

3、堆内存:存储new出来的内容(实体,对象)

数组在初始化时,会为存储空间添加默认值

每一个new出来的东西都有一个地址值,使用完毕,会在垃圾回收器空闲时被回收

4、数组内存图(多个数组指向相同)

int[] arr=new int[3];
        arr[0]=100;
        arr[1]=200;
        arr[2]=300;
        System.out.println(arr);
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
        int[] arr2=arr;
        arr2[0]=111;
        arr2[1]=222;
        arr2[2]=333;
        System.out.println(arr);
        System.out.println(arr[0]);
        System.out.println(arr2);
        System.out.println(arr2[0]);
//结果:
[I@1540e19d
100
200
300
[I@1540e19d
111
[I@1540e19d
111

六、数组初始化之静态初始化

  • 静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度;
  • 格式:数据类型[] 变量名=new 数据类型[]{数据1,数据2,数据3,........}
  • 简化格式:数据类型[] 变量名={数据1,数据2,数据3..........}

举例:

 int[] arr={1,2,3,4};
        System.out.println(arr);
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
    }
结果:
    [I@1540e19d
1
2
3

七、数组操作的两个常见小问题:

1、索引越界:访问了数组中不存在的索引对于的元素,造成索引越界问题;

2、空指针异常:访问了数组已经不再指向堆内存的数据,造成空指针异常。

null:空值,引用数据类型的默认值,表示不指向任何有效对象

 int[] arr=new int[3];
        System.out.println(arr[3]); 

异常:

ArrayIndexOutOfBoundsException:数组索引越界异常

NullPointerException:空指针异常

int[] arr=new int[3];
//        System.out.println(arr[3]);
        arr=null;
        System.out.println(arr[0]);

八、数组常见操作:

1、获取数组元素的数量(.length):

int[] a=new int[]{4,6,7,8};
int len=a.length;//数组的length属性
System.out.println(len);//4

2、通过下标访问数组元素:

public class Numberjihe {
    public static void main(String[] args) {
        int[] b = { 4, 6, 9, 8, 7 };// b[0]----b[4]
        // 0,获取最后一位元素值
        System.out.println(b[b.length - 1]);// 7
        System.out.println("---------");
        // 1、获取元素下标为奇数的元素
        // 循环问题 条件:数组的长度 变量:第一个元素 改变条件:%2==1
        for (int i = 0; i < b.length; i++) {
            if (i % 2 == 1) {
                System.out.println(b[i]);
            }
        }
        // 2、交换元素下标为2和3的元素位置
        int temp = b[2];
        b[2] = b[3];
        b[3] = temp;
        System.out.println(b[2]);
        System.out.println(b[3]);
    }
}

3、获取最值:

思路:

1、定义一个变量,用于保存最大值(或最小值);-------------------int max;

2、取数组中第一个数据作为变量的初始值;-----------------------------int max=arr[0];

3、与数组中剩余的数据逐个比对,每次比对将最大值保存到变量中;------

for(int x=1;x<arr.length;x++){

if(arr[x]>max){

max=arr[x];

}

}

4、循环结束后打印变量的值

System,out.println(max);

九、遍历数组元素:

1、基本for循环

public class Number3 {
    public static void main(String[] args) {
        int[] a2 = new [] { 3, 6, 7, 9 };
        // 基本for循环
        for (int i = 0; i < a2.length; i++) {
            System.out.println(a2[i] + "");
        }
        // jdk1.8提供了增强for循环
        for (int i : a2) {
            System.out.println(i + "");

        }
    }
}

2、增强for循环

// jdk1.8提供了增强for循环
        for (int i : a2) {
            System.out.println(i + "");

        }

十、数组的复制:

1、System.arrayCopy()方法:

public static void arrayCopy(Object src,int srcPos,Object dest,int desPos,int length)
  • src:元数组
  • srcPos:原数组的起始位置
  • dest:目标数组
  • destPos:目标数组的起始位置
  • length:复制的长度
int[] c1 = {10,30,65,45}; 
int[] c2 = new int[4]; 
System.arraycopy(c1, 1, c2, 0, 3); System.out.println(Arrays.toString(c2));

如果目标数组小于需要copy的长度时会报出ArraysIndexOutOfBoundsException

2、Arrays.copyOf()方法:

java.util.Arrays类实现了数组复制的方法Arrays.copyOf(类型[] src,int length)
  • src:原数组
  • length:复制的长度
int[] c1 = {10,30,65,45}; 
System.out.println("s:" + c1.length); 
c1 = Arrays.copyOf(c1, 3); System.out.println(Arrays.toString(c1));//截取 System.out.println("t:" + c1.length);

结论:

  • 当复制的长度小于新数组,则截取;
  • 当复制的长度大于新数组,则扩容;
  • copyof方法使用时原数组长度变化的原因:
  1. 原数组长度不变;
  2. 源码中可以看出创建一个新数组使用

 

 十一、数组的排序:

1、数组的排序:

  • 排序是最常见的算法之一;
  • 排序:将数组元素按照从小到大或者从大到小的顺序排列
  • 常见的排序算法:冒泡排序,选择排序,插入排序,希尔排序,快速排序,归并排序等等

2、冒泡排序:

算法核心:比较相邻两个元素,将较大的元素互换

System.out.println("请输入产生数组的长度:");
        Scanner scanner = new Scanner(System.in);
        int length = scanner.nextInt();
        System.out.println("请输入你要产生的数组元素的范围:");
        int location = scanner.nextInt();
        int[] arr = new int[length];
        for (int i = 0; i < arr.length; i++) {
            Random random = new Random();
            arr[i] = random.nextInt(location);
        }
        System.out.println("排序前:" + Arrays.toString(arr));
        // 冒泡排序
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = 0; j < arr.length - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[i];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;

                }
            }

        }
        System.out.println("排序后:" + Arrays.toString(arr));
    }
}
  • Arrays.sort()方法

System.out.println("排序前:" + Arrays.toString(arr)); //冒泡排序 
Arrays.sort(arr); 
System.out.println("排序后:" + Arrays.toString(arr));
  • sort()方法原理

 

 

 

posted on 2022-03-14 15:30  LXXXXxZz  阅读(92)  评论(0编辑  收藏  举报

导航