Java程序中通常使用变量来存放各种数据,如果将一组数据用变量的形式存放和使用数据这样会很麻烦。所以Java使用了数组来存放数据。数组是可以存储多个元素并且这多个元素是同一种数据类型的容器。
一、一维数组的定义
数据类型[] 数组名;
数据类型 数组名[];
例:
int[] a; 定义了一个int类型的数组变量a
int a[] ; 定义了一个int类型 变量a数组
注意:在定义数组时,不允许[]内指定数组元素的个数。这两种方式的定义虽然写法不一样,并且读法不一样,但是表达的效果一样,都是在定义一个数组,推荐使用第一种方式。
二、数组的初始化
数组的初始化可分为两种:
1)动态初始化: 给数组指定长度,数组中的元素值由系统默认给定;
2)静态初始化: 给定数组中元素的值,数组的长度由系统给定;
动态初始化:
数据类型[] 数组名 = new 数据类型[数组长度] ;
int[] arr = new int[3] ;
当使用关键字new生成数组时,数组中的每个成员都会自动被初始化,初始值依据数组的类型而定。
如:
int 型的初始值:0;
一、一维数组的定义
数据类型[] 数组名;
数据类型 数组名[];
例:
int[] a; 定义了一个int类型的数组变量a
int a[] ; 定义了一个int类型 变量a数组
注意:在定义数组时,不允许[]内指定数组元素的个数。这两种方式的定义虽然写法不一样,并且读法不一样,但是表达的效果一样,都是在定义一个数组,推荐使用第一种方式。
二、数组的初始化
数组的初始化可分为两种:
1)动态初始化: 给数组指定长度,数组中的元素值由系统默认给定;
2)静态初始化: 给定数组中元素的值,数组的长度由系统给定;
动态初始化:
数据类型[] 数组名 = new 数据类型[数组长度] ;
int[] arr = new int[3] ;
当使用关键字new生成数组时,数组中的每个成员都会自动被初始化,初始值依据数组的类型而定。
如:
int 型的初始值:0;
double型的初始值:0.0;
char型的初始值:'/0';
boolean型的初始值:false;
String型的初始值:null;
例:
public class ArrayDemo1 {
public static void main(String[] args) {
//定义数组,动态初始化
int[] arr = new int[3];
char[] arr2=new char[3];
boolean arr3[]=new boolean[4];
String[] arr4=new String[4];
//先输出数组名称和它的元素值
System.out.println(arr);
System.out.println(arr[0]);//数组的访问是从数组名和下标实现的,Java中下标是从0开始;
System.out.println(arr2[0]);
System.out.println(arr3[0]);
System.out.println(arr4[0]);
//进行赋值
arr[0] = 10 ;
arr[2] = 30 ;
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
}
}
显示: /*
[I@7852e922 (arr数组名称输出的是地址值,数组名称指向堆内存中该数组的首地址)
0
false
null
[I@7852e922 (arr数组元素赋值后地址值不变)
10
0
30
*/
数组的静态初始化:
char型的初始值:'/0';
boolean型的初始值:false;
String型的初始值:null;
例:
public class ArrayDemo1 {
public static void main(String[] args) {
//定义数组,动态初始化
int[] arr = new int[3];
char[] arr2=new char[3];
boolean arr3[]=new boolean[4];
String[] arr4=new String[4];
//先输出数组名称和它的元素值
System.out.println(arr);
System.out.println(arr[0]);//数组的访问是从数组名和下标实现的,Java中下标是从0开始;
System.out.println(arr2[0]);
System.out.println(arr3[0]);
System.out.println(arr4[0]);
//进行赋值
arr[0] = 10 ;
arr[2] = 30 ;
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
}
}
显示: /*
[I@7852e922 (arr数组名称输出的是地址值,数组名称指向堆内存中该数组的首地址)
0
false
null
[I@7852e922 (arr数组元素赋值后地址值不变)
10
0
30
*/
数组的静态初始化:
原始格式:
数据类型[] 数组名称 = new 数据类型[]{元素1,元素2,元素3....} ;
简写方式:
数据类型[] 数组名称= {元素1,元素2,元素3..} ;
int[] arr = new int[]{1,2,3} ;
int[] arr = {1,2,3} ;
例:
public class ArrayDemo2{
public static void main(String[] args) {
//定义数组,静态初始化
int[] arr = {1,2,3} ;
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
}
}
显示:
/*
[I@7852e922
1
2
3
*/
使用数组时要注意数组是否越界,每个数组都有一个属性length,可以通过“数组名.length”来获取数组的长度。
public class ArrayDemo3{
public static void main(String[] args){
int[] a={1,2,3,4,5,6,7,8};
int[] b=a; //将a数组名赋给b数组
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");//输出a数组的元素值
}
System.out.println();
for(int i=0;i<b.length;i++){
System.out.print(b[i]+" ");//输出b数组的元素值
}
System.out.println();
System.out.println(a.length);//输出a数组的长度
}
}
显示:
/*
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8
8
*/
三、使用for each循环遍历数组
Java中的for each循环是一种功能很强的循环结构,可以用来处理数组中的每个元素而不必为指定下标而分心。
格式:
for(数据类型 变量 :数组名){ //注意:数据类型可以与数组类型不同,但要符合数据类型自动转换的要求。
循环体
}
例如:
public class ArrayTwo {
public static void main(String[] args) {
int[] a= {1,2,3,4,5,6,7,8,9};
for(int h:a) {
System.out.print(h+",");
}
}
}
显示:1,2,3,4,5,6,7,8,9,
四、实用案例
1)求一维数组中的最大值和最小值以及其所在的位置
public class Test1 {
public static void main(String[] args) {
int[] a={100,24,35,65,33,15,78,92,10,17};//初始化一个数组
int max=a[0];//定义a[0]为最大数
int m=0;
for(int i=1;i<a.length;i++) {
if(max<a[i]) {//判断当前数是否是最大值
max=a[i];
m=i;
}
}
System.out.println("最大值是"+max+"它的位置是"+"a["+m+"]");
int min=a[0];//定义a[0]为最小值
for(int i=1;i<a.length;i++) {
if(min>a[i]) {//判断当前数是否是最小值
min=a[i];
m=i;
}
}
System.out.println("最小值是"+min+"它的位置是"+"a["+m+"]");
}
}
显示结果:
/*
最大值是100它的位置是a[0]
最小值是10它的位置是a[8]
*/
2)数组的冒泡排序
public class Test2 {
public static void main(String[] args) {
int[] b= {22,44,77,33,99,11,55,66,88};//初始化数组
for(int i=0;i<b.length;i++) {
System.out.print(b[i]+",");//输出数组元素
}
System.out.println();
for(int j=0;j<b.length;j++) {
for(int t=0, i=0;i<b.length-1;i++) {
if(b[i+1]<b[i]) {//从小到大冒泡排序
t=b[i+1];
b[i+1]=b[i];
b[i]=t;
}
}
}
for(int i=0;i<b.length;i++) {
System.out.print(b[i]+",");//输出
}
System.out.println();
for(int j=0;j<b.length;j++) {
for(int t=0, i=0;i<b.length-1;i++) {
if(b[i+1]>b[i]) {//从大到小冒泡排序
t=b[i+1];
b[i+1]=b[i];
b[i]=t;
}
}
}
for(int i=0;i<b.length;i++) {
System.out.print(b[i]+",");//输出
}
}
}
显示结果:
/*
22,44,77,33,99,11,55,66,88,
11,22,33,44,55,66,77,88,99,
99,88,77,66,55,44,33,22,11,
*/
3)键盘输入数字,并且逆序输出
import java.util. Scanner;
public class Test3 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入一个长度为5的数组:");
int[] a=new int[5];//定义数组
for(int i=0;i<a.length;i++) {
a[i]=sc.nextInt();//键盘录入
}
for(int i=0;i<a.length;i++) {
System.out.print(a[i]+",");//输出数组a
}
int[] b=new int[a.length];//定义第二个数组
for(int i=0;i<a.length;i++) {
b[a.length-1-i]=a[i];//将a数组中的元素逆序赋值于b数组
}
System.out.println();
for(int i=0;i<a.length;i++) {
System.out.print(b[i]+",");//输出数组b
}
}
}
显示结果:
/*请输入一个长度为5的数组:
10
22
33
77
33
10,22,33,77,33,
33,77,33,22,10,
*/
int[] a={1,2,3,4,5,6,7,8};
int[] b=a; //将a数组名赋给b数组
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");//输出a数组的元素值
}
System.out.println();
for(int i=0;i<b.length;i++){
System.out.print(b[i]+" ");//输出b数组的元素值
}
System.out.println();
System.out.println(a.length);//输出a数组的长度
}
}
显示:
/*
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8
8
*/
三、使用for each循环遍历数组
Java中的for each循环是一种功能很强的循环结构,可以用来处理数组中的每个元素而不必为指定下标而分心。
格式:
for(数据类型 变量 :数组名){ //注意:数据类型可以与数组类型不同,但要符合数据类型自动转换的要求。
循环体
}
例如:
public class ArrayTwo {
public static void main(String[] args) {
int[] a= {1,2,3,4,5,6,7,8,9};
for(int h:a) {
System.out.print(h+",");
}
}
}
显示:1,2,3,4,5,6,7,8,9,
四、实用案例
1)求一维数组中的最大值和最小值以及其所在的位置
public class Test1 {
public static void main(String[] args) {
int[] a={100,24,35,65,33,15,78,92,10,17};//初始化一个数组
int max=a[0];//定义a[0]为最大数
int m=0;
for(int i=1;i<a.length;i++) {
if(max<a[i]) {//判断当前数是否是最大值
max=a[i];
m=i;
}
}
System.out.println("最大值是"+max+"它的位置是"+"a["+m+"]");
int min=a[0];//定义a[0]为最小值
for(int i=1;i<a.length;i++) {
if(min>a[i]) {//判断当前数是否是最小值
min=a[i];
m=i;
}
}
System.out.println("最小值是"+min+"它的位置是"+"a["+m+"]");
}
}
显示结果:
/*
最大值是100它的位置是a[0]
最小值是10它的位置是a[8]
*/
2)数组的冒泡排序
public class Test2 {
public static void main(String[] args) {
int[] b= {22,44,77,33,99,11,55,66,88};//初始化数组
for(int i=0;i<b.length;i++) {
System.out.print(b[i]+",");//输出数组元素
}
System.out.println();
for(int j=0;j<b.length;j++) {
for(int t=0, i=0;i<b.length-1;i++) {
if(b[i+1]<b[i]) {//从小到大冒泡排序
t=b[i+1];
b[i+1]=b[i];
b[i]=t;
}
}
}
for(int i=0;i<b.length;i++) {
System.out.print(b[i]+",");//输出
}
System.out.println();
for(int j=0;j<b.length;j++) {
for(int t=0, i=0;i<b.length-1;i++) {
if(b[i+1]>b[i]) {//从大到小冒泡排序
t=b[i+1];
b[i+1]=b[i];
b[i]=t;
}
}
}
for(int i=0;i<b.length;i++) {
System.out.print(b[i]+",");//输出
}
}
}
显示结果:
/*
22,44,77,33,99,11,55,66,88,
11,22,33,44,55,66,77,88,99,
99,88,77,66,55,44,33,22,11,
*/
3)键盘输入数字,并且逆序输出
import java.util. Scanner;
public class Test3 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入一个长度为5的数组:");
int[] a=new int[5];//定义数组
for(int i=0;i<a.length;i++) {
a[i]=sc.nextInt();//键盘录入
}
for(int i=0;i<a.length;i++) {
System.out.print(a[i]+",");//输出数组a
}
int[] b=new int[a.length];//定义第二个数组
for(int i=0;i<a.length;i++) {
b[a.length-1-i]=a[i];//将a数组中的元素逆序赋值于b数组
}
System.out.println();
for(int i=0;i<a.length;i++) {
System.out.print(b[i]+",");//输出数组b
}
}
}
显示结果:
/*请输入一个长度为5的数组:
10
22
33
77
33
10,22,33,77,33,
33,77,33,22,10,
*/