黑马程序员-数组

来源:互联网 发布:芭芭拉史翠珊 知乎 编辑:程序博客网 时间:2024/05/16 19:12
------- android培训、java培训、期待与您交流! ----------
1.数组的定义
同一种类型数据的集合。相当于一个容器。可以自动给数组中的元素从0开始编号,方便操作这些元素。
格式:int[] arr = new int[4];
int[] arr = new int[]{3,4,6,8};
int[] arr = {3,4,6,8};


2.内存结构
java程序在运行时,需要在内存中分配空间。为了提高运算效率,把空间划分成不同区域,每个区域都有特定的处理数据方式和
内存管理方式。
栈内存:用来存储局部变量,变量使用结束后,所占的空间会自动释放。
堆内存:通过new建立的实例都存放在堆内存中,而每一个实例都有一个内存地址以及默认初始化值。如果实例不再被使用的话,
在不确定的时间会被垃圾回收器回收。
 一般数据类型的数组的默认值为null,boolean型数组的默认值是false。


3.数组操作时的两个异常:
ArrayIndexOutOfBoundsException: 数组角标越界异常
NullPointerException:空指针异常


4.数组的遍历
int[] arr = new int[]{3,2,5,9,4,21};for (int x=0; x<arr.length; x++){System.out.println("arr["+x+"]="+arr[x]);}

5. 数组中获取最值
//初始化为元素int[] arr = new int[]{3,2,5,9,4,21};int max = arr[0];int min = arr[0];for(int x=1;x<arr.length;x++){if(max<arr[x])max = arr[x];//获取最大值if(min>arr[x])min = arr[x];//获取最小值}System.out.println("max="+max+"----min="+min);//初始化为角标int[] arr = new int[]{3,2,5,9,4,21};int max = 0;int min = 0;for(int x=1;x<arr.length;x++){if(arr[max]<arr[x])max = x;if(arr[min]>arr[x])min = x;}System.out.println("max="+arr[max]+"----min="+arr[min]);

6.数组的排序
(1)选择排序
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;}}}}

(2)冒泡排序
public static void bubbleSort(int[] arr){for(int x=0;x<arr.length-1;x++){for(int y=0;y<arr.length-x-1;y++)//外循环每进行一次,内循环的比较次数就减少一次{if(arr[y]>arr[y+1])//每次循环,将相邻两个元素进行比较,把大的元素不断右移。{int temp = arr[y];arr[y] = arr[y+1];arr[y+1] = temp;}}}}

//或者public static void bubbleSort2(int[] arr){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;}}}}

7.数组的折半查找(数组必须是有序数组)
//第一种方式public static int binSearch(int[] arr ,int key){int min = 0;int max = arr.length-1;int mid ;while(min<=max)//只要min小于max,继续循环{mid = (min+max)/2;if(arr[mid]!=key){if(key>arr[mid])min = mid + 1;if(key<arr[mid])max = mid - 1;}elsereturn mid;}return -1;}//第二种方式public static int binSearch2(int[] arr ,int key){int min = 0;int max = arr.length-1;int mid = (min+max)/2;while(arr[mid]!=key)//只要中间值不等于key,继续循环{if(key>arr[mid])min = mid + 1;if(key<arr[mid])max = mid - 1;mid = (min+max)/2;if(min>max)return -1;}return mid;}


如果要把一个数插入到一个有序数组,要保证数据还是有序的,需要插入什么位置。
首先要在数组中查找这个数是否存在,如果不存在,该数要插入的位置就是返回的min。


8.进制转换
(1)十进制转换为十六进制的函数:
public static void toHex(int x){StringBuilder sb = new StringBuilder();int num;while(x!=0){num = x&15;if(num>10){num-=10;sb.append((char)(num+'a'));}elsesb.append(num);x= x>>>4;}System.out.print(sb.reverse());}

(2)查表法十进制转换其他进制
public static String hexadecimalTransform(int num,int base,int offset){if(num==0){return "0";}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){int temp = num&base;arr[--pos] = chs[temp];num = num>>>offset;}StringBuilder sb = new StringBuilder();for(int x=pos;x<arr.length;x++){sb.append(arr[x]);}return sb.toString();}

9.二维数组
格式一:
int[][]  arr = new int[3][2];
定义了一个二维数组,二维数组有3个一维数组,每个一维数组中有2个元素。
一维数组的名称分别为arr[0],arr[1],arr[2],给第一个一维数组的1角标位赋值23的写法是:arr[0][1]=23;
格式二:
int[][] arr = new int[3][];
二维数组中有3个一维数组,每个一维数组默认初始化值为null,可以给这3个一维数组进行初始化:
arr[0] = new int[3];
arr[1] = new int[2];
arr[2] = new int[1];
格式三:
int[][] arr = {{3,8,1},{8,2,9},{1,5}};
二维数组中有三个一维数组,每个一维数组都已初始化。
arr[0]={3,8,1};
arr[1]={8,2,9};
arr[2]={1,5};
第一个一维数组的长度:arr[0].length


System.out.println(arr)的值是: [[I@0x6c2e
System.out.println(arr[0])的值:[I@0x4ba8


获取二维数组int[][] arr = new int[a][b]的所有元素的和
int sum = 0;for(int x=0;x<arr.length;x++){for(int y=0;y<arr[x].length;y++){sum+=arr[x][y];}}

数据的定义方式:
一维数组:int[] x ,int x[];
二维数组:int[][] y,int y[][],int[] y[];
int[] x,y[];//x是一维,y是二维