本节目标:
- 数组基本概念
- 二维数组
- 数组与方法互操作
- Java对数组的支持
- 数组案例
- 对象数组
1.数组基本概念
1>数组动态初始化( 声明并开辟数组):数据类型[ ] 数组名称 = new 数据类型 [长度]
eg: 声明并开辟一个长度为5的整型数组
int[ ] data = new int[5];
注意:
- a. 数组通过下标索引来取得元素,下标默认从0开始。数组下标超出数组长度,数组越界异常(运行时异常)
- b.数组中每个元素都有默认值,默认值是该数据类型默认值。
- c.取得数组长度的方法:数组名称.length
- d.数组遍历推荐使用for-each循环(仅限于数组内容读取),要修改数组内容,还是使用常规for循环
第一种遍历:
for (int i = 0; i<x.length ; i++)
{
System.out.println(x[i]) ; // 通过循环控制索引下标更改
}
第二种遍历:
for(int x : data) 临时变量:要取得值的数组名称
{
...
}
除了声明开辟数组空间,还有分步进行数组实例化:
int[] x = null ;
x = new int[3] ;
数组属于引用数据类型,因此在使用之前一定要开辟空间(实例化),否则就会产生NullPoninterException(空指针异常,运行时异常)
2> 数组引用传递:多个栈内存指向同一块堆内存(即c中的指针)
new表示在堆内存上开辟空间
范例:多个栈内存指向相同的堆内存
public class ArrayDemo{
public static void main(String[] args) {
int[] x = null ;
int[] temp = null ; // 声明对象
x = new int[3] ;
System.out.println(x.length) ;
x[0] = 1 ; // 数组第一个元素
x[1] = 2 ; // 数组第二个元素
x[2] = 3 ; // 数组第三个元素
for (int i = 0; i<x.length ; i++) {
System.out.println(x[i]) ; // 通过循环控制索引下标更改
}
temp = x ; //如果要发生引用传递,不要出现[]
temp[0] = 55 ; // 修改数据
System.out.println(x[0]) ;
}
}
3>数组静态初始化:数组在定义的同时可以设置内容
-
简化格式:
数据类型[ ] 数组名称 = {值,值,…} -
完整格式(推荐):
数据类型[ ] 数组名称 = new 数据类型[ ]{值,值,…}
eg:int[] data = new int[]{1,3,5,7,9,11}
在开发之中,对于静态数组初始化强烈推荐完整格式,这样可以轻松使用匿名数组这一概念。在数组定义时直接设置内容,根据值的个数确定数组长度,并且长度不可修改
2.二维数组(了解)
而二维数组本质上指的就是一个行列的集合。换言之,如果要获得一个数据,既需要行索引,也需要列索引。如果要确定一个数据,则使用结构为“数组名称[行索引][列索引]”这样的结构就是一个表的结构。
1>动态初始化:]
数据类型[][] 对象数组 = new 数据类型[行个数][列个数]
eg:int[][] data = new int[3][4];
2>静态初始化
数据类型[][] 对象数组 = new 数据类型[][]{{第一行值},{第二行值},...} ;
eg:int[][] data = new int[][] {{1,2,3},{4,5},{6,7,8,9}};
3.数组与方法互操作(重点)
1>方法接收数组(方法调用这个数组,栈中多个指向指向堆中的数组)
2>方法返回数组(在一个方法里写出或叫做返回数组的内容 — 即利用方法对数组进行初始化)
现在的数组上发生了引用传递,那么就意味着方法在接收数组后也可以修改数组。
3>方法修改数组
public class test
{
public static void main(String[] args)
{
int[] data = init(); //调用方法对数组进行初始化
modify(data);
printArray(data); //即C中的调用函数printArray
}
public static void printArray(int[] data)
{
for(int temp : data)
{
System.out.print(temp+"、");
}
}
public static int[] init()
{
return new int[] {2,4,6,8,9};
}
public static void modify(int[] data) //每个数×2
{
for(int i=0; i < data.length; i++)
{
data[i] *= 2;
}
}
}
4.Java对数组的支持(应对笔试题,可以直接调用)
1.排序 - 调用java.util.Arrays.sort(数组名称)这个类
sort进行的是升序排列
public class test
{
public static void main(String[] args)
{
int[] data = new int[]{55,2,1,33,77,45};
java.util.Arrays.sort(data); //此时已经进行对数组的排序
printArray(data);
}
public static void printArray(int[] data)
{
for(int temp : data)
{
System.out.print(temp+"、");
}
}
}
带有char类型的数组
import java.util.Arrays; //打包
public class test
{
public static void main(String[] args)
{
int[] data = new int[]{55,2,1,33,77,45};
char[] c = new char[]{'z','a','c','b'};
Arrays.sort(data);
Arrays.sort(c);
printArray(data);
printArray(c);
}
//方法的重载(实现的功能相同,参数的类型,个数或者顺序不相同)
public static void printArray(int[] data)
{
for(int temp : data)
{
System.out.print(temp+"、");
}
}
public static void printArray(char[] data)
{
for(char temp : data)
{
System.out.print(temp+"、");
}
}
}
支持所有基本数据类型
内部使用双轴快速排序
2.数组部分拷贝:System.arraycopy(源数组名称,源数组开始点,目标数组名称,目标数开始点,拷贝长度)
范例:目标数组A:1、2、3、4、5、6、7、8、9 源数组B:11、22、33、44、55、66、77、88、99 替换后:1、55、66、77、5、6、7、8、9
public class test
{
public static void main(String[] args)
{
int[] dataA = new int[]{1,2,3,4,5,6,7,8,9} ;
int[] dataB = new int[]{11,22,33,44,55,66,77,88,99} ;
System.arraycopy(dataB,4,dataA,1,3) ;
printArray(dataA) ;
}
public static void printArray(int[] data)
{
for(int temp : data)
{
System.out.print(temp+"、");
}
}
}
3.数组全拷贝:java.util.Arrays.copyOf(源数组名称,新数组长度):int[ ]
Java动态数组动态扩容方法
public class test
{
public static void main(String[] args)
{
int[] data = new int[]{1,2,3,4,5,6,7,8,9} ;
int[] temp = Arrays.copyOf(data,data.length+1); //使temp指向一块新空间而不是指向原来的堆空间
printArray(temp) ;
}
public static void printArray(int[] data)
{
for(int temp : data)
{
System.out.print(temp+"、");
}
}
}
其中int[] temp = Arrays.copyOf(data,4); //类似于取前面4个元素的部分拷贝