Java学习个人备忘录之数组
数组
概念:同一种类型数据的集合,其实数组就是一个容器.
数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些元素.
格式1:元素类型[] 数组名 = new 元素类型[元素个数];
格式2:元素类型[] 数组名 = new 元素类型[]{元素1,元素2,元素3,....,元素N};
内存的划分:
1:寄存器
2:本地方法区
3:方法区
4:栈内存
存储的都是局部变量
而且变量所属的作用域一旦结束,该变量就自动释放
5: 堆内存
存储的是数组和对象(其实数组就是对象) 凡是new 建立的都在堆中.
特点:
1.每一个实体都有首地址值
2.堆内存中的每一个变量都有默认初始化值,根据类型的不同而不同.
class ArrayDemo { public static void main(String[] args) { int[] arr = new int[3]; System.out.println(arr(3)); //ArrayIndexOutOfBoundsException //当访问到数组中不存在的角标时,就会发生该异常. arr = null; System.out.println(arr[0]);//NullpointerExeception //当引用变量没有任何实体指向时,还在用其操作实体,就会发生该异常. } }
对数组操作最基本的动作就是存和取。
核心思想:就是对角标的操作。
常见数组应用算法
数组遍历
int[] arr = {89,34,280,15}; for (int x = 0; x<arr.length ; x++ ) { System.out.println(arr[x]); }
数组最值
public static int getMax(int[] arr) { //定义变量记录较大的值 int max = arr[0]; for (int x=1; x<arr.length ; x++ ) { if(arr[x]>max) { max = arr[x]; } } return max; }
//第二种方法 public static int getMax(int[] arr) { //定义变量记录较大的值 int max = 0; for (int x=1; x<arr.length ; x++ ) { if(arr[x]>arr[max]) { max = x; } } return arr[max]; //这里返回的最大值的角标 }
选择排序
public static void selectSort(int[] arr) { for (int x=0; x<arr.length ; 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: 为了避免角标越界 -x: 为了让外循环增加一次,内循环参数与比较的元素个数递减. */ for (int x=0; x<arr.length ; x++ ) { for (int y=0; y<arr.length-1-x ; y++ ) { if (arr[y]>arr[y+1]) { int temp = arr[y]; arr[y] = arr[y+1]; arr[y+1] = temp; } } } // 方法二: for (int x=arr.length-1; x>0 ; x-- ) { for (int y=0; y<x ; y++ ) { if (arr[y]>arr[y+1]) { int temp = arr[y]; arr[y] = arr[y+1]; arr[y+1] = temp; } } }
查找: 返回数组的角标
public static getIndex(int[] arr,int value) { for (int x=0; x<arr.length ; x++ ) { if (arr[x] == key) { return x; } } return -1; }
进制转换 10->16
public static void toHex(int num) { for (int x=0; x<8 ; x++ ) { int temp = num & 15; if (temp>9) System.out.print((char)(temp-10+'A')); else System.out.print(temp); num = num >>> 4; } }
什么时候使用数组呢?
如果数据出现了对应关系,而且对应关系的一方是有序的数字编号,并作为角标使用。这时就必须要想到数组的使用。
就可以将这些数据存储到数组中,根据运算的结果作为角标直接去查数组中对应的元素即可。
这种方式: 称为查表法.
public static void toHex_1(int num) { // 定义一个对应关系表 char[] chs = {'0','1','2','3', '4','5','6','7', '8','9','A','B', 'C','D','E','F'}; for(int x=0; x<8; x++) { int temp = num & 15; System.out.println(chs[temp]); num = num >>> 4; } }//但是这个方法显示出来的写过是反着的 public static void toHex_2(int num) { 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[8]; int pos = arr.length; while(num != 0) { int temp = num & 15; arr[--pos] = chs[temp]; num = num >>> 4; } System.out.println("pos=" + pos); for (int x = pos; x<arr.length ; x++ ) { System.out.println(arr[x] + ","); } }
二维数组定义的格式
class Array2Demo { public static void main(String[] args) { int[][] arr = new int[3][2]; //这就是二维数组的定义格式. //该数组中有3个大箱子,每个大箱子中有2个小箱子 System.out.println(arr); //[I@15db9742 @左边是实体的类型. @右边是实体的哈希值. System.out.println(arr);//直接打印二维数组 System.out.println(arr[0]); //直接打印二维数组中角标0下面的一维数组 /*********************************************************************/ int[][] arr = new int[3][]; arr[0] = new int[2]; arr[1] = new int[1]; arr[2] = new int[3]; //分别对二维数组中的每一个小数组进行初始化. /**********************************************************************/ int[][] arr = new int[3][2]; System.out.println(arr.length); //打印二维数组的长度,其实就是一维数组的个数 System.out.println(arr[1].length); /***********************************************************************/ //第二种定义方式 int[][] arr = {{8,3,6},{7,4,9},{3,0,7}}; int sum = 0; //遍历二维数组 for (int x=0; x<arr.length ; x++ ) { for (int y=0; y<arr[x].length ; y++ ) { System.out.println(arr[x][y]+","); sum += arr[x][y]; } } System.out.println("sum="+sum); } }
我是Vector,谢谢关注。