黑马程序员—【Java基础篇】之数组

------- android培训 java培训 、期待与您交流! ---------

    下面开始分享和总结Java数组,数组的内容如下:1. 定义;2. 内存分配及特点;3. 数组操作常见问题;4. 数组常见操作;5 .数组中的数组。

 一、数组定义

1、定义:数组是一种数据结构,用来存储同一类型值的集合。通俗说发,就是一个存放同种类型的容器;就相当与一个的桶,可以装水,也可以装汽油。

2、使用数组的好处:数组可将其中的每一个值自动添加对应的编号,每一个值称为一个元素,元素从0开始编号,方便对每个元素的管理。

二、格式

1、格式1

    数据元素类型 [ ] 变量名 = new  元素类型 [参数]; 说明:参数表示数组中元素的个数。

<pre name="code" class="java">//格式一:内存分配形式 
String [ ]  a = new  String [10];
System.out.println(a);//注:得到的结果是一个哈希值,也叫地址值。
/**
        2、数组在堆内存开辟空间后,就有默认的初始化值。如:String默认null;boolean默认false。
内存小知识:
Java程序在运行时,需要在内存中的分配空间。为了提高运算效率,有对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
 栈内存:用于存储局部变量,当数据使用完,所占空间会自动释放。
堆内存:
1、数组和对象,通过new建立的实例都存放在堆内存中。
2、每一个实体都有内存地址值。
3、实体中的变量都有默认初始化值。
4、实体不在被使用,会在不确定的时间内被垃圾回收器回收。
*/
 
 
 
 
 
 

     内存分配情况如图:

    

    2、格式2

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

//格式2的内存分配形式
String [] a = new int[]{"a","b","c","d","e"};
int [] a = {3,5,1,7};

 
 

  3、赋值

//格式3:
int [] [] arr = {{3,8,2},{2,7},{9,0,1,6}};
//每一个一维数组中具体元素都初始化了。
// 注:一种特殊定义写法:
int [] x, y[]; //x是一维数组,y是二维数组。

(1)数组初始化

    a.对于上面两种格式的赋值:  java中,可以将一个数组的变量的引用值赋给另一个数组的变量。

如:String[] b = a;
 

    b.还可以定义匿名数组:

如:new int[]{3,2,6,7,9,1,4}
 

(2)数组间的赋值

    第1种:隐式初始化,每个元素的值都为相对应的各类型的初始化值,具体看数据类型的总结。

    第2种:显式初始化,每个元素都已经被赋予初值。

    java中,可以将一个数组的变量的引用值赋给另一个数组的变量。如:String[] b = a;

三、数组操作的常见问题

1、数组脚标越界异常(ArrayIndexOutOfBoundsException)。

例:

/**
数组脚标越界异常:ArrayIndexOutOfBoundsException;
例:int[] arr = new int[2];
System.out.println(arr[3]);
访问到了数组中的不存在的脚标时发生。
*/

 

2、空指针异常

/**空指针异常:NullPointerException异常;
例:
int[]arr = null;
System.out.println(arr[0]);
*/

 
    arr引用没有指向实体,却在操作实体中的元素时。 

四、多维数组

    对于初级阶段:主要是指二维数组。

1、格式1 

/**格式1:
    int[][] arr= new int[3][2];
    解释:以上格式表示定义了名称为arr的二维数组。有3个一维数组,每一个一维数组中有2个元素。
    一维数组的名称分别为:
   arr[0],arr[1],arr[2]。
   给第一个一维数组1脚标位赋值为78写法是:
   arr[0][1] = 78;
*/




 
 

2、格式2

//元素类型[] 变量名 = new 元素类型[]{元素1,元素2,......};
//如:
int[] a = new int[10]{0,1,2,3,4,5,6,7,8,9};

 

3、格式3

     二维数组在内存中的分配情况 

    图例1:

    图例2:

    图例3:

五、数组的常见操作

    数组的常见操作:

1、获取最大值

/**第1题:获取数组中的最大值 
思路:将数组中的元素进行从小到大(或从大到小)的排列,然后取第一个元素为最小值,取最后一个值为最大值 
步骤: 
    1、创建类ArrayMaxDemo。 
    2、创建一个数组并赋值。 
    3、用for循环对其进行筛查。 
    4、打印Max。
*/  
  
class ArrayMaxDemo
 
{  
    //定义功能:在数组中取最大值  
    public static int getMax(int[] arry)  
    {  
        int max = arry[0];  
        for (int i=0;i<arry.length;i++)  
        {  
            //用第一个元素的值和后面的比较,大则换值  
            if (max<arry[i])  
            {  
                max = arry[i];  
            }  
        }  
        return max;  
    }  
  
    public static void main(String [] args)  
    {  
        int[] arr = {5,2,4,8,6,1,9};  
        int max = getMax(arr);//获取最大值的方法  
        System.out.println("getMax方法:arr数组中最大值为;" + max);  
    }  
}

2、数组的排序(选择和冒泡)

