黑马程序员———数组


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

数组

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

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

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

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

格式二: 元素类型[] 数组名 = new 元素类型[] {元素,元素,......}

示例:

int [] arr = new int [] {2,3,4,5};

int [] arr = {3,2,3,4};

 

内存结构

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

栈内存: 用于存储局部变量,当数据使用完,所占空间会自动释放。

堆内存:

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

B  每一个实体都有内存地址值

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

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

还有方法区,本地方法区,寄存器。

null: 内存地址指向为空

C++ 由程序员手动清除内存,Java程序员不用手动清除,对象或实体变为垃圾,Java虚拟机的垃圾回收机制自动将内存中不再被使用的实体不定时清除

关于数组的一些练习程序

package day01;
/*获取数组中的最大值
 * 思路:
 * 1,获取最值需要进行比较,每一次比较都会有一个较大的值,因为该值不确定,通过一个变量进行临时存储
 * 2,让数组中的每一个元素都和这个变量中的值进行比较,如果大于了变量中的值,就用该变量记录较大值
 * 3,当所有的元素都比较完成,那么该变量中存储的就是数组中的最大值了
 * 步骤:
 * 1,定义变量,初始化为书中任意一个元素即可
 * 2,通过循环语句对数组进行遍历
 * 3,在遍历过程中定义判断条件,如果遍历到的元素比变量中的元素大,就赋值给该变量
 * 
 * */
public class ArrMax {

	public static void main(String[] args) {
		int [] arr = {2,3,4,2,34,445,33};
		System.out.println(getMax(arr));

	}
	public static int getMax(int[] arr){
		//中间变量
		int temp = arr[0];
		for(int i=0; i <arr.length; i++){
			//如果元素大于temp 就把它的值赋给temp
			if(arr[i]>temp)
				temp = arr[i];
		}
		return temp;
	}

}

输出结果:445

选择排序:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完

示图:

示例代码:

package day01;

import java.util.Arrays;

public class ArrDemo {

	public static void main(String[] args) {
		//给定数组
		int[] arr = {2,5,1,4,7};
		//排序
		selectSort(arr);
		System.out.println(Arrays.toString(arr));

	}
	//选择排序
	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]){
					int temp = arr[x];
					arr[x] = arr[y];
					arr[y] = temp;
				}
					 
				
			}
		}
		
	}

}

 

打印结果[1,2,4,5,7]

冒泡排序:重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

package day01;

import java.util.Arrays;

public class ArrDemo {

	public static void main(String[] args) {
		//给定数组
		int[] arr = {2,5,1,4,7};
		//排序
		bubbleSort(arr);
		System.out.println(Arrays.toString(arr));

	}
	//冒泡排序
	public static void bubbleSort(int[] arr){
		for(int x = 0; x < arr.length-1; x++){
			for(int y = 0; y < arr.length-1-x; y++){//-x:让每一次比较的元素减少;-1避免角标越界
				//交换元素位置
				if(arr[y] > arr[y+1]){
					int temp = arr[y];
					arr[y] = arr[y+1];
					arr[y+1] = temp;
				}
			}
		}
	}


 

打印结果[1,2,4,5,7]

折半查找

package day01;

import java.util.Arrays;

public class ArrDemo {

	public static void main(String[] args) {
		//给定数组
		int[] arr = {1,2,3,4,7,9,11};
		int index = halfSearch_2(arr,4);
        System.out.println(index);
	}
	//第一种折半
	public static int halfSearch(int[] arr,int key){
		int min = 0	,max = arr.length-1, mid;
		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 int halfSearch_2(int[] arr,int key){
		int min = 0	,max = arr.length-1;
		int mid = (min + max)>>1;
		while(key != arr[mid]){
			if(key > arr[mid])
				min = mid + 1;
			else if (key < arr[mid])
				max = mid -1;
			if(min > max)
				return -1;
			mid = (min + max)>>1;	 
			
		}
		
		return mid;
	}
	

}


 

打印结果:3

将十进制转化为二进制、八进制、十六进制

示例代码:

package day01;
//查表法十进制到二进制 八进制 十六进制的转换
public class Trans {
	public static void main(String [] arrgs){
		toBin(6);
		System.out.println();
		toOct(43);
		System.out.println();
		toHex(345);
	}
	//转换为二进制
	public static void toBin(int num){
		trans(num,1,1);
	}
	//转换为八进制
	public static void toOct(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) {
		//如果num等于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) {
			//num 与base 相与
			int temp = num & base;
			//将查到的字符存储到arr的--pos角标
			arr[--pos] = chs[temp];
			//num无符号右移offset位
			num = num >>> offset;
		}
		for (int i = pos; i < arr.length; i++) {
			System.out.print(arr[i]);
		}
	}

}


 

输出结果:

110
53
159

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值