一、数组
1、动态初始化
定义:数组时先不存入具体的元素值,只确定数组存储的数据变量和数组的长度,不确定具体值。
语法格式:
数据类型[] 数组名=new 数据类型[长度]
int [] arr=new int [3];
//后赋值
arr[0]=10;
System.out.println(arr[0]);
**注意事项:**静态初始化和动态初始化数组的写法是独立的,不可以混用。
2、元素默认值规则
数据类型 | 明细 | 默认值 |
---|---|---|
基本数据类型 | byte、short、char、int、long | 0 |
float、double | 0.0 | |
boolean | false | |
引用类型 | 类、接口、数组、String | null |
使用场景:
- 动态初始化:适用开始不确定具体元素值,只知道元素个数的业务场景。
- 静态初始化:适合一开始就知道要存入那些元素值得业务场景。
3、小练习:评委打分
需求:某个歌唱比赛,需要开发一个系统:可以录入6名评委得打分,录入完毕后立即输出平均分作为选手得分。
代码如下:
package Array;
import java.util.*;
/**
* user:liaoxinyue
**/
public class ArrayDemo2 {
public static void main ( String[] args ) {
double[] scores = new double[ 6 ];
Scanner scanner = new Scanner ( System.in );
double sum = 0;
for ( int i = 0 ; i < 6 ; i++ ) {
System.out.println ( "请输入第" + ( i + 1 ) + "位评委打分" );
scores[ i ] = scanner.nextDouble ( );
sum += scores[ i ];
}
double average = sum / scores.length;
System.out.println ( average );
}
}
运行结果如下:
4、数组原理
- Java内存分配介绍
- 方法区(字节码文件先加载到这里)
- 栈内存(方法运行时所进入的内存,变量也在这里)
- 堆内存(new出来的东西在这块内存中开辟空间并产生地址)
- int a=20;int []arr=new int[3]这两行代码的执行原理。
a为变量,存在栈内存中,数据为20;
arr为数组变量,存放在栈中,根据索引(地址值)访问堆内存中存储的数据。
5、多个变量指向同一个数组对象
多个数组变量中存储的是同一个数组对象的地址。
多个变量修改的都是同一个数组对象中的数据。
代码如下:
package Array;
/**
* user:liaoxinyue
**/
public class ArrayDemo3 {
public static void main ( String[] args ) {
// 目标:多个变量指向同一个数组对象的问题
int [] arr1={11,22,33};
// 把整型的数组变量arr1赋值给整型数组变量arr2
int [] arr2=arr1;//地址值
// 将多个变量指向同一个数组对象
System.out.println (arr1 );
System.out.println (arr2 );
arr2[1]=99;
System.out.println (arr1[1] );
//99,因为两个变量指向同一个数组,所以值为99
// 此时整型数组变量arr2为空,不指向任何数组
arr2=null;
System.out.println (arr2 );//null
// System.out.println (arr2[0] );//会爆空指针异常(NullPointerException)
// System.out.println (arr2.length);//会异常
}
}
运行结果如下:
6、综合案例
- 数组元素求最大值
代码如下:
package Array;
/**
* user:liaoxinyue
**/
public class ArrayDemo4 {
public static void main ( String[] args ) {
int []faceScore=new int[]{15,9000,10000,20000,9500,-5};
int max=faceScore[ 0 ];
for ( int i = 1 ; i < faceScore.length ; i++ ) {
int score=faceScore[ i ];//去堆中找一次
if ( max<score ){
max=score;
}
// 在堆中寻找两次
// if ( max < faceScore[ i ] ) {
// max = faceScore[ i ];
// }
}
System.out.println (max );
}
}
- 数组反转
需求:某个数组5个数据:10,20,30,40,50,请将这个数组中的数据进行反转。
[10,20,30,40,50]转换为[50,40,30,20,10]
代码如下:
public class ArrayDemo5 {
public static void main ( String[] args ) {
int[] arr = new int[] { 10 , 20 , 30 , 40 , 50 };
for ( int i = 0, j = arr.length - 1 ; i < j ; i++ , j-- ) {
int bemp = arr[ i ];
arr[ i ] = arr[ j ];
arr[ j ] = bemp;
}
for ( int i = 0 ; i < arr.length ; i++ ) {
System.out.println ( "当前数组arr为"+arr[i] );
}
}
}
运行结果如下:
- 随机排名
需求:某公司开发部5名开发人员,要进行项目进展汇报演讲,现在采取随机排名后进行汇报。请先输入5名员工的工号,然后展示出一组随机排名顺序。
代码如下:
package Array;
import java.util.*;
/**
* user:liaoxinyue
**/
public class ArrayDemo6 {
public static void main ( String[] args ) {
int []bank=new int[5];
Scanner scanner=new Scanner ( System.in );
for ( int i = 0 ; i < bank.length ; i++ ) {
System.out.println ("请输入第"+(i+1)+"为员工的工号" );
bank[ i ]=scanner.nextInt ( );
}
Random random=new Random ( );
for ( int i = 0 ; i < bank.length ; i++ ) {
int j=random.nextInt ( bank.length );
int temp=bank[ i ];
bank[i]=bank[ j ];
bank[j]=temp;
}
for ( int i = 0 ; i < bank.length ; i++ ) {
System.out.println ("当前排名为:"+bank[i] );
}
}
}
运行结果如下: