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];


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);


}
}



posted @ 2014-12-06 15:42  Y_zr  阅读(108)  评论(0编辑  收藏  举报