黑马程序员--Java基础学习(数组)第四天

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

Java基础学习(数组)第四天
一,概述
数组的定义:数组是一个容器,是同一种类型的数据集合。
好处:数组可以自动对元素编号。
定义方式:格式1:元素类型[] 数组名 = new 元素类型[元素个数或数组长度];//new在内存中产生容器实体。
格式2:元素类型[] 数组名 = new 元素类型[]{元素1,元素2,……};或 元素类型[] 数组名  = {元素1,元素2,……};
示例:int[] x = new int[3];//定义长度为三的数组,数组内的元素为整型。
数据类型的分类:1,基本数据类型如(int ,char,long,float等)。2,引用数据类型如(数组类型,字符串类型);
  内存区域分布:Java在运行时在空间中划分五块区域:栈内存,堆内存,方法区,本地方法区,寄存器。
  栈内存:栈内存用于存储局部变量,当数据使用完,所有空间会自动释放。
  堆内存:1,数组和对象,通过new创建的实例都存放在堆内存中。2,每一个实例都有内存地址值。3,实体中的变量都有默认初始化值。4,实体不再被使用,会在不确定   的时间内被垃圾回收器回收。
  数组在内存中示意图:
  

数组实体在堆内存中,每个元素有默认初始化值,整型数组初始化值为0。
二,常见问题
//ArrayIndexOutOfBoundsException: 操作数组时,访问到了数组中不存在的角标。
//NullPointerException:空指针异常:当引用没有任何指向值为null的情况。该引用还在用于操作实体。
三,遍历
数组的操作:获取数组中元素,通常会用到遍历。
数组中可获取长度的属性。数组名.length。
遍历数组的示例:
class ReadArray 
{
	public static void main(String[] args) 
	{
		//定义一个数组
		int[] arr = {4,5,6,7,8};

		int x;
		//循环遍历数组输出数组中元素内容
		for(x=0 ; x<arr.length; x++){
			System.out.println("arr["+x+"]"+"="+arr[x]);
		}
	}
}


输出结果为:
四,排序
1,选择排序。2,冒泡排序
选择排序示例:
	//选择排序
	/**
	给int数组进行选择排序
	@param arr 接收一个int类型的数组
	*/
	public static void selectSort(int[] arr)
	{
		for(int x=0; x<arr.length-1; x++)
		{
			for(int y=x+1; y<arr.length; y++)
			{
				if(arr[x]>arr[y])
				{
					swap(arr,x,y);
				}
			}
		}
	}


冒泡排序示例:
	//冒泡排序
	/**
	给int数组进行冒泡排序
	@param arr 接收一个int类型的数组
	*/
	public static void bubbleSort(int[] arr)
	{
		for(int x=0; x<arr.length-1; x++)
		{
			for(int y=0; y<arr.length-x-1; y++)
			{
				if(arr[y]>arr[y+1])
				{
					swap(arr,y,y+1);
				}
			}
		}
	}


五,数组元素位置置换
元素置换示例:
	//数据交换
	/**
	给数组中的元素进行位置的置换。
	@para arr 接收一个int类型的数组。
	@para a 要置换的位置
	@para b 要置换的位置
	*/
	private static void swap(int[] arr,int a,int b)//私有化此功能,只暴露出需要的功能
	{
		int temp = arr[a];
		arr[a] = arr[b];
		arr[b] = temp;
	}


六,查找
数组查找操作,有序数组可以折半查找。
折半查找示例:
	折半查找必须保证数组是有序的。
	*/
	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<arr[mid])
				max=mid - 1;
			if(min> max)
				return -1;
			mid = (max+min)/2;
		}
		return mid;
	}


七,进制转换
十进制转二进制示例:
	/*
		十进制--》二进制
	*/
	public static void toBin(int num)
	{
		StringBuffer sb = new StringBuffer();//存数据的容器。
		while(num>0)
		{
			//System.out.println(num%2);
			sb.append(num%2);//一个功能每算一个存入内存。
			num=num/2;
		}
		System.out.println(sb);
		System.out.println(sb.reverse());//数据翻转。
	}


十进制转十六进制示例:
	/*
	十进制-->十六进制
	*/
	public static void toHex(int num)
	{
		StringBuffer sb = new StringBuffer();

		for(int x=0;x<9; x++)
		{
			int temp = num & 15;
			if(temp>9)
				//System.out.println((char)(temp-10+'A'));
				sb.append((char)(temp-10+'A'));
			else
				sb.append(temp);
				//System.out.println(temp);
			num = num >>> 4;
		}
		System.out.println(sb.reverse());
	}


十进制转十六进制查表法示例:
/*
	0 1 2 3 4 5 6 7 8 9 A  B  C  D  E  F  十六进制中的元素
	0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
	查表发: 将所有的元素临时存储起来。建立对应关系。
	每一次&15后的值作为索引去查建立好的表。就可以找对应的元素。
	这样比 -10+‘a’简单的多。

	这个表怎么建立那?
	可以通过数据的形式来定义。

	发现终于出结果了。但是是反着的,想要正过来呢?可以通过StringBuffer reverse功能来完成。
	但是这个工具还没有学习。

	所以可以使用已经学习过的容器:数组来完成存储。;
	*/

	public static void toHex_2(int num)
	{
		/*
		char [] chs = {'0','1','2','3'
		,'4','5','6','7'
		,'8','9','A','B'
		,'C','D','E','F'};
		//定义一个临时容器。
		char [] arr = new char[8];
		int pos = arr.length;//-1;//指针变量;
		//for(int x=0; x<8; x++)
		while(num!=0)
		{
			int temp = num & 15;
			//System.out.println(chs[temp]);
			 arr[--pos] = chs[temp];//先自减
			num = num>>> 4;
		}

		System.out.println("pos="+pos);

		//存储数据的arr数组遍历。
		for(int x=pos; x<arr.length; x++)
		{
			System.out.print(arr[x]+",");
		}
		*/
		trans(num,15,4);
	}
	/*取查表法十六进制转换和二进制转换的共性部分定义一个十进制到
	二进制,八进制,或者十六进制的转换功能函数
	*/
	public static void trans(int num,int base,int offset)
	{
		if(num==0)//如果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<arr.length; x++)
		{
			if(x==arr.length-1)
				System.out.println(arr[x]);
			else
				System.out.print(arr[x]+",");
		}

	}
}


十进制转二进制查表法示例。
// 查表法十进制--》二进制转换
	public static void toBin_2(int num)
	{
		/*
		//定义二进制的表。
		char[] chs = {'0','1'};

		//定义一个临时存储容器。
		char [] arr = new char[32];

		// 定义一个操作数组的指针
		int pos = arr.length;

		while(num!=0)
		{
			int temp = num & 1;
			arr[--pos] = chs[temp];

			num = num >>> 1;
		}

		for(int x=pos; x<arr.length; x++)
		{
			System.out.print(arr[x]+",");
		}
		*/
		trans(num,1,1);//调用共用的转换函数
	}


八,二维数组
二维数组定义方式如:int[ ] [ ] arr = new int [ ] [ ];
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值