数组
数组:数据可以存放在变量里,每一个变量有一个名字,有一个类型,还有它的生存空间。如果我们需要保存一些相同类型、相似含义、相同生存空间的数据,我们可以用数组来保存这些数据,而不是用很多个独立的变量。数组是长度固定的数据结构,用来存放指定的类型的数据。一个数组里可以有很多个数据,所有的数据的类型都是相同的。
初识数组
-
如何写一个程序计算用户输入的数字的平均数?
Scanner in = new Scanner(System.in);
int x;
double sum = 0;
int cnt = 0;
x = in.nextInt();
while( x != -1 )
{
sum += x;
cnt++;
x = in.nextInt();
}
if (cnt > 0)
{
System.out.println(sum/cnt);
}
-
不需要记录输入的每一个数
可是
-
如何写一个程序计算用户输入的数字的平均数,并输出所有大于平均数的数?
-
必须先记录每一个输入的数字,计算平均数之后,再检查记录下来的每一个数字,与平均数比较,决定是否输出
import java.util.Scanner;
public class Demo01{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int x;
int[] numbers = new int[100]; //定义数组
int cnt = 0;
double sum = 0;
x = in.nextInt();
while(x != -1)
{
numbers[cnt] = x; //对数组中的元素赋值
// numbers[2] = x;
sum += x;
cnt++;
x = in.nextInt();
}
if(cnt > 0)
{
double average = sum/cnt;
for(int i = 0; i < cnt; i++) //遍历数组
{
if( numbers[i] > average) //使用数组中的 元素
{
System.out.println(numbers[i]);
}
}
System.out.println(sum/cnt);
}
}
}
-
这个程序存在安全隐患是什么?
-
这个程序是危险的,因为输入的数据可能超过100个
创建数组
数组
-
是一种容器(放东西的东西),特别是:
-
其中的所有的元素具有相同的数据类型;
-
一旦创建,不能改变大小
数组
-
数组是一种数据结构,能记录同一种类型的多个数据
-
数组中的每个数据叫做元素
-
所有的元素具有相同的数据类型
定义数组变量
int[] a = new int[10]
数组的元素
-
每个元素都是那种类型的变量
-
索引或下标是从0开始的
-
grades[0] grades[99] average[5]
有效的下标
例:
// 范围0~99 错误
定义数组变量
-
<类型>[] <名字> = new <类型>[元素个数];
-
int[] grades = new int[100]; double[] averages = new double[20];
-
元素个数必须是整数
-
元素个数必须给出
-
元素个数可以是变量
修改:
import java.util.Scanner;
public class Demo02 {
public static void main(String[] args){
Scanner in = new Scanner(System.in);
double sum = 0;
int cnt = 0;
cnt = in.nextInt();
if( cnt > 0 && cnt != -1 )
{
int[] numbers = new int[cnt];
for( int i = 0; i < cnt; i++ )
{
numbers[i] = in.nextInt();
sum += numbers[i];
}
double average = sum / cnt;
for (int i = 0; i < cnt; i++)
{
if (numbers[i] > average)
{
System.out.println(numbers[i]);
}
}
System.out.println(sum / cnt);
}
}
}
}
length
-
每个数组有一个内部成员length,会告诉你它的元素的数量
for( i = 0; i < 100; ++i )
{
sum += grade[i];
}
最好是:
for( i = 0; i < grade.length; ++i )
{
sum += geade[i];
}
例:
for( int i = 0; i < cnt; i++ )
//改为
for( int i = 0; i < numbers.length; i++ )
//好处:for循环是来便利这个numbers数组的,只要numbers数组在,这个length总是在。 (.length永远是.length)
//这个循环是具有可扩展性的
数组变量
直接初始化数组
-
new创建的数组会得到默认的0值
-
int[] scores = {87,98,69,54,65,76,87,99};
-
直接用大括号给出数组的所有元素的初始值
-
不需要给出数组的大小,编译器替你数数
import java.util.Scanner;
public class Demo03 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int[] scores = {87, 98, 69, 54, 65, 76, 87, 99};
System.out.println(scores.length);
for( int i = 0; i<scores.length; i++ )
{
System.out.print(scores[i]+" ");
}
}
}
数组变量赋值
import java.util.Scanner;
public class Demo04 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int[] a = new int[10];
a[0] = 5;
int[] b = a;
System.out.println(a[0]); //5
b[0] = 16;
System.out.println(b[0]); //16
System.out.println(a[0]); //16
}
}
问题:a1[0] 是1还是2呢?
答案是:2
Scanner in = new Scanner(System.in);
int[] a = {1,2,3,4,5};
int[] b = {1,2,3,4,5};
System.out.println(a==b); //false
复制数组
-
必须遍历源数组将每个元素逐一拷贝给目的数组
import java.util.Scanner;
public class Demo05 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int[] a = {1,2,3,4,5};
int[] b = new int[a.length];
for ( int i = 0; i<b.length; i++ )
{
b[i] = a[i];
}
boolean isEqu = true;
for( int i=0; i<b.length; i++)
{
if( a[i] != b[i] )
{
isEqu = false;
break;
}
}
System.out.println(isEqu); //true
}
}