首页 > 代码库 > 黑马程序员——数组
黑马程序员——数组
-----------android培训、java培训、java学习型技术博客、期待与您交流!------------
一、概念
1. 同一种类型数据的集合。简单的来说就是一容器,用来装东西的。
2. 使用数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些元素。
二、一维数组的格式
格式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中有寄存器。如果有知道的,希望不吝赐教)。
三、一维数组的练习
数组中容易出现的异常。
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 ArrayDemo11 {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 else31 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 else92 System.out.println(a[x]+"]");93 }94 95 }96 }
运行结果
注:1、最快的排序方法是希尔排序(Shell Sort)。
2、在实际开发中不用自己敲代码。直接调用Arrays.sort();来进行排序。
折半查找:
黑马程序员——数组