数组(Array)定义:相同类型数据的集合。
数组按照使用可以分为:一维数组、二维数组和多维数组。
1、数组的定义:
Java中使用关键字new创建数组对象,声明数组的同时分配内存空间,数组定义方式有3种:
方式1 (推荐,更能表明数组类型)
比如:
int[] a = new int[10];
数组名,也即引用a,指向数组元素的首地址。
方式2 (同C语言)
type 变量名[] = new type[数组中元素的个数];
如:
int a[] = new int[10];
方式3 定义时直接初始化
type[] 变量名 = new type[]{逗号分隔的初始化值};
其中 new type[] 可省略,所以又有两种:
int[] a = {1,2,3,4};
int[] a = new int[]{1,2,3,4};
上面 int[] a = new int[]{1,2,3,4} 的第二个中括号中不能加上数组长度,因为元素个数是由后面花括号的内容决定的。
数组的元素是通过索引访问的。数组索引从 0 开始,所以索引值从 0 到 array. length -1( array.length为数组的长度,在上面例子中,a即为array ) 。
2、数组的操作:
①赋值:
下面的语句首先声明了一个数组变量 myList,接着创建了一个包含 10 个 double 类型元素的数组,并且把它的引用赋值给 myList 变量。
public class TestArray{
public static void main(String[] args){
// 数组大小
intsize = 10;
// 定义数组
double[] myList = new double[size];
myList[0] = 5.6;
myList[1] = 4.5;
myList[2] = 3.3;
myList[3] = 13.2;
myList[4] = 4.0;
myList[5] = 34.33;
myList[6] = 34.0;
myList[7] = 45.45;
myList[8] = 99.993;
myList[9] = 11123;
// 计算所有元素的总和
double total = 0;
for(inti = 0; i < size; i++){
total += myList[i];
}
System.out.println(“总和为: ” + total);
}
}
下面的图片描绘了数组 myList。这里 myList 数组里有 10 个 double 元素,它的下标从 0 到 9。
②循环数组(遍历):
数组的元素类型和数组的大小都是确定的,所以当处理数组元素时候,我们通常使用基本循环或者 foreach 循环。
创建、初始化和使用 基本循环 操纵数组:
public class TestArray{
public static void main(String[] args){
double[] myList = {1.9, 2.9, 3.4, 3.5};
// 打印所有数组元素
for(inti = 0; i < myList.length; i++){
System.out.println(myList[i] + “”);
}
// 计算所有元素的总和
doubletotal = 0;
for(inti = 0; i < myList.length; i++){
total += myList[i];
}
System.out.println(“Total is ” + total);
// 查找最大元素
doublemax = myList[0];
for(inti = 1; i < myList.length; i++){
if(myList[i] > max){
max = myList[i];
}
}
System.out.println(“Max is ” + max);
}
}
foreach 循环,能在不使用下标的情况下遍历数组:
public class TestArray{
public static void main(String[] args){
double[] myList = {1.9, 2.9, 3.4, 3.5};
// 打印所有数组元素
for(double element: myList){
System.out.println(element);
}
}
}
③数组排序(介绍几种常用排序方法):
1.冒泡排序 (将相近的两个数字依次比较,将值最大或最小的一次提取,进行排序)
public void bubbleSort() {
int a[]={32,87,3,58,12,70,20,8,62,17};
int n = a.length;
for (int i = 0; i < n – 1; i++) {
for (int j = 0; j < n – 1; j++) {
if (a[j] > a[j + 1]) {
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
for(int c: a){
System.out.println(c);
}
}
2.选择排序 (每一次将第一个数与后面的数一次比较,将最大值的下标保存,然后调换位置,进行排序)
public void selectSort() {
int a[]={32,87,3,58,12,70,20,8,62,17};
int n = a.length;
for (int i = 0; i < n – 1; i++) {
int index = i;
for (int j = i+1; j < n ; j++) {
if (a[index] < a[j]) {
index = j;
}
}
if (index != i) {
int temp = a[i];
a[i] = a[index];
a[index] = temp;
}
}
for(int c: a){
System.out.println(c);
}
}
3.插入排序( 把当前待排序的元素插入到一个已经排好序的列表里面 。 一个非常形象的例子就是右手抓取一张扑克牌,并把它插入左手拿着的排好序的扑克里面。插入排序的 最坏运行时间是O(n2) , 所以并不是最优的 排序算法 。特点是简单,不需要额外的存储空间,在元素少的时候工作得好)
public void insertSort() {
int a[]={32,87,3,58,12,70,20,8,62,17};
int n = a.length;
for (int i = 1; i < n; i++) {
//将a[i]插入a[0:i-1]
int t = a[i];
int j;
for (j = i – 1; j >= 0 && t < a[j]; j–) {
a[j + 1] = a[j];
}
a[j + 1] = t;
}
for(int c: a){
System.out.println(c);
}
}
4.还有一种方法就是用Arrays.sort()方法直接排序
public void sort() {
int a[]={32,87,3,58,12,70,20,8,62,17};
Arrays.sort(a);
for(int c: a){
System.out.println(c);
}
}