/**
    定义功能:选择排序思路:
     1.for嵌套循环数组;
     2.先把数组中最小的筛选出来;
     3.通过外for循环一遍又一遍的筛查,对数组进行循环;</span>
     4.最终完成数组升序的排序。
*/  
import java.util.*;  
class ArrayText  
{  
    //第一种排序方法:选择排序  
    public static void getSelectSort(int[] arry)  
    {  
        for (int j=0;j<arry.length;j++)  
        {  
            //i=j,每比较一轮就减少一个数,比较后,再用第二个数获得后面的最小值  
            for (int i=j+1;i<arry.length;i++)  
            {  
                //换值  
                if (arry[j]>arry[i])  
                {  
                    int temp = 0;  
                    temp = arry[j];  
                    arry[j] = arry[i];  
                    arry[i] = temp;  
                }  
            }  
        }  
    }  
需求:数组升序排序
思路:
 1.相邻两个元素比较,其中外for循环定义循环比较次数。</span>
 2.内循环</span>
//第二种排序方法:冒泡排序--相邻的两个元素比较  
    public static void getBubbleSort(int[] arr)  
    {  
        for (int j=0;j<arr.length;j++)  
        {  
            for (int i=1;i<arr.length-j;i++)//小技巧:设置为1是为了防止越界  
            {  
                if (arr[i-1]>arr[i])//若改成<是从大到小排序  
                {  
                    int temp = 0;  
                    temp = arr[i-1];  
                    arr[i-1] = arr[i];  
                    arr[i] = temp;  
                }  
            }  
        }  
    }  
  
    public static void main(String [] args)  
    {  
//打印原数组。
        int[] arr0 = {5,2,4,8,6,1,9};  
        System.out.println("arr数组排序前:\n"+ Arrays.toString(arr0));  //调用了Arrays中toString()方法。
        System.out.println();

//打印选择排序后数组。
        int[] arr1 = {5,2,4,8,6,1,9};  
        System.out.println("选择排序方法:arr数组排序后:\n"+ Arrays.toString(arr1));//打印排序后的数组  
        System.out.println();

//打印Java自带排序。
        int[] arr2 = {5,2,4,8,6,1,9};  
        Arrays.sort(arr2);//java中自带的排序函数  
        System.out.println("java中自带的排序函数sort:arr数组排序后:\n"+Arrays.toString(arr2));  
        System.out.println();</span>


//打印冒泡排序后数组。
        int[] arr3 = {5,2,4,8,6,1,9};  
        getBubbleSort(arr3);//第二种排序方法  
        System.out.println("冒泡排序方法:arr数组排序后:\n"+ Arrays.toString(arr3));   
        System.out.println("arr数组中最大值为:" + arr3[arr3.length-1]);  
    }  
}

 

 

3、数组的查找

需求:数组key查找。
思路:1.循环;    2.条件判断key ==arr[i];    3.返回脚标 i,否则返回-1。
import java.util.*;  
class FindArry  
{  
    //方法一:遍历每一个元素查找  
    public static int findarr(int[] arr,int key)  
    {  
        for(int i=0;i<arr.length;i++)  
        {  
            if(arr[i] == key)  
            {  
                return i;  
            }  
        }  
        return -1;  
    }  
  
    /**
需求:数组key查找。
     思路:
        1.折半,前提是数组是按大小顺序排列好的,  
        2.用查找的值和中间值比较,大则和下一半中间值比依次,小则和上一半中间值比,找到则返回。
        3.小值的编号在左移或大值的编号在右移。要判断是否大小值的编号相遇,仍若未找到,则不再循环,返回-1。
*/
    public static int FindArry1(int[] arr,int key)  
    {  
        int min,max,mid;  
        min = 0;  
 max = arr.length-1;  
        mid = (min + max)/2;  
          
        //循环,查找中间值与要查找的值比较  
        while(key != arr[mid])  
        {  
            if (key > arr[mid])  
                min = mid +1;  
            else   
                max = mid - 1;  
            if (min > max)  
                return -1;  
            mid = (min + max)/2;  
        }  
        return mid;  
    }  
  
    //方法三:折半第二种  
    //while的条件改变  
    public static int FindArry2(int[] arr,int key)  
    {  
        int min,max,mid;  
        min = 0;  
        max = arr.length-1;  
          
          
        //循环,查找中间值与要查找的值比较  
        while(min <= max)  
        {  
            mid = (min + max)>>1;  
            if (key > arr[mid])  
                min = mid +1;  
            else if(key<arr[mid])  
                max = mid - 1;  
            else  
                return mid;  
        }  
        return -1;  
    }  
  
    public static void main(String [] args)  
    {  
        int[] arr = {1,6,11,2,8,5,3,13};  
        int m = findarr(arr,3);  
        System.out.println("m=" + m);  
          
        int x = FindArry1(arr,6);  
        int y = FindArry2(arr,38); 
	System.out.println("\n 6的脚标x=" + x); 
	System.out.println("\n 38的脚标y=" + y);
	}  
}
 
 
 
 


额,现在是凌晨40分了,挨不住了,伙伴们,晚安,明天见。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值