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

黑马程序员--Java基础学习(数组)第四天

2015-08-17 19:59 609 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

Java基础学习(数组)第四天

一,概述
数组的定义:数组是一个容器,是同一种类型的数据集合。
好处:数组可以自动对元素编号。
定义方式:格式1:元素类型[] 数组名 = new 元素类型[元素个数或数组长度];//new在内存中产生容器实体。
格式2:元素类型[] 数组名 = new 元素类型[]{元素1,元素2,……};或 元素类型[] 数组名  = {元素1,元素2,……};
示例:int[] x = new int[3];//定义长度为三的数组,数组内的元素为整型。
数据类型的分类:1,基本数据类型如(int ,char,long,float等)。2,引用数据类型如(数组类型,字符串类型);

  内存区域分布:Java在运行时在空间中划分五块区域:栈内存,堆内存,方法区,本地方法区,寄存器。
  栈内存:栈内存用于存储局部变量,当数据使用完,所有空间会自动释放。
  堆内存:1,数组和对象,通过new创建的实例都存放在堆内存中。2,每一个实例都有内存地址值。3,实体中的变量都有默认初始化值。4,实体不再被使用,会在不确定  的时间内被垃圾回收器回收。
  数组在内存中示意图:
  


数组实体在堆内存中,每个元素有默认初始化值,整型数组初始化值为0。
二,常见问题
//ArrayIndexOutOfBoundsException: 操作数组时,访问到了数组中不存在的角标。
//NullPointerException:空指针异常:当引用没有任何指向值为null的情况。该引用还在用于操作实体。
三,遍历
数组的操作:获取数组中元素,通常会用到遍历。
数组中可获取长度的属性。数组名.length。
遍历数组的示例:
class ReadArray
{
public static void main(String[] args)
{
//定义一个数组
int[] arr = {4,5,6,7,8};

int x;
//循环遍历数组输出数组中元素内容
for(x=0 ; x<arr.length; x++){
System.out.println("arr["+x+"]"+"="+arr[x]);
}
}
}


输出结果为:



四,排序
1,选择排序。2,冒泡排序
选择排序示例:
//选择排序
/**
给int数组进行选择排序
@param arr 接收一个int类型的数组
*/
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])
{
swap(arr,x,y);
}
}
}
}


冒泡排序示例:
//冒泡排序
/**
给int数组进行冒泡排序
@param arr 接收一个int类型的数组
*/
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])
{
swap(arr,y,y+1);
}
}
}
}


五,数组元素位置置换
元素置换示例:
//数据交换
/**
给数组中的元素进行位置的置换。
@para arr 接收一个int类型的数组。
@para a 要置换的位置
@para b 要置换的位置
*/
private static void swap(int[] arr,int a,int b)//私有化此功能,只暴露出需要的功能
{
int temp = arr[a];
arr[a] = arr;
arr[b] = temp;
}


[b]六,查找

数组查找操作,有序数组可以折半查找。
折半查找示例:
折半查找必须保证数组是有序的。
*/
public static int halfSearch(int [] arr, int key)
{
int min,max,mid;
min=0;
max=arr.length-1;
mid=(max+min)/2;

while(arr[mid]!=key)
{
if(key>arr[mid])
min = mid+1;
else if (key<arr[mid])
max=mid - 1;
if(min> max)
return -1;
mid = (max+min)/2;
}
return mid;
}


七,进制转换
十进制转二进制示
4000
例:
/*
十进制--》二进制
*/
public static void toBin(int num)
{
StringBuffer sb = new StringBuffer();//存数据的容器。
while(num>0)
{
//System.out.println(num%2);
sb.append(num%2);//一个功能每算一个存入内存。
num=num/2;
}
System.out.println(sb);
System.out.println(sb.reverse());//数据翻转。
}


十进制转十六进制示例:
/*
十进制-->十六进制
*/
public static void toHex(int num)
{
StringBuffer sb = new StringBuffer();

for(int x=0;x<9; x++)
{
int temp = num & 15;
if(temp>9)
//System.out.println((char)(temp-10+'A'));
sb.append((char)(temp-10+'A'));
else
sb.append(temp);
//System.out.println(temp);
num = num >>> 4;
}
System.out.println(sb.reverse());
}


十进制转十六进制查表法示例:
/*
0 1 2 3 4 5 6 7 8 9 A  B  C  D  E  F  十六进制中的元素
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
查表发: 将所有的元素临时存储起来。建立对应关系。
每一次&15后的值作为索引去查建立好的表。就可以找对应的元素。
这样比 -10+‘a’简单的多。

这个表怎么建立那?
可以通过数据的形式来定义。

发现终于出结果了。但是是反着的,想要正过来呢?可以通过StringBuffer reverse功能来完成。
但是这个工具还没有学习。

所以可以使用已经学习过的容器:数组来完成存储。;
*/

public static void toHex_2(int num)
{
/*
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;//-1;//指针变量;
//for(int x=0; x<8; x++)
while(num!=0)
{
int temp = num & 15;
//System.out.println(chs[temp]);
arr[--pos] = chs[temp];//先自减
num = num>>> 4;
}

System.out.println("pos="+pos);

//存储数据的arr数组遍历。
for(int x=pos; x<arr.length; x++)
{
System.out.print(arr[x]+",");
}
*/
trans(num,15,4);
}
/*取查表法十六进制转换和二进制转换的共性部分定义一个十进制到
二进制,八进制,或者十六进制的转换功能函数
*/
public static void trans(int num,int base,int offset)
{
if(num==0)//如果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[32];

int pos = arr.length;

while(num!=0)
{
int temp = num & base;
arr[--pos] = chs [temp];
num = num >>>offset;
}

for(int x=pos; x<arr.length; x++)
{
if(x==arr.length-1)
System.out.println(arr[x]);
else
System.out.print(arr[x]+",");
}

}
}


十进制转二进制查表法示例。
// 查表法十进制--》二进制转换
public static void toBin_2(int num)
{
/*
//定义二进制的表。
char[] chs = {'0','1'};

//定义一个临时存储容器。
char [] arr = new char[32];

// 定义一个操作数组的指针
int pos = arr.length;

while(num!=0)
{
int temp = num & 1;
arr[--pos] = chs[temp];

num = num >>> 1;
}

for(int x=pos; x<arr.length; x++)
{
System.out.print(arr[x]+",");
}
*/
trans(num,1,1);//调用共用的转换函数
}


八,二维数组
二维数组定义方式如:int[ ] [ ] arr = new int [ ] [ ];
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  黑马程序员 java