数组
- 存储相同数据类型的元素。
- 一旦创建,不能再改变大小。
- 数组中的每个数据叫做元素。
定义数组变量:
<类型>[]<名字> = new <类型>[元素个数];
- 元素个数必须给出
- 元素个数必须是整数
- 元素个数可以是变量(先让用户输入数组的个数,然后将这个数确定为数组的元素个数)
int[]numbers = new int[10];
/*创建了一个名字叫numbers的int型数组,元素个数为10
数组元素
- 数组的索引或下标都是从0开始的(源自于C语言,其编译器从0开始更易于计算)
numbers[0];//表示数组中的第一个元素
/*10个元素:a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]
每个元素是一个int类型的变量*/
- 最小的下标是0,最大的下标是元素个数-1
- 编译器不会检查下标是否有效,如果运行时出现了无效下标,会导致程序终止。
直接初始化数组
package Pracrice;
import java.util.Scanner;
public class Main {
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);//.length可以输出数组的元素个数,在遍历数组时使用.length方便日后扩展
for(int i=0;i<scores.length;i++)
{
System.out.print(scores[i]+" ");
}
}
}
数组变量
-
数组变量是数组的管理者而非数组本身
-
数组必须创建出来然后交给数组变量来管理
-
数组变量之间的赋值是管理权限的赋予
-
数组变量之间的比较是判断是否管理同一个数组
int[] a1 = {1,2,3,4,5}; int[] a2 = a1; for ( int i=0; i<a2.length; ++i ) { a2[i] ++; } for ( int i=0; i<a1.length; ++i ) { System.out.println(a1[i]); } //示意图如下
复制数组
- 必须遍历源数组,将每个元素逐一拷贝给目标数组
遍历数组
for循环
-
通常使用for循环,让循环变量i从0到<数组的length,这样循环体内最大的i正好是数组最大的有效下标。
-
常见错误:
-
循环结束条件是<=数组长度;
-
离开循环后,继续使用i的值来做数组元素的下标
//输入一个数,查看其是否在数组中 int[] data = {2,3,4,5,6,7,8,9,10}; int x = in.nextlnt(); int loc = -1; for(int i=0;i<data.length;i++) { if(x==data[i]) { loc = i; break; } } if(loc>-1) { System.out.println(x+"是第"+(loc+1)+"个"); } else { System.out.println(x+"不在其中"); }
-
for-each循环
for(<类型><变量>:<数组>){
...
}//对于数组中的每一个元素取出来作为这个类型的变量
非常适合用于遍历读出数组,但是不能修改数组
对比for循环示例:
//输入一个数,查看其是否在数组中
int[] data = {2,3,4,5,6,7,8,9,10};
int x = in.nextlnt();
boolean found = false;
for(int k : data )//对于data数组中的每一个元素,循环的每一轮将其取出作为一个k。所以每一轮的k都是变化的,第一轮k=data[0];第二轮k=data[2]
{
if(x == k )
{
found = true;
break;
}
}
if(found)
{
System.out.println(x+"在其中");
}
else
{
System.out.println(x+"不在其中");
}
素数
构造素数表
//方法一
Scanner in = new Scanner(System.in);
int[] primes = new int[50];
primes[0]= 2;
int cnt = 1;
MAIN_LOOP:
for(int x = 3;cnt<50;x++)
{
for(int i= 0;i<cnt;i++)
{
if(x%primes[i]==0)
{
continue MAIN_LOOP;
}
}
primes[cnt++]=x;
}
for(int k:primes)
{
System.out.print(k+" ");
}
//方法二
Scanner in = new Scanner(System.in);
boolean[]isPrime = new boolean[100];
for(int i = 0;i<isPrime.length;i++)
{
isPrime[i] = true;
}
for(int i=2;i<isPrime.length;i++)
{
if(isPrime[i])
{
for(int k=2;i*k<isPrime.length;k++)
{
isPrime[i*k]= false;
}
}
}
for(int i= 2;i<isPrime.length;i++)
{
if(isPrime[i])
{
System.out.print(i+" ");
}
}
二维数组
int[][] a = new int[3][5];
通常理解为a是一个3行5列的矩阵,如下图所示:
二维数组的遍历
for(i=0;i<3;i++)
{
for(j=0;j<5;j++)
{
a[i][j]=i*j;
}
}
- a[i][j]是一个int
- 表示第i行第j列上的单元
- 不存在a[i,j]的写法
二维数组的初始化
int[][] a {
{1,2,3,4},
{1,2,3},
};
- 编译器来数数
- 每行一个{},逗号分隔
- 最后的逗号可以存在,来自C语言的古老传统
- 如果省略,表示补零