1、数组的定义
Java中为什么要有数组呢?
问大家一个问题:一个班里有50名同学,如何在程序中输出所有同学的学号?
如果没有数组,定义50个int 分别输出吗?要是100多人呢?1000人呢?定义起来你会崩溃的?
数组: 一组能够存储相同数据类型值的变量的集合。
当我们有一组相同类型的数据需要存储,如果此时使用单个变量来存储,我们将要定义若干个变量名,这样将会
非常繁琐,并不利于维护。
2、数组的赋值
为了给大家加深印象,我决定给大家画张图来理解一下:
四种:
- 使用默认的初始值来初始化数组中的每一个元素
语法:数组元素类型 [] 数组名 = new 数组元素类型[数组中元素的个数(数组的长度)];
如:
int [] scores = new int[3];
/*数组赋值
nums[0]=1;
nums[1]=2;
nums[2]=3;
nums[3]=4;
nums[4]=5;
*/
for(int i=0;i<5;i++){
scores[i]=i+1;
}
- 先声明,然后再赋予默认的初始值。
语法:数组元素类型 [] 数组名;
数组名= new 数组元素类型[数组中元素的个数(数组的长度)];
如:
int [] scores;
scores = new int[3];//这种呢就相当于第一种分开写了
- 先声明,然后再使用指定的值进行初始化。
语法:数组元素类型 [] 数组名 = new 数组元素类型[]{元素1,元素2,…};
如:
int [] scores = new int[]{56,78,98};//赋值和声明写一起了,
- 将第三种写法可以简化为(使用数组常量值给数组进行赋值)
语法:数组元素类型 [] 数组名 = {元素1,元素2,…};
如:
int [] scores = {56,78,98};//第三种的简写这个用的最多
所有的数组一定要有长度,所以所有的数组都有长度这个属性
System.out.println(scores.length);
//scores.length .可以理解为的 scores的长度
3、数组的遍历
求数组的长度:
x.length
通过下标来访问数组中的元素。
下标:从0开始,到数组长度-1
如:int[] scores = {89,90};
访问最后一个元素值:
int lastElement = scores[scores.length-1];
遍历:依次取出数组中的每一个元素。
遍历方式一:普通的for循环
语法:
for(int i = 0; i< 数组的长度;i++){
//i:循环变量,同样:也是数组的下标(取值范围[0,数组长度))
数组中元素的类型 变量 = 数组名[i];
}
public class Test5{
public static void main(String[] args){
//数组的遍历
int[] scores={59,75,65,89,100};
System.out.println("数组的长度:"+scores.length);
//这样写的话 每次都去访问数组的长度
//for(int i=0;i<scores.length;i++){
//高手写代码 这样写效率比较高 前提是长度是固定的,
int scoreLen=scores.length;
for(int i=0;i<scoreLen;i++){
int score=scores[i];
System.out.println(score);
}
//如果直接打印scores能不能打印出来呢,
//答案是不能的你打印的是,对象的字符串表现方式,它不是内存地址
System.out.println(scores);
}
}
jdk1.5以后Java新增foreach循环和可变参数
遍历方式二:使用增强for循环【foreach循环】
语法:
for(数组中元素的类型 变量:数组名){
数组中元素的类型 临时变量 = 变量;
}
public class Test5{
public static void main(String[] args){
//数组的遍历
int[] scores={59,75,65,89,100};
//这种遍历方式呢有一定的限制,更强大的循环还是普通的for它可以控制下标
for(int x:scores){//1.5新增特性
System.out.println(x);
}
}
}
和foreach一起新增的另一个特性:可变参数
public class Test5{
public static void main(String[] args){
//数组的遍历
int[] scores={59,75,65,89,100};
print(scores);
//可变参数就不用包装成数组格式,直接传
print2(1,2,3,4);
}
public static void print(int[] x){
int len=x.length;
for(int i=0;i<len;i++){
System.out.println(x[i]);
}
}
//JDK1.5可变参数
//可变参数只能是参数列表中的最后一个
//可变参数可以作为数组使用
public static void print2(int... x){
int len=x.length;
for(int i=0;i<len;i++){
System.out.println(x[i]);
}
}
}
使用数组要注意的问题:
空指针异常(NullPointerException)
数组越界异常(ArrayIndexOutOfBoundsException )
public class Test5{
public static void main(String[] args){
//数组的遍历
int[] scores={59,75,65,89,100};
//测试空指针异常
//当一个变量为null(没有赋值)时我们调用了改变量的属性和方法,
//它就死给你看,一给我嘞giao
//这个异常以后编程回经常经常遇到哦
print(null);
//测试数组下标越界,这个也经常遇到
print2(scores);
}
public static void print(int[] x){
int len=x.length;
for(int i=0;i<len;i++){
System.out.println(x[i]);
}
}
//测试数组下标越界
public static void print2(int[] x){
int len=x.length;
for(int i=0;i<=len;i++){
System.out.println(x[i]);
}
}
}
控制台就会报错:
4、数组内存结构分析:
我们来分析一下这行代码
//new 表示创建一个数组 这得结合内存来说一下
int [] scores = new int[3];
先来说一下栈内存和堆内存
数组是引用类型,会存在堆内存中,
5、多维数组
Java中没有真正的多维数组
数组中的元素还是数组的话就是多维数组,
普通的开发二维可能就够了,游戏开发可能用到更高维的数组
/*
一起来参加屌丝程序员大赛吧,有3个班级各3名学员参赛,
记录每个学员的成绩,并计算每个班的平均分。
*/
public class Test5{
public static void main(String[] args){
int[][] scores={{78,89,89},{87,96,85},{67,79,78}};
int classlen=scores.length;
for(int i=0;i<classlen;i++){
int sum=0;
int count=scores[i].length;
for(int j=0;j<count;j++){
sum+=scores[i][j];
}
int avg=sum/count;
System.out.println("第"+(i+1)+"班的平均成绩:"+avg);
}
}
}
qq技术交流群:679293162