------Java培训、Android培训、iOS培训、.Net培训、期待与您交流!
一、数组
同一种类型数据的集合,可以理解为一个容器。数组中可以自动给数组中的元素从0开始编号,方便对数组中的元素进行操作。
数组格式:
(1)元素类型[]数组名=new 元素类型[元素个数]。例如:int [ ] x=new int[4]。其中new的作用是用来在对内存中产生一个容器实例。
(2)元素类型[]数组名=new 元素类型[ ]{元素0,元素1,元素2...........}。例如:int [ ] x=new int [ ]{0,1,2,3}。其中中括号内不应写数组的长度,以免与后面列明的 元素个数不符,造成错误。
(3)元素类型[]数组名={元素0,元素1,元素2...........}。例如:int [] x={0,1,2,3}。这是数组的静态初始化格式。
数组在对内存开辟空间后,就会有表示其在内存中地址值的哈希值,引用变量就是通过获得数组的哈希值来实现对数组的引用;数组一创建,根据元素类型的 不同,数组中的元素就会有默认的初始化值。例如:int类型对应的初始化值是0,boolean型对应的是false,float对应的是0.0f。
数组的创建与引用涉及到栈内存与堆内存。内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁,计算机所有程序的运行都在内存中进行。Java程序 在运行时,需要在内存中的分配空间。为了提高运算效率,对空间进行不同区域的划分。因为每一片区域都有特定的处理数据方式和内存管理方式。
栈内存:用于存储局部变量(定义在方法中的变量、定义在方法中参数的变量、定义在for循环中的变量)。当数据使用完,所占空间会自动释放。
堆内存:1.存放数组和对象,通过new建立的实例都存放在堆内存中。
2.每一个实体都有内存地址值(存放位置)。
3.实体中的变量都有默认初始化值。
4.实体不再被使用,会在不确定的时间内被垃圾回收器回收。
通过图例,表明数组在内存中的结构分配:
int [ ] x=new int[4];
x是通过获取数组的哈希值指向、引用数组。数组的元素初始化值是0.
int [ ] y=x;
x赋值给y,y也获得数组的哈希值,从而指向数组。
y[1]=23;
数组被y修改,此时x[1]也是23。
x=null;
x不再指向数组,y还在指向。
注意:在数组的使用中有时会出现一些问题,其中有两个问题是比较常见的:
(1)ArrayIndexOutOfBoundsException:数组脚标越界异常,操作时访问到了数组中不存在的脚标。
(2)NullPointerException:空指针异常,引用没有指向实体,却在操作实体中的元素。
二、数组的操作
获取数组中的元素,对元素进行操作,一般都会用到遍历(即循环,通常用for循环)。arr.length表明数组的长度,用于直接获取数组中的元素个数,在操作时 会经常用到。下面介绍几种常用的操作。
(1)获取数组中的最大值。例如:
class ArrayDemo1
{
public static void main(String[]args){
int[]arr={1,2,45,66,12,12,35};
getMax(arr);
}
public static int getMax(int[]arr){
//定义变量,用于存储最大值的脚标
int max = 0;
//遍历数组
for(int x=1; xarr[max])
max = x;
}
return arr[max];//返回数组中的最大值
}
}
选择排序,例如:
public static void selectSort(int[] arr)
{
//遍历数组
for(int x=0; xarr[y])
{
int temp = arr[x];
arr[x] = arr[y];
arr[y]= temp;
}
}
}
}
冒泡排序,例如:
public static void bubbleSort(int[] arr)
{
for(int x=0; xarr[y+1])
{
int temp = arr[y];
arr[y] = arr[y+1];
arr[y+1] = temp;
}
}
}
}
(3)查找数组中的元素
对数组中的元素进行查找,常用的是折半查找,效率比较高,但数组必须是有序的。
例如:
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
(4)进制转换
利用数组来完成整数之间的进制转换。例如:
class ArrayDemo2
{
public static void main(String[] args)
{
toBin(60);
toHex(60);
toOctal(60);
}
/*
十进制-->二进制
*/
public static void toBin(int num)
{
trans(num,1,1);
}
/*
十进制-->八进制
*/
public static void toOctal(int num)
{
trans(num,7,3);
}
/*
十进制-->十六进制
*/
public static void toHex(int num)
{
trans(num,15,4);
}
public static void trans(int num,int base,int offset)
{
//如果传入的是0,直接打印0,不再向下操作。
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[32];
//定义数组中的指针,用于操作字符的存储位置
int pos = arr.length;
while(num!=0)
{
int temp = num & base;
arr[--pos] = chs[temp];//查表,获得对应字符,并从数组的最后开始存放。
num = num >>> offset;//右移对应位数
}
//通过遍历,打印获得的转换结果
for(int x=pos; x
三、二维数组
二维数组格式:
(1)元素类型[ ][ ]数组名=new 元素类型[二维数组的长度 ][每个一维数组的长度 ],例如int[ ][ ] x=new int[3][2],表明这个二维数组中有3个长度为2的一位数组。其 中三个一维数组分别用x[0],x[1],x[2]来表示,第一个数组中第一个元素用x[0][0]来表示,以此类推。此格式也可写成int[ ]x[ ]或int x[ ][ ]。
(2) 元素类型[ ][ ]数组名=new 元素类型[二维数组的长度 ][ ],例如int[ ][ ] x=new int[3][ ],表明该二维数组中有3个一维数组,每一个一维数组都是默认的初始值 null。
(3) 元素类型[ ][ ]数组名={{元素(0)0,元素(0)1},{元素(1)0,元素(1)1},{元素(2)0,元素(2)1}},例如int[ ][ ] x={{1,2},{3,4},{5,6}}; 二维数组的静态初始化方式,每一个一维数组中的元素都初始化了。
二维数组在内存中的结构分配,如图:
int[ ][ ]x=new int[2][4]
-------------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------