黑马程序员——Java之数组

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


一 数组

概念:同一种类型数据的集合,其实数组就是一个容器。

好处:可以自动给数组中的元素从0开始编号,方便操作这些元素。

与其他容器区别:数组创建后不能改变其大小且存放同一类型数据

因为Java是典型的静态语言,因此它的数组也是静态的,所以想要使用就必须先初始化(为数组对象的元素分配空间)。

1.    数组初始化

(1)静态初始化

初始化时由程序员显式指定每个数组元素的初始值,由系统决定数组长度

//指定初始值,长度系统自动指定为3.

         String[]str1=new String[]{"a","b","c",”d”};

        //简化形式。

       String[] str={"aa","bb","cc"};

2)动态初始化

初始化时由程序员显示的指定数组的长度,由系统为数据每个元素分配初始值

//指定长度,没有初始化系统会为其自动初始化。

String[] str=new String[3];

2.   多维数组

多维数组就是数组中的数组。二维数组最常用的数组。

(1)  静态初始化

定义了包含三个元素的数组,而每个数组里面又包含了俩个元素的数组。

int x[][]={{1,2},{2,3},{3,4}};

(2)  动态初始化

定义了包含三个元素的数组,而每个数组里面又包含了三个元素的数组。

int a[][]=new int[3][3];

         a[0][0]=1;

         a[0][1]=2;

      a[0][2]=3;

         a[1][0]=4;

      a[1][1]=5;

3.  数组内存结构解析

栈:数据使用完毕自动释放,(主函数在栈中)

堆:存放实体,不引用时则垃圾回收。

(1) 基本类型数组内存结构


 

a:凡是new出来的东西都在堆中存放,例如数组:数组名存放在栈中,数组实体存放在堆中,数组名的值只是数组实体在堆中的起始地址。

b:堆内存中每个实体都有一个内存地址值。数组是通过下标访问其中的每个元素。

c:数组在堆中有默认的初始值:bute,int,short,long默认0;float默认0.0f,double默认0.0;char默认‘\u0000’;boolean默认false;引用数据类型默认null。

d:当数组的值等于null时,就是垃圾,java会在适当的时候启动垃圾回收机制给清除。

(2)引用型数组内存结构

 

a:把一个数组的值赋值给另一个数组时,只是复制地址,是两个引用指向同一数组。

b:当把其中的一个数组等于null时,只是把栈中的其中一个数组的值设为空,不指向堆中的实体了,但还有一个栈中的数组指向对堆中的实体,所以此时堆中没有垃圾。

4.数组异常

ArrayIndexOutOfBoundsException:操作数组时,访问到了数组中不存在的角标,即数组越界。

NullPointerException:空指针异常。例如:当引用没有任何指向,值为null时,该引用还在用于操作实体。

5.数组常见操作

(1)数组排序

Java数组排序共分为8种排序,最常见的也是面试的时候常考的是选择排序和冒泡排序,而在系统中最快的是希尔排序,如图;


class  ArrayDemo1
{
/**
数组常见操作:选择排序。(从小到大)
选择排序原理是把数组循环两遍,第一遍的数组的第一个元素和嵌套循环里面的元素逐个进行比较。
思路:
(1)对数组中值进行比较,较大值存储到一个临时变量中。
(2)获取数组中的每个值,每个值,则与变量相比较,如果大则存储到这个临时变量中,小则继续比较其他值。
(3)当所有值都比较完,则这个临时变量的值就是最大值,输出。
*/
	public static void chooseSort(){
       int[] arr={2,6,65,32,36,58,65,22};
	   for(int x=0;x<arr.length-1;x++){//数组的最后一个值不用相比较,所以-1;
		   for(int y=x+1;y<arr.length;y++){
			  if(arr[x]>arr[y]){
              int temp=arr[x];//
              arr[x]=arr[y];
			  arr[y]=temp;
		 }
	   }
	  }
	   System.out.println(Arrays.toString(arr));
	}
/**
方式二:冒泡排序。
冒泡排序原理就是数组中的相近元素两两相比较,符合条件则换位,
*/
	public static void bubbleSort(){
		int[] arr={2,6,65,32,36,58,65,22};
		for(int x=0;x<arr.length-1;x++){
			for(int y=0;y<arr.length-x-1;y++){
				//-x是因为循环几次比较最后几个值就不再需要比较,可以省去。
				//-1 是因为防止角标越界。
               if(arr[y]>arr[y+1]){
               int temp=arr[y];
			   arr[y]=arr[y+1];
			   arr[y+1]=temp;
			   }
			}
		}
		System.out.println(Arrays.toString(arr));
	}
	public static void main(String[] args) 
	{
		//chooseSort();
		bubbleSort();
	}
}



------------------- Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ---------------------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值