赵工的个人空间


专业技术部分转网页计算转业余爱好部分


 手持终端

首页 > 专业技术 > 手持终端 > Java语言的数组及操作
Java语言的数组及操作

数组是编程语言中非常常见的一种数据结构,用于存储一组有序数据的集合。数组中的每一个元素都属于同一种数据类型,用统一的数组名和下标唯一地确定数组中的元素。可以通过整型索引访问数组中的每一个值。
可以通过数组来保存任何相同数据类型的数据,简单类型或者引用类型。数组本身属于引用类型。数组被创建后,它的大小是不能被改变的,但数组中的各个元素的值是可以被改变的。

1.一维数组:

①声明:
数据类型[] 数组名   或者   数据类型 数组名[]
上述声明,仅声明了一个数组变量,并没有创建一个真正的数组,也无法确定数组长度,数组还不能被访问。两种声明方法效果是一样的,一般使用前一种。
②创建:
数组声明后,要具体规定数组的大小,给数组分配内存空间。
arr_name=new type[length]
其中,type为数组元素类型;arr_name为自定义的数组名;length是一个常量表达式,表示数组的个数。数组的索引从0开始,通过数组名和数组索引是访问数组元素的唯一方式。
为了方便操作数组,Java中提供了获得数组长度的语法。对于一个已经创建完成的数组,获得该数组长度使用“数组名.length”。
也可以简便地将数组声明和数组创建放在一起:
type[] arr_name=new type[length];
如果声明并创建一个引用类型的数组,也使用同样的方法,示例:
String[] s=new String[50];
③初始化:
Java为了保证安全,为已创建的数组提供了默认初始化机制。在成功创建一个数组后,会创建一个数组对象,在内存中给数组分配存储空间,给数组的元素初始化一个相应的数据类型的默认值。
定义一个数组并要给数组指定值,而不是系统自动给的默认值,就需要对数组进行初始化。分为静态初始化和动态初始化两种。
·静态初始化:在定义数组时就对数组进行初始化,示例:
int k[]={1,3,5,7,9};
示例中将数组声明、创建及初始化都放在同一条语句中了,等同于:
int[] k=new int[5];
k[]={1,3,5,7,9};
还可以利用静态初始化来初始化一个匿名数组,语法为:
new type[] {...}
比如:new String[] {"abc","cde","efg"};
这种方法可以用来重新初始化一个数组。比如,有一个String类型的数组,通过静态初始化:
String[] s={"tom","jerry","mickey"};
然后重新初始化:
s=new String[] {"abc","cde","efg"};
可以只给一部分元素赋值。例如:
int a[10]={0,1,2,3,4};
对所有元素赋初值时可以不指定数组长度:
int a[]={0,1,2,3,4};
但如果被定义的数组长度与提供初值的个数不同时,数组长度不能省略。
·动态初始化:
将数组定义和空间分配与给数组元素赋值分开。数组创建时系统对数组进行默认初始化,然后可以在任意位置为数组元素指定对应的值。示例:
ch[10]=a;
④引用数组元素:
数组名[数组索引]
数组索引可以是一个整数或整数表达式。索引从0开始到数组长度减1。Java规定,只能逐个引用数组元素,不能一次引用整个数组。

2.数组操作及应用:

