数组是一种数据结构,用来存储同一类型值得集合。通过一个整型下标可以访问数组中的每一个值。
声明数组变量:需要指出数组类型(数组元素类型[])和数组变量的名字。
创建数组:使用关键字new创建数组。
例如:int[] a = new int[10];
中括号中的整数表示数组的大小。
数组的初始化:
- 创建一个数字数组时,所有的元素都被初始化为0,。
- boolean数组的元素被初始化为false。
- 对象数组被初始化为一个特殊的值null,表示这些元素未存放任何对象。
获取数组中的元素: 数组名[n] n表示元素的位置,n的取值范围为: 0 ~(数组的长度 – 1)
一旦创建了数组,就不能改变数组的大小。如果经常需要在运行过程中扩展数组的大小,就应该使用另一种数据结构------数组列表。
使用for-each 遍历数组。for(数组的元素类型 名字:数组名){}
8.1数组的初始化以及匿名数组
在Java中提供了一种创建对象并赋予初始值的简化书写方式。
例如:int[] small = {1,2,3,4};
匿名数组的形式为: new int[]{1,2,3}
这种方式的创建的数组:数组的大小就是初始化值的个数。
使用这种语法形式可以在不创建新变量的情况下重新初始化数组。例如:small = new int[]{0,1,2};
在Java中允许数组的长度为0,在编写一个结果为数组的方法时,碰巧结果为空,则就这种语法形式就显得非常有用。
注意:数组没有被初始化之前不能被调用。
8.2数组的拷贝
在java中,允许将一个数组的变量拷贝给另一个数组变量。这时两个变量将引用同一个数组:
例如:
int[] original = {1,2,3};// 创建一个原数组
int[] copy = original; // 拷贝数组
这种方式的拷贝的数组,一个数组中改变元素的值,另一个数组对应为值元素的值也随着发生改变,它并不是创建一个全新的数组。
想要在拷贝时创建一个全新的数组,可以使用Arrays中的copyTo方法:
int[] original2 = {1,2,3};
int[] copy2 = Arrays.copyOf(original2, original2.length);
第二个参数表示数组的长度,这个方法通常用来增加数组的大小。
第一种方式的内存图为:
第二种方式的内存图为:
8.3 多维数组
多维数组将使用多个下标访问元素,它适用于表格或者更复杂的排列形式。
二位数组的 声明方式为:数据类型[][] 数组名。例如:int[][] as;// 声明一个int型的多维数组。
与一维数组一样,在调用new对多维数组进行初始化之前不能使用它。也可以不用调用new关键字初始化。
例如:int[][] as = {
{1,2},
{3,4}
};// 声明一个int型的多维数组,并初始化
一旦数组 被初始化就可以利用着 几个方括号访问每一个元素,例如:System.out.println(as[0][0]);// 输出as数组中的第一行第一列的元素
二维数组的排布为:
X/Y | 0 | 1 |
0 | 1 | 2 |
1 | 3 | 4 |
几维数组的输出方式可以利用几个for循环遍历输出:
例如:
for (int i = 0; i < as.length; i++) {
for (int j = 0; j < as[i].length; j++) {
System.out.print(as[i][j]+" ");
}
System.out.print(" ");
}
由此代码我们可以知道:(Java中没有多维数组,只有一维数组。)
二维数组 是有一个int型的数组的数组。
数组类型[] 数组名
Int [] 匿名
Int[] [] as
as数组的内存分布图为:
那么一维数组的长度不同,就是Java中的不规则数组。
例如:int[][] bs = {
{0,1,2},
{3,4},
{5,6,7,8},
};// 一个简单的多维数组的声明和初始化
System.out.println("多维数组的表格为");
for (int i = 0; i < bs.length; i++) {
for (int j = 0; j < bs[i].length; j++) {
System.out.print(bs[i][j]+" ");
}
System.out.print(" ");
}
8.5数组工具类Arrays
Arrays类中提供了从操作数组的多种方法。
API
- static String to String(type[] a)
返回a中数据元素的字符串,这些元素被放在括号内,并用逗号分隔。
参数a 类型为八中基本类型
- static void sort(type[] a)
对数组快速排序(从小到大)
- static int binarySearch(type[] a,type v)
采用二分查找法在a中查找v,如果查找成功返回下标值,如果查找失败返回一个负数
- static int binarySearch(type[] a,int start,int end,type v)
在[start,end)的区间内查找
- static void fill(type[] a, type v)
将a中的所有元素变为v
- static Boolean equals(type[] a, type[] b)
对比两个数组是否相等
示例:
步骤1:在Demo010项目中的com.zjk.type包中创建MyArrays类
源码:
package com.zjk.type;
import java.util.Arrays;
/**
*
*@类名 Arrays
*@日期 2015年12月6日下午4:28:00
*@作者 zjkorder
*@版本 v1.0
*@描述
* 一维数组
* main方法所在类
*
*/
public class MyArrays {
/**
* main 方法
* @Title: main
* @Description: TODO(这里用一句话描述这个方法的作用)
* @param @param args 设定文件
* @return void
* @throws
*
*/
public static void main(String[] args) {
/* 一维数组 */
// int[] test;// 声明一个int型的一维数组
// System.out.println(test);// 错误:The local variable test may not have been initialized 原因:数组没有被初始化之前不能够被调用
System.out.println("int型数组:");
int[] a = new int[5];//创建一个数字数组
/*输出a数组中的值查看数字数组被创建后的初始值是什么并赋值*/
for (int i = 0; i < a.length; i++) {
System.out.println("第"+(i+1)+"个数的初始值是:"+a[i]);
a[i] = i; // 为数组赋值
}
System.out.println("boolean型数组:");
boolean[] b = new boolean[2];// 创建一个boolean 型数组
/*查看 boolean数组的初始值并赋值 */
for (int i = 0; i < b.length; i++) {
System.out.println("第"+(i+1)+"个的初始值是:"+b[i]);
b[i] = true; // 为数组赋值
}
System.out.println("String对象数组:");
String[] s = new String[3];// 创建String型对象数组
/* 产看对象数组的初始值,并赋值 */
for (int i = 0; i < s.length; i++) {
System.out.println("第"+(i+1)+"个的初始值是:"+s[i]);
s[i] = "我是字符串:"+i;
}
int[] small = {1,2,3,4}; //数组的对象的创建并赋予初始值
System.out.println("small数组的值分别为:");
/* 使用for-each输出数组*/
for (int i : small) {
System.out.println(i);
}
small = new int[]{0,1,2};//重新初始化small数组
System.out.println("重新初始化small数组后的值为:");
for (int i : small) {
System.out.println(i);
}
System.out.println("下列是匿名数组的输出:");
/* 使用for——each 输出匿名数组*/
for(int i: new int[]{1,2,3}){
System.out.println(i);
}
/* 数组的拷贝 */
int[] original = {1,2,3};// 创建一个原数组
int[] copy = original; // 拷贝数组
System.out.println("original数组的值为:");
for (int i : original) {
System.out.println(i);
}
System.out.println("copy数组的值为:");
for (int i : copy) {
System.out.println(i);
}
original[0] = 3; //改变原数组第一个元素的值为3
copy[1] = 3;// 改变拷贝数组中第二个元素的值为3
System.out.println("更改值后original数组的值为:");
for (int i : original) {
System.out.println(i);
}
System.out.println("更改值后copy数组的值为:");
for (int i : copy) {
System.out.println(i);
}
/*
* 我们可以发现,变量名不同但是只要更改其中一数组中的值那么另一个数组中的对应的值也会随之发生改变
* 所以,这种形式的拷贝数组引用所指向的内存地址是相同的
*/
/* 使用工具类拷贝数组 */
int[] original2 = {1,2,3};
int[] copy2 = Arrays.copyOf(original2, original2.length);
System.out.println("original2数组的值为:");
for (int i : original2) {
System.out.println(i);
}
System.out.println("copy2数组的值为:");
for (int i : copy2) {
System.out.println(i);
}
original2[0] = 3; //改变原数组第一个元素的值为3
copy2[1] = 3;// 改变拷贝数组中第二个元素的值为3
System.out.println("更改值后original2数组的值为:");
for (int i : original2) {
System.out.println(i);
}
System.out.println("更改值后copy2数组的值为:");
for (int i : copy2) {
System.out.println(i);
}
/*
* 这次没有改变变,说明两个引用指向的内存发生了变化
*/
/* 多维数组 */
int[][] as = {
{1,2},
{3,4}
};// 声明一个int型的多维数组,并初始化
System.out.println(as[0][0]);// 输出as数组中的第一行第一列的元素
System.out.println("二位数组中的所有值为:");
System.out.println("X Y");
// 利用嵌套for循环输出as多维数组
for (int i = 0; i < as.length; i++) {
for (int j = 0; j < as[i].length; j++) {
System.out.print(as[i][j]+" ");
}
System.out.print(" ");
}
/* 不规则数组 */
int[][] bs = {
{0,1,2},
{3,4},
{5,6,7,8},
};// 一个简单的多维数组的声明和初始化
System.out.println("多维数组的表格为");
// 使用嵌套for循环输出不规则数组
for (int i = 0; i < bs.length; i++) {
for (int j = 0; j < bs[i].length; j++) {
System.out.print(bs[i][j]+" ");
}
System.out.print(" ");
}
/* 工具类 */
int[] one = {1,2,3,4,5,6}; // 声明一个数组,测试工具类
int[] two = {1,2,3,4,5,6}; // 声明一个数组,测试工具类
System.out.println("one数组中的元素为:"+Arrays.toString(one));// 输出one数组中的所有元素
System.out.println("one数组与two数组是否相等:"+Arrays.equals(one,two)); // 对比两个数组是否相等
one[0] = 7; //更改one数组中的值
System.out.println("排序前的one数组为:"+Arrays.toString(one));
Arrays.sort(one);// 对数组排序(从小到大的排序)
System.out.println("排序后的one数组为:"+Arrays.toString(one));
System.out.println("在one数组中查找3,返回的下标值为:"+Arrays.binarySearch(one, 3));
Arrays.fill(two, 1);//把two数组中的所有元素设置为1
System.out.println("现在two数组所有元素为:"+Arrays.toString(two));
}
}