黑马程序员——Java基础知识——数组

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

 一、数组

       同一种类型数据的集合,可以理解为一个容器。数组中可以自动给数组中的元素从0开始编号,方便对数组中的元素进行操作。

 数组格式:

         (1)元素类型[]数组名=new 元素类型[元素个数]。例如:int [ ] x=new int[4]。其中new的作用是用来在对内存中产生一个容器实例。

         (2)元素类型[]数组名=new 元素类型[ ]{元素0,元素1,元素2...........}。例如:int [ ] x=new int [ ]{0,1,2,3}。其中中括号内不应写数组的长度,以免与后面列明的  元素个数不符,造成错误。

         (3)元素类型[]数组名={元素0,元素1,元素2...........}。例如:int [] x={0,1,2,3}。这是数组的静态初始化格式。

          数组在对内存开辟空间后,就会有表示其在内存中地址值的哈希值,引用变量就是通过获得数组的哈希值来实现对数组的引用;数组一创建,根据元素类型的  不同,数组中的元素就会有默认的初始化值。例如:int类型对应的初始化值是0,boolean型对应的是false,float对应的是0.0f。

          数组的创建与引用涉及到栈内存与堆内存。内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁,计算机所有程序的运行都在内存中进行。Java程序  在运行时,需要在内存中的分配空间。为了提高运算效率,对空间进行不同区域的划分。因为每一片区域都有特定的处理数据方式和内存管理方式。

          栈内存:用于存储局部变量(定义在方法中的变量、定义在方法中参数的变量、定义在for循环中的变量)。当数据使用完,所占空间会自动释放。

          堆内存:1.存放数组和对象,通过new建立的实例都存放在堆内存中。

                        2.每一个实体都有内存地址值(存放位置)。

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

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

          通过图例,表明数组在内存中的结构分配:

            int [ ] x=new int[4];

           黑马程序员——Java基础知识——数组_第1张图片     

              x是通过获取数组的哈希值指向、引用数组。数组的元素初始化值是0.

            int [ ] y=x;

            黑马程序员——Java基础知识——数组_第2张图片

                      x赋值给y,y也获得数组的哈希值,从而指向数组。

                  y[1]=23;

                   黑马程序员——Java基础知识——数组_第3张图片

                      数组被y修改,此时x[1]也是23。

                     x=null;

                     黑马程序员——Java基础知识——数组_第4张图片         

                         x不再指向数组,y还在指向。

        注意:在数组的使用中有时会出现一些问题,其中有两个问题是比较常见的:

                  (1)ArrayIndexOutOfBoundsException:数组脚标越界异常,操作时访问到了数组中不存在的脚标。

                  (2)NullPointerException:空指针异常,引用没有指向实体,却在操作实体中的元素。

 二、数组的操作  

         获取数组中的元素,对元素进行操作,一般都会用到遍历(即循环,通常用for循环)。arr.length表明数组的长度,用于直接获取数组中的元素个数,在操作时    会经常用到。下面介绍几种常用的操作。

        (1)获取数组中的最大值。例如:     

class ArrayDemo1
{
	public static void main(String[]args){
		 int[]arr={1,2,45,66,12,12,35};
         getMax(arr);
	}
	public static int getMax(int[]arr){
        //定义变量,用于存储最大值的脚标
		int max = 0;
		//遍历数组
		for(int x=1; xarr[max])
				max = x;
		}
		return arr[max];//返回数组中的最大值
	} 
}

    (2)对数组中的元素按照自然大小排序,通常用的两种方法:选择排序和冒泡排序。

       选择排序,例如:

    public static void selectSort(int[] arr)
	{
		//遍历数组 
		for(int x=0; xarr[y])
				{
					int temp = arr[x];
					arr[x] = arr[y];
					arr[y]= temp;
				}
			}
		}
	}
           冒泡排序,例如:
public static void bubbleSort(int[] arr)
	{
		for(int x=0; xarr[y+1])
				{
					int temp = arr[y];
					arr[y] = arr[y+1];
					arr[y+1] = temp;
				}
					
			}
		}
	}
         (3)查找数组中的元素

                  对数组中的元素进行查找,常用的是折半查找,效率比较高,但数组必须是有序的。

                例如:

public static int halfSearch(int[] arr,int key)//定义折半查找方法,传入数组和要查找的数值
	{
		int min,max,mid;//定义变量,分别记录最小、最大和中间角标,遍于查找
		min = 0;
		max = arr.length-1;
		mid = (max+min)/2;

		while(arr[mid]!=key)
		{       
			if(key>arr[mid])
				min = mid + 1;//如果要查找的值大于中间脚标的值,则从中间脚标后面的值开始查找。
			else if(key
        (4)进制转换

                   利用数组来完成整数之间的进制转换。例如:

class ArrayDemo2
{
	public static void main(String[] args) 
	{
		toBin(60);
		toHex(60);
		toOctal(60);
    }

	/*
	十进制-->二进制
	*/
	public static void toBin(int num)
	{
		trans(num,1,1);
	}

	/*
	十进制-->八进制
	*/
	public static void toOctal(int num)
	{
		trans(num,7,3);
	}
	/*
	十进制-->十六进制
	*/
	public static void toHex(int num)
	{
		trans(num,15,4);
	}

	public static void trans(int num,int base,int offset)
	{
         //如果传入的是0,直接打印0,不再向下操作。
		if(num==0)
		{
			System.out.println(0);
			return ;
		}
		//定义一个字符数组,存储各进制中的数字与字母。
		char[] chs = {'0','1','2','3'
					,'4','5','6','7'
					,'8','9','A','B'
					,'C','D','E','F'};
		//定义一个数组,用于临时存储获得的对应字符
		char[] arr = new char[32];
        //定义数组中的指针,用于操作字符的存储位置
		int pos = arr.length;

		while(num!=0)
		{
			int temp = num & base;
			arr[--pos] = chs[temp];//查表,获得对应字符,并从数组的最后开始存放。
			num = num >>> offset;//右移对应位数
		}
                //通过遍历,打印获得的转换结果
		for(int x=pos; x

 三、二维数组

二维数组格式:

           (1)元素类型[ ][ ]数组名=new 元素类型[二维数组的长度 ][每个一维数组的长度 ],例如int[ ][ ] x=new int[3][2],表明这个二维数组中有3个长度为2的一位数组。其  中三个一维数组分别用x[0],x[1],x[2]来表示,第一个数组中第一个元素用x[0][0]来表示,以此类推。此格式也可写成int[ ]x[ ]或int x[ ][ ]。

            (2) 元素类型[ ][ ]数组名=new 元素类型[二维数组的长度 ][ ],例如int[ ][ ] x=new int[3][ ],表明该二维数组中有3个一维数组,每一个一维数组都是默认的初始值  null。

            (3) 元素类型[ ][ ]数组名={{元素(0)0,元素(0)1},{元素(1)0,元素(1)1},{元素(2)0,元素(2)1}},例如int[ ][ ] x={{1,2},{3,4},{5,6}}; 二维数组的静态初始化方式,每一个一维数组中的元素都初始化了。       

        二维数组在内存中的结构分配,如图:

         int[ ][ ]x=new int[2][4]

          黑马程序员——Java基础知识——数组_第5张图片

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

你可能感兴趣的:(Java学习)