数组及其应用

一、数组
1.概念:同一种数据类型的集合。(长度是固定的)
2.好处:可以自动给数组中的元素从0开始编号,方便操作这些元素。
3.格式1: 元素类型[] 数组名 = new 元素类型[元素个数或数组长度] int [] arr = new int [8];
4.格式2: 元素类型[] 数组名 = new 元素类型[]{元素,元素,……} int [] arr = new int []{9,8,0,7,0};
5.格式3: 元素类型[] 数组名 = {};int [] arr = {3,53,5,6,26};
6.new关键字,表示创建一个新的对象。
7.创建一个空的数组,虚拟机会自动给数组赋值为0。
8.赋值: 例:arr [0] = 8;
int [] arr = new int [] {2,5,8,0}
9.注意点:角标不能越界.
空指针异常:arr = null
10.java内存结构: 栈内存:用于存储函数中的局部变量,当数据用完时,所占空间会立即自动释放。
堆内存:对象和数组,通过new建立的实例都存放在当中。
本地方法区: 是jvm虚拟机调用系统使用的,应用层无法使用
寄存区:cpu运算时使用的内存块
11.数组的遍历:
int [] arr = {23,45,22,33,532,54,5};
		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
13.排序
语法:  Arrays.sort(数组名);
可以使用 sort( ) 方法实现对数组的排序,只要将数组名放在 sort( ) 方法的括号中,就可以完成对该数组的排序(按升序排列)
13.  将数组转换为字符串
语法:  Arrays.toString(数组名);
可以使用 toString( ) 方法将一个数组转换成字符串,该方法按顺序把多个数组元素连接在一起,多个元素之间使用逗号和空格隔开
14.数组的扩容
语法:Arrays.copyOf(original, newLength);
15.数组的复制
语法:System.arraycopy(src, srcPos, dest, destPos, length);
16.foreach
for(元素类型 元素变量:遍历对象){
执行的代码块
}
foreach获取脚标
public class ForEach {
	public static void main(String[] args) {
    String [] aaa = {"小花","小明","小绿","小白","小蓝","小猫咪","小狗狗"};
    int i = 0;
    for (String aa : aaa) {
	  System.out.println(aa + "["+i+"]");//+i为了输出脚标
	i++;
      }
	}
}

17.如何对数组进行初始化
* a: 动态初始化只指定长度,由系统给出初始化值
* int[] arr = new int[5];
int []arr= {5,4,3,2,1};
动态初始化的 格式
* 数据类型[] 数组名 = new 数据类型[数组长度];
* b: 静态初始化 给出初始化值,由系统决定长度

二、数组的应用
1.最大值:
public static int getMax(int[] arr) {
		int tmp = arr[0];
		int num = -1;
		if (arr != null){
			for (int i = 0; i < arr.length; i++) {
				if (arr[i] > tmp) {
					tmp = arr[i];
				}
			}return tmp;
		}else return num;
}
2.冒泡排序:两数相比,将大的放后面,第一次循环后最 的在最后面。
array[j] < array.length-1-i 防止脚标越界
public class Array01 {

	public static void main(String[] args) {
		int[] arr = { 2, 5, 3, 66, 4, 23, 62 };
		maoPao(arr);
		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
	}

	public static void maoPao(int[] array) {
		int tem = 0;
		if (array != null) {
			for (int i = 0; i < array.length; i++) {
				for (int j = 0; j < array.length - 1 - i; j++) {
					if (array[j] > array[j + 1]) {
						tem = array[j];
						array[j] = array[j + 1];
						array[j + 1] = tem;
					}
				}

			}
		}

	}
}
3.选择排序:第i 次循环:取第i个逐级往下进行对比,选出最 的排在最前。(位置不变,数变)
public class Array02 {

	public static void main(String[] args) {
		int[] arr = { 23, 45, 22, 33, 532, 54, 5 };
		xuanZhe(arr);
		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
	}

	public static void xuanZhe(int[] arr) {
		int tmp = 0;
		if (arr != null) {

			for (int i = 0; i < arr.length; i++) {
				for (int j = i + 1; j < arr.length; j++) {
					if (arr[i] > arr[j]) {
						tmp = arr[i];
						arr[i] = arr[j];
						arr[j] = tmp;
					}
				}

			}
		}
	}
}
4.二分查找:对有序的数组进行二分查找。
public class HalfSearch {