①数组排序:
对数组排序,可以自己写一个算法来对数组进行排序,也可以利用java.util包中的Arrays类的静态方法sort来进行数组元素的排序。示例:
import java.util.Arrays;
public class ArraySort {
  public static void main(String[] args) {
char a={'d','c','b','a','f','e'};
System.out.println("Before Sorting:");
for (int i=0;i<a.length;i++) {
  System.out.print("a["+i+"]="+a[i]+"  ");
}
System.out.println("");
Arrays.sort(a);
System.out.println("After Sorting:");
for (int i=0;i<a.length;i++) {
  System.out.print("a["+i+"]="+a[i]+"  ");
}
  }
}
②数组复制:
public class Numberbackup {
  public static void main(String[] args) {
int[] a={6,7,3,4,1,9,0,5};
int[] b;
b=a;
System.out.println("Before Backup:");
for (int i=0;i<a.length;i++) {
  System.out.print("a["+i+"]="+a[i]+"  ");
}
System.out.println("\n"+"Backup a to b:");
for (int i=0;i<a.length;i++) {
  System.out.print("b["+i+"]="+b[i]+"  ");
}
b[3]=8;
System.out.println("\n"+"After Modifying b:");
for (int i=0;i<a.length;i++) {
  System.out.print("b["+i+"]="+b[i]+"  ");
}
System.out.println("Before Backup:");
for (int i=0;i<a.length;i++) {
  System.out.print("a["+i+"]="+a[i]+"  ");
}
  }
}
③堆栈:
堆栈Stack是一种使用广泛的数据结构。堆栈是一种序列,只在其中一头进行数据的插入和删除操作,这头称为栈顶,而另一头称为栈底。不含任何数据元素的堆栈称为空栈。堆栈操作按后进先出原则进行,称FILO表。
Java中定义一个堆栈,需要实现入栈Push、出栈Pop、清空、返回顶端元素等操作。
使用数组实现利用堆栈记录并查询手机通话记录。首先编写一个类,类中定义一个数组,用来记录手机通话。编写出栈入栈的方法来操作数组。
class myCall {
  private int capacity=100;
  private String[] items;
  private int top=0;
  //不带参数构造方法
  public MyCall() {
this(100);
  }
  //带参数构造方法
  public MyCall(int cap) {
this.capacity=cap;
items=new String[cap];
  }
  //入栈
  public void push(String s) {
top++;
items[top]=s;
  }
  //出栈
  public void pop() {
items[top]=null;
top--;
  }
  //清空堆栈
  public void empty() {
top=0;
  }
  //取出最顶端的堆栈元素
  public String top() {
return items[top];
  }
  //获得堆栈元素个数
  public int size() {
return top;
  }
}
然后编写一个类,使用上面一个类中堆栈的相关方法来操作堆栈。
public class CallHistory {
  public static void main(String[] args) {
MyCall mc=new MyCall(5);
mc.push("Mia 16:12");
mc.push("Kathy 18:02");
mc.push("Alex 19:35");
System.out.println("I have "+mc.size()+" calls today");
System.out.println("This lastest one is:  "+mc.top());
  }
}
上述程序没有考虑栈满及空栈的问题。
④队列:
队列Queue是另一种常用数据结构,是一种线性表,删除操作只在表头进行,插入操作只在表尾进行。队列的修改是按先进先出的原则进行,称FIFO表。
典型队列可以实现队尾插入一个元素、删除队头元素、清空队列、判断队列是否为空。
⑤排序算法:
·冒泡排序:每次比较两个相邻的数,将较小的放在前面,较大的放到后面,然后比较剩下的数,直到所有的数字按照从小到大的顺序排列。
·选择排序:每一趟从待排序的数据元素中选出最小(或最大)的,放在数列的最后,直到全部待排序的数据元素排完。
·快速排序:将一个大数组的排序分解成两个小数组的排序;而每一个小数组的排序又可以继续分解成更小的两个数组,一直递归下去,直到数组的大小为2。第一次划分时,选择一个基准元素,然后将它分成左右两个无序数组,使得左边的所有元素都小于等于基准元素,而右边的所有数组元素都大于等于基准元素,然后分别对左边和右边的数组递归做同样的操作。

3.多维数组:

Java支持多维数组,其中每一维本身是一个一般数组,只不过里面的每一个元素的类型是一个维度比它小一维的另一个数组。
多维数组的声明:类型说明符 数组名[常量表达式1][常量表达式2]
二维数组:int[][], double[][]
三维数组:float[][][], String[][][]
当使用new来创建多维数组时,不必指定每一维的大小,而只需指定最左边的维的大小即可。如果指定了其中的某一维的大小,那么所有处于这一维左边的各维的大小都需要指定。
示例:
boolean[][] b=new noolean[10][3];
int[][] a=new int[6][];
String[][][]=new String[4][5][6];
double[][][]=new double[40][][];
初始化示例:
int a[2][3]={{1,2,3},{4,5,6}};
int a[2][3]={1,2,3,4,5,6};
int c[3][4]={{1},{5},{9}};
int d[3][4]={{1},,{5,6},{0,9,7}};
在对全部元素赋初值时,数组第一维的长度可以不指定:
int e[][3]={1,2,3,4,5,6};
int f[][4]={{0,0,3},{0},{0,10});
在引用多维数组的时候,通过指定数组和各维的索引来引用。
除了静态初始化外,多维数组也可以通过数组声明和初始化分开的动态初始化方法:
int a[][]=new int[4][5];
int b[][]=new int[3][];
b[0]=new int[4];
b[1]=new int[3];

Copyright@dwenzhao.cn All Rights Reserved   备案号:粤ICP备15026949号
联系邮箱:dwenzhao@163.com  QQ:1608288659