您的位置:首页 > 职场人生

【黑马程序员】Java基础学习博客——数组

2014-08-02 09:22 656 查看
------- android培训java培训、期待与您交流! ----------

数组使用的核心思想:

什么时候使用数组呢?

对于数组容器什么时候使用呢?数据多,个数确定,而且有对应关系,在分析需求时

1,需求中的数据是否有对应的有序编号?

2,需求中的数据是否需要有序的编号?

如果有,就用数组存储。

数组的初始化:

数组是一种引用类型的变量,因此使用它定义一个变量时,仅仅表示定义了俄一个变量,这个引用变量还未只想任何有效的内存。因此定义数组时不能指定数组的长度。因此这个数组也不能使用,只有对数组进行初始化之后才可以使用。

数组的初始化有两种方式:一种是静态初始化,由程序员显示的指定每个数组元素的初始值,由系统决定数组长度。int [] arr = new int []{1,2,3,4,5,6..};

另一种是动态初始化:初始化时程序员只指定数组的长度,由系统为数组元素进行分配初始值。

int [] arr = new int [5];


需要注意的是:不要同时使用静态初始化和动态初始化,也就是说不要显示的指定每个数组的元素同时指定数组的长度。 

                         动态初始化时,系统会自动为每个元素分配初始值,整数类型为0,浮点类型为0.0,char类型为'\u0000',布尔型为false,引用类型为null。

初始化数组之后可以通过for循环来访问数组里面的元素

package arrayview;

public class arraytest01 {

/*
* 将数组转换成字符串,
* char[] chs = {'0','1','2','3'
,'4','5','6','7'
,'8','9','A','B'
,'C','D','E','F'};
*/
public static void main(String[] args) {
char [] arr = {'0','1','2','3'
,'4','5','6','7'
,'8','9','A','B'
,'C','D','E','F'};
for (int i = 0; i < arr.length; i++) {
if(i==arr.length-1)
{
System.out.print(arr[i]);
}
else
{
System.out.print(arr[i]+",");
}
}

}


在JDK5之后,Java提供了一种更简单的循环:foreach循环,这种循环遍历数组和集合更加便捷,使用foreach遍历数组和集合时无需获得数组和集合的长度。

其语法格式如下:

for(类型名称   变量名: 数组或集合名称)
{
//自动迭代访问每个元素
System.out.println(变量名);
}

需要注意的时:使用高级for循环遍历数组时,不能给每个数组元素赋值,如果要给每个数组元素赋值,只能用普通for循环。

查表法转换数字:

 class ArrayTest8
{
public static void main(String[] args)
{
int num = 60;
String str_bin = toBinary(num);
String str_oct = toOctal(num);
String str_hex = toHex(num);
System.out.println("bin:"+str_bin);
System.out.println("oct:"+str_oct);
System.out.println("hex:"+str_hex);
//Java已经提供的功能。
System.out.println(Integer.toBinaryString(60));
System.out.println(Integer.toOctalString(60));
System.out.println(Integer.toHexString(60));
}

/*
十进制-->十六进制。
*/
public static String toHex(int num)
{
return "0x"+trans(num,15,4);
}

/*
十进制-->二进制。
*/
public static String toBinary(int num)
{
return trans(num,1,1);
}

/*
十进制-->八进制。
*/
public static String toOctal(int num)
{
return "0"+trans(num,7,3);
}

//用于进制转换。
public static String trans(int num,int base,int offset)
{

if(num==0)
return "0";
//1,建立表。
char[] chs = {'0','1','2','3'
,'4','5','6','7'
,'8','9','A','B'
,'C','D','E','F'};

//2,创建临时容器。
char[] arr = new char[32];

//3,创建操作临时容器的角标。
int index = arr.length;

//4,通过循环对num进行& >>等运算。
while(num!=0)
{
//5,对num进行&运算。
int temp = num & base;

//6,根据&运算后的结果作为角标查表,获取对应的字符。并将字符存储到临时容器中。
arr[--index] = chs[temp];

//7,对num进行右移。
num = num >>> offset;
}

return toString(arr,index);
}
//定义一个功能,将字符数组转成字符串。
public static String toString(char[] arr,int index)
{
String temp = "";
for(int x=index; x<arr.length; x++)
{
temp = temp + arr[x];
}
return temp;
}
}


下面是数组的二分法查找的两种方式,以及在第三次复习写这个程序犯的一些错误:
package arrayview;

public class BinaySearch {

public static void main(String[] args) {
int  [] arr ={23,45,67,78,90,123,456,789};
//		int index = binarySearch(arr,10000);
int index2 = binarySearch2(arr,10000);
System.out.println(index2);
}

private static int binarySearch2(int[] arr, int key) {
int min=0,max=arr.length;
while(min<max)
{
int mid = (max+min)>>1;
if(arr[min]>key)
{
min = mid+1;
}
//这里写的时候当时全部用if判断的,结果死循环挂哪了!导致后面return mid没法加上去!~~~
else if(arr[min]<key)
{
max=mid-1;
}
else
{
return mid;
}
}
return -1;
}

public static int binarySearch(int[] arr, int key) {
// 定义三个变量,分别为头角标,尾角标和中间角标。
int min=0,max=arr.length;
int mid = (min+max)>>1;
while(key!=arr[mid])
{
if(key<arr[mid])
{
max = mid-1;
}
else if(key>arr[mid])
{
min=mid+1;
}
if(max<min)
{
return -1;
}
//第一次忘记写这句,在上面写了10000,结果直接角标越界,很纳闷因为毕老师上的源代码没有这句!~~
//所以推荐用上面那种
if(min>arr.length-1)
{
return -1;
}
mid = (min+max)>>1;
}

return mid;
}

}

排序算法在复习时遇到的一些问题:package arrayview;
//选择排序
public class SelectSort {

public static void main(String[] args) {
int arr[] = {2,1,3,7,5,9,13,56};
sop(arr);
selectSort(arr);
sop(arr);
}

//选择排序第一遍,只能确定数组的第一数为数组中的最小数,而我当时是想用选择排序将最大的一个数放在最后一个位置,这种思想本来就有错误
public static void selectSort(int[] arr){
for (int i = 0; i < arr.length-1; i++) {
for (int j = i+1; j < arr.length; j++) {
if(arr[i]>arr[j])
swap(arr,i,j);
}

}
}

private static void swap(int[] arr, int i, int j) {
// TODO Auto-generated method stub
//这种置换最好记,前面是i,j,i,后面是一样的。
arr[i] = arr[i]^arr[j];
arr[j] = arr[i]^arr[j];
arr[i] = arr[i]^arr[j];
}

public static void sop(int [] arr )
{
for (int i = 0; i < arr.length; i++) {
if(i==arr.length-1)
{
System.out.println(arr[i]);
}else
//这里当时少了一个else导致出错
System.out.print(arr[i]+",");

}
}

}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: