黑马程序员——Java基础——数组操作应用

时间:2023-02-25 18:50:40

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、数组基础知识

  1、定义:用于存储同种数据类型数据的容器。

  系统自动给数组中的元素从0开始编号。

格式:运算类型[] 数组名= new 元素类型[元素个数或数组长度]

示例:int [] arr=new int [5];

格式2

元素类型[] 数组名=new 元素类型 [] {元素,元素,元素....}

int [] arr=new int[] {3,5,1,7};

int [] arr={3,5,1,7};

而arr是数组类型,是一个指针。


 2、内存结构

     Java程序在运行时,一共开辟了五片空间区域。需要在内存中的分配空间,为了提高运算效率,有对空间进行了不可区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。

    栈内存

用于存储局部变量,当数据使用完,所占空间会自动释放。(先进后出的特点)

例如int [] x=new int[3];

读到 左边,就在栈内存中存放数组类型x

读到右边,new 里面读出来的数据都存放在堆里面。

堆内存

1) 凡是堆里面,都存放的是实体,实体包括数组和对象,通过new 建立的实例都存放在堆内存中。

2) 每一个实体都有内存地址值。可以用于和栈内存中的数据联系。

所以,上例中,new的一个作用是,把首个数组元素在内存中的地址值赋值给X

X中存放的是地址值。我们就称X指向了这个数组,或者说是X引用了这个数组。

内存图例:

黑马程序员——Java基础——数组操作应用

这就是引用数据类型

3) 实体中的变量都有默认初始化值

 Int 类型,默认是0     double类型,默认是0.0           float 类型,默认是0.0f     boolean类型,默认是false

4) 实体不会被使用,会在不确定的时间内被垃圾回收器回收。

释放引用类型数据的方法:x=null

这样,当一个引用类型数据不再存放任何堆内存数据地址值时,这个引用数据及堆内存中的数组数据就变为垃圾,这些垃圾,虚拟机会不定时地清理它们。

Java的内存优化要比c++做的好,c++是需要程序员手动调用一个函数来清除。如果程序员忘记了,他写的程序运行时间越长,运行时间越慢。

java不需要程序员手动,只要这个数据变为垃圾,虚拟机会自动启动垃圾回收器。

3、数组中常出现的异常

 1)Arrayindexoutofboundexception  这个错误叫做数组脚标越界异常

例如

int [] arr=new int[3];

System.out.println(arr[3]);

数组长度是3。数组元素为:  arr[0] arr[1] arr[2]

不会有arr[3],编译只编译语法错误,而arr[3]语法正确,运行就会出错了。

2)NullPointerexception 这个错误叫做空指针异常,当引用没有任何指向值为null的情况,该引用还在用于指向实体。

例如

int arr[]=new int [3];

arr=null;

System.out.println(arr[1]);

arr 已经不再指向数组,还在访问数组元素,就会出现错误。

4、二维数组

可以称为数组中的数组   

格式:int [][] arr=new int[3][2];   int [][]y;  int y[ ][ ];  int[ ]y[ ];

一维数组的名称为arr[0],arr[1],arr[2]

格式二, int [][]arr=new int[3][];

说明

二维数组中有三个一维数组。

每个一维数组都是默认初始化值null,说明默认的三个一维数组是不指向任何数组的

可以对这三个一维数组分别进行初始化

arr[0]=new int[3];

arr[1]=new int[1];

arr[2]=new int[2];

arr.length 二维数组的长度  是3

arr[0].length 二维数组中第一个元素,也就是第一个一维数组的长度

int [][] arr={{3,5,1,7},{2,3,5,8},{6,1,8,2}};

  二维数组内存图例

黑马程序员——Java基础——数组操作应用

    


二、数组应用操作

1、 获取数组中的元素

   通常会用到遍历,数组中有一个属性可以直接获取到数组元素个数,叫做length。数组作为形参

   例如  定义功能,用于打印数组中的元素

   public static void printArray(int [] arr)

   {  

        System.out.println(arr);

}

 public static void main(String[]args)

 {

   int []arr=new int[3];

   arr[0]=1;arr[1]=2;arr[2]=3;

  printArray(arr);

}

   运行结果

    [i@dc6ccd

是一个数组实体的引用给直接打印了。 运行结果告诉我们打印的是一个数组类型的实体,里面存放的是int类型的数据dc6ccd就是数组的地址值。是由哈希算法算出来的哈希值。是十六进制的。

 程序代码:

 黑马程序员——Java基础——数组操作应用

应用二  获取最值

思路

获取最值需要进行比较。每一次比较都会有一个较大的值,因为该值不确定。通过一个变量进行临时存储

让数组中的每一个元素都和这个变量中的值进行比较。如果大于变量中的值,就用该变量记录较大值。

当所有的元素都比较完成,那么该变量中存储的就是最大值了。

步骤

定义变量,初始化为数组中任意一个元素即可。

通过循环语句对数组进行遍历。

在变量过程中定义判断条件,如果遍历到的元素比变量中的元素大,就赋值给该变量。

 

需要定义一个功能来完成,以便提高复用性。

明确结果,数组中的最大元素int

有未知内容:一个数组,int []

另外一种方式

可不可以将临时变量初始化为0呢?

可以,这种方式其实是在初始化为数组中任意一个脚标。

代码

Public static int getMax(int [] arr)

{

 int max=0;

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

{

ifarr[x]>arr[max]

max=x;

}

return arr[max];

}

获取double类型数组的最大值,因为功能一致,所以可以重载

public static double getMax(double [] arr)

应用三   排序

    1、选择排序

最值最先出现在第一个位置。

   代码

黑马程序员——Java基础——数组操作应用

  运行结果

  黑马程序员——Java基础——数组操作应用

2、冒泡排序

 代码:

黑马程序员——Java基础——数组操作应用

运行结果:

黑马程序员——Java基础——数组操作应用

3、快速排序

  代码

黑马程序员——Java基础——数组操作应用

运行结果:

黑马程序员——Java基础——数组操作应用

应用四  查找

折半查找代码

黑马程序员——Java基础——数组操作应用

运行结果

黑马程序员——Java基础——数组操作应用

应用四:进制转换

代码:

黑马程序员——Java基础——数组操作应用

运行结果:

黑马程序员——Java基础——数组操作应用

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------