-----------android培训、java培训、java学习型技术博客、期待与您交流!------------
一、概念
1. 同一种类型数据的集合。简单的来说就是一容器,用来装东西的。
2. 使用数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些元素。
二、1.一维数组的格式
格式1:元素类型 [ ]数组名 = new 元素类型 [元素个数或数组长度] ;
如: int [] arr = new int [3]; 也可以写成: int arr[] = new int[3];
格式2:元素类型 []数组名 = new 元素类型 [ ]{元素1,元素2,…};
如: int [] arr = new int []{1,2,3,4,5};
还有一种简写的静态初始化格式:如: int [] arr={1,2,3,4,5};
其中:new是用来在堆内存中产生一个容器实体。
注:1、System.out.println(arr);得到的结果是一个哈希值,也叫地址值。
2、数组在堆内存开辟空间后,就有默认的初始化值。如:int默认0;boolean默认false。
内存小知识:
Java程序在运行时,需要在内存中的分配空间。为了提高运算效率,有对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
栈内存(stack):在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。 栈内存主要存放的是基本类型类型的数据 如、( int, short, long, byte, float, double, boolean, char) 和对象句柄。
堆内存(heap):1、数组和对象,通过new建立的实例都存放在堆内存中。
2、每一个实体都有内存地址值。
3、实体中的变量都有默认初始化值。
4、实体不在被使用,会在不确定的时间内被垃圾回收器回收。
运行最快的内存是cp计数器。(也有说寄存器的。我没有在参考资料上看到过Java中有寄存器。如果有知道的,希望不吝赐教)。
2.二维数组的格式
也称多维数组,是数组中的数组
格式1: int[][] arr= new int[3][2];
解释:以上格式表示定义了名称为arr的二维数组。有3个一维数组,每一个一维数组中有2个元素。一维数组的名称分别为arr[0],arr[1],arr[2]。给第一个一维数组1脚标位赋值为56写法是:arr[0][1] = 56。
格式2: int[][] arr= new int[3][];
注:此种格式中每个一维数组都是默认初始化值null。
格式3:int[][] arr = {{1,2,5},{6,4},{8,9,3,6}};//每一个一维数组中具体元素都初始化了。
注:一种特殊定义写法:int[]x,y[]; x是一维数组,y是二维数组。
三、数组的练习
数组中容易出现的异常。
1、数组脚标越界异常(ArrayIndexOutOfBoundsException)。例:
int[] arr = new int[5];
System.out.println(arr[8]);
访问到了数组中的不存在的脚标时发生。
2、空指针异常(NullPointerException)。例:
int[]arr = null;
System.out.println(arr[0]);
arr引用没有指向实体,却在操作实体中的元素时。
打印最大值和最小值:
1 /* 2 需求:把数组{1,15,35,15,14}打印出来,并打印出最大值和最小值 3 思路:1.创建个功能对数组进行遍历;创建个功能求最大值;创建个功能求最小值 4 2.对数组进行遍历,需要使用循环。 5 3.求最大值,需要定义下标为0的数为初始值的变量,然后用后面的值和初始值比较,如果比初始值大,就把这个数存进去。再和后面的数比较。直到比到最后,这个变量里的 6 数就是最大值。 7 4.求最小值和求最大值一样。 8 */ 9 10 class ArrayDemo 11 { 12 public static void main(String[] args) 13 { 14 int[]x={1,15,35,15,14}; 15 //遍历数组 16 printarr(x); 17 //打印最大值 18 getMax(x); 19 //打印最小值 20 getMin(x); 21 22 } 23 public static void printarr(int[] x ) 24 { 25 26 for(int i=0;i<x.length;i++) 27 { 28 if(i!=x.length-1) 29 System.out.print(x[i]+", "); 30 else 31 System.out.println(x[i]+""); 32 } 33 } 34 public static void getMax(int[]x) 35 { 36 int Max=x[0]; 37 for (int i=1;i<x.length ;i++ ) 38 { 39 if(x[i]>Max) 40 Max=x[i]; 41 42 } 43 System.out.println("Max="+Max); 44 } 45 public static void getMin(int[]x) 46 { 47 int Min=x[0]; 48 for (int i=1;i<x.length ;i++ ) 49 { 50 if(x[i]<Min) 51 Min=x[i]; 52 53 } 54 System.out.println("Min="+Min); 55 } 56 }
运行结果
排序练习:
1 /* 2 需求:把数组{3,5,6,2,4,8,1}按照从小到大进行排序。(分别使用选择排序和冒泡排序) 3 思路:1.可以把数组里的第一个数和后面的数依次比较。如果有比第一个数小的,就和第一个数互换位置。然后继续和后面的数比较。 4 2.把第二个数安照上面的方法和后面的数依次进行比较。然后第三个数按照上面的方法和后面进行比较。。。。 5 。需要定义一个第三方变量 6 3.把数组里的数和后一个数进行比较,如果前一个数大,就进行交换。进行一次循环后,最大的数跑到最后了。 7 */ 8 class PaiXu 9 { 10 public static void main(String[] args) 11 { 12 int[] arr={3,5,6,2,4,8,1}; 13 //排序前 14 printarr(arr); 15 //选择排序 16 xuanze(arr); 17 //排序后 18 printarr(arr); 19 int[] mao={3,5,6,2,4,8,1}; 20 //排序前 21 printarr(mao); 22 //冒泡排序 23 maopao(mao); 24 //排序后 25 printarr(mao); 26 } 27 /* 28 选择排序。 29 内循环结束一次,最值出现在头角标位置上 30 */ 31 public static void xuanze(int[]a) 32 { 33 for (int x=0;x<a.length-1 ;x++ ) 34 { 35 for (int y=x+1;y<a.length ;y++ ) 36 { 37 //int temp; 38 if(a[x]>a[y]) 39 { 40 /* 41 temp=a[x]; 42 a[x]=a[y]; 43 a[y]=temp; 44 */ 45 swap(a,x,y); 46 } 47 } 48 } 49 } 50 /* 51 冒泡排序 52 */ 53 public static void maopao(int[]a) 54 { 55 for (int x=0;x<a.length-1 ;x++ ) 56 { 57 for (int y=0;y<a.length-1-x ;y++)//-1是避免角标越界,-x是让每次比较的元素减少 58 { 59 //int temp; 60 if(a[y]>a[y+1]) 61 { 62 /* 63 temp=a[y]; 64 a[y]=a[y+1]; 65 a[y+1]=temp; 66 */ 67 swap(a,y,y+1); 68 } 69 70 } 71 72 73 } 74 } 75 //互换方法 76 public static void swap(int[]a,int x,int y) 77 { 78 int temp; 79 temp=a[x]; 80 a[x]=a[y]; 81 a[y]=temp; 82 } 83 //遍历数组 84 public static void printarr(int[]a) 85 { 86 System.out.print("["); 87 for (int x=0;x<a.length ;x++ ) 88 { 89 if(x!=a.length-1) 90 System.out.print(a[x]+", "); 91 else 92 System.out.println(a[x]+"]"); 93 } 94 95 } 96 }
运行结果
注:1、最快的排序方法是希尔排序(Shell Sort)。
2、在实际开发中不用自己敲代码。直接调用Arrays.sort();来进行排序。
折半查找:
1 /* 2 需求:要求在一个有序数组{1,5,6,7,9,15,35,46}中插入一个数(比如11),在插入后该数组仍是一个有序数组。 3 思路:1、使用折半查找该数在数组中的位置,如果数组中有该数,就在该数存在的位置上把该数插入进去就可以了,如果不存在,返回最小角标的值min就可以得到要插入的位置。 4 2、该函数需要返回值,返回值类型 int。有两个变量。(数组和插入的数)。 5 */ 6 class ZheBan 7 { 8 public static void main(String[] args) 9 { 10 int[]arr={1,5,6,7,9,15,35,46}; 11 int index=half(arr,11); 12 System.out.println("index="+index); 13 } 14 public static int half(int[]a,int key) 15 { 16 int min=0; 17 int max=a.length-1; 18 int mid=(min+max)>>1; 19 while(min<=max) 20 { 21 if(key>a[mid]) 22 { 23 min=mid+1; 24 } 25 else if(key<a[mid]) 26 { 27 max=mid-1; 28 } 29 else 30 { 31 return mid; 32 } 33 mid=(min+max)>>1; 34 } 35 return min; 36 } 37 }
运行结果
查表法和进制转换练习
1 /* 2 需求:输入一个数,打印出它的二进制,八进制,十六进制; 3 思路:无论转换为哪种进制,都需要进行查表,都需要while循环,都需要&,都需要右移。所以可以定义一个功能把这些封装到里面,不管转换哪个进制,只需要调用 4 这个功能就行了。因为它们需要转换的数不确定,&的数不一样,右移的位数不同。所以需要三个变量。因为没学String字符串类型。所以直接在功能里打印。 5 6 7 */ 8 class JinZhi 9 { 10 public static void main(String[] args) 11 { 12 //定义一个数 13 int n=60; 14 //转为二进制 15 toBin(n); 16 //转为八进制 17 toOct(n); 18 //转为十六进制 19 toHox(n); 20 21 } 22 //十进制转为二进制 23 public static void toBin(int num) 24 { 25 trans(num,1,1); 26 27 } 28 //十进制转为八进制 29 public static void toOct(int num) 30 { 31 trans(num,7,3); 32 33 } 34 //十进制转为十六进制 35 public static void toHox(int num) 36 { 37 trans(num,15,4); 38 39 } 40 public static void trans(int num,int base,int offset) 41 { 42 //如果输入的数为0,则直接输出0,并返回 43 if(num==0) 44 { 45 System.out.println(0); 46 return; 47 } 48 //通过查表法,定义一个包含二进制,八进制,十六进制的表,建立对应关系。 49 char[] chs={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; 50 char[] a=new char[32]; 51 int pos=a.length; 52 while(num!=0) 53 { 54 int temp=num&base; 55 a[--pos]=chs[temp]; 56 num=num>>>offset; 57 } 58 for (int x=pos;x<a.length ;x++ ) 59 { 60 System.out.print(a[x]); 61 } 62 System.out.println(); 63 } 64 }
运行结果