	public static void main(String[] args) {
		int[] arr = { 2, 3, 5, 7, 13, 15, 33 };
		search(arr, 33);
	}

	public static void search(int[] arr, int num) {
		int begin = 0;
		int index = 0;
		int end = arr.length;
		int middle = (begin + end) / 2;
		if (arr != null) {
			for (int i = 0; i < arr.length; i++) {
				if (arr[middle] == num) {
					index = middle;
				} else if (arr[middle] > num) {
					end = middle - 1;
					middle = (begin + end) / 2;
				} else {
					begin = middle + 1;
					middle = (begin + end) / 2;
				}
			}
			System.out.println(index);
		}
	}
}
4.基本查找:
public class JibenSearch {

	public static void main(String[] args) {
		int[] arr = { 3, 4, 1, 45, 22, 44, 64, 6 };
		System.out.println(search(arr, 1));
	}

	public static int search(int[] arr, int num) {
		int index = -1;
		if (arr != null) {
			for (int i = 0; i < arr.length; i++) {
				if (arr[i] == num) {
					index = i;
					break;
				}
			}
		}
		return index;
	}
}

三、二维数组
1.格式:
格式1:inr[][] arr = new int [3][2];
*定义一个名称为arr 的二维数组
*二维数组中有3个一维数组
*每个一维数组中有2个元素
*一维数组的名称分别为arr[0],arr[1],arr[2]
*给第一个一维数组1脚标位赋值为5的写法是:arr[0][1] = 5;
格式2:inr[][] arr = new int [3][];
*每个一维数组中有3个一维数组
*每个一维数组都是默认初始化值null
*可以对这个三个一维数组分别初始化
arr[0] = new int [3]
arr[1] = new int [2]
arr[2] = new int [8]
格式3:inr[][] arr = {{2,5,3},{9,3,4,2},{0,3,4}};
*每个一维数组中有3个一维数组
*每一个二维数组中的具体元素都已经初始化
*第三个一维数组的长度 arr[2].length;
2.进值转换
import java.util.Scanner;
//10进制转16进制
public class ToHex {

	public static void main(String[] args) {
		System.out.println("请输入要转换的数:");
		Scanner sc = new Scanner(System.in);
		int number = sc.nextInt();
		hex(number);
	}

	public static void hex(int num) {
		char[] c = new char[8];
		int index = 0;
		while (num > 0) {
			int tem = num & 15;// 将十进制的对应的二进制数每4位取出
			if (tem > 9) {
				c[index] = (char) ((tem - 10) + 'A');// 大于9输出字母
			} else {
				c[index] = (char) (tem + '0');// 小于9输出数字
			}
			index++;
			num = num >>> 4;// 二进制数右移4位
		}
		for (int i = index - 1; i >= 0; i--) {// 倒序输出
			System.out.print(c[i]);
		}

	}

}
3.查表法
public class LookTable {

	public static void main(String[] args) {
		search(60, 4, 15);
	}

	public static void search(int num, int a, int b) {
		int index = 0;
		int number = num;
		char[] c = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };// 创建一个含数字和字母的数组
		// 计算index 的长度
		while (number > 0) {
			number = number >>> a;
			index++;
		}
		char[] arr = new char[index];// 创建新的数组用于存放得到数字和字母
		// 从c 数组中找到对应的数存到arr 中
		for (int i = 0; i < arr.length; i++) {
			int tmp = num & b;
			arr[i] = c[tmp];
			num = num >>> a;
		}
		for (int i = arr.length - 1; i >= 0; i--) {// 将数组倒序输出
			System.out.print(arr[i]);
		}
	}

}

四、递归(自己调自己)
1.递归是一种常见的解决问题的方法,即把问题逐渐简单化。它的思想就是 自己调用自己,一个使用递归技术的方法将会直接或间接调用自己。
2.递归结构包括两个部分:
定义递归头:解答:什么时候不调用自身方法,如果没有头,将会陷入死循环
定义递归体: 解答:什么时候调用自身方法。
3.算阶乘
import java.util.*;
public class DiGui {

	public static void main(String[] args) {
		System.out.println("请输入要算阶乘的数");
		Scanner sc = new Scanner(System.in);//键盘录入要计算的数
		int x = sc.nextInt();
		int y = factorial(x);
		System.out.println(y);
	}
    public static int factorial(int n){
    	if(n ==0){
    		return 1;
    	}else {
    		return n*factorial(n-1);//递归,调用方法本身
    	}
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值