0005 数组(array)的静态和动态声明、最大值最小值、数组的反转、复制

public class test05{
public static void main(String []args){
/*
数组(array):
简单的说,就是一组数
当一组数据的数据类型,意义是一样的时候,那么为了方便的统一的管理它们,我们需要
用新的数据的存储结构来进行存储。例如:数组
所谓数组(Array),就是相同数据类型的元素按一定顺序排列的集合,
就是把有限个类型相同的变量用一个名字命名,以便统一管理他们,
然后用编号区分他们,这个名字称为数组名,编号称为下标或索引(index)。
组成数组的各个变量称为数组的元素(element)。数组中元素的个数称为数组的长度(length)。
int[] scores = new int[7];
scores[0] = 89;
数组名:例如:scores
下标:范围:[0,长度-1]
例如:[0]
元素:数组名[下标]
例如:scores[0]
数组的长度:元素的总个数,可以这么表示: 数组名.length
*/
//实例
/*
要存储本组学员的成绩,例如:第1组,有7个同学
*/
/*
int score1 = 89;
int score2 = 89;
int score3 = 67;
int score4 = 99;
int score5 = 89;
int score6 = 34;
int score7 = 89;
//用7个变量存储没问题,但是如果涉及到对数据的管理:例如,求最值,排序等,就非常麻烦
*/
//所以使用数组
/*
int[]scores=new int[7];
scores[0] = 89;
scores[1] = 89;
scores[2] = 67;
scores[3] = 99;
scores[4] = 89;
scores[5] = 34;
scores[6] = 89;
System.out.println(scores.length);*/
//----------------------------------------------------
/*
原则:先声明后使用
1、声明一个数组?
语法格式;
元素的数据类型[] 数组名;
例如:
存储几个学员的成绩:int[] scores;
存储几个学员的体重:double[] weights;
存储几个学员的姓名:String[] names;

2、 数组的初始化?
需要完成两件事:
(1)确定数组的长度
(2)确定数组的元素的值

方式一:静态初始化
数组名 = new 元素的数据类型[]{元素的值列表};

说明:如果数组的声明与静态初始化合成一句时
元素的数据类型[] 数组名 = new 元素的数据类型[]{元素的值列表};
甚至还可以简化:当且仅当,声明与静态初始化在一句时,才能这么简化
元素的数据类型[] 数组名 = {元素的值列表};
方式二:动态初始化

3、如何表示一个数组的元素
数组名[下标]
下标的范围:[0,长度-1]

4、如何表示数组的长度
数组名.length

5、遍历/访问数组中的元素
for(int i=0; i<数组名.length; i++){
Ssytem.out.println(数组名[i]);
}

回忆:
变量的声明与使用
(1)变量的声明
数据类型 变量名;
(2)变量的初始化
变量名 = 变量值;

声明和初始化合成一句
数据类型 变量名 = 变量初始值;
*/
int[]socres = {60,65,70,90,80};
//输出数组的长度,已经遍历数组
System.out.println(socres.length);
for(int i=0;i<socres.length;i++){
System.out.println(socres[i]);
}

//-------------------------------------------------------

/*
数组的存储:
1、数组下标为什么从0开始?
下标表示的是这个元素的位置距离首地址的偏移量
2、数组名中存储的是什么
数组名中存储的是数组在堆中一整块区域的首地址
3、数组的元素如何存储
在堆中,依次连续的存储的
说明:
数组名,其实也是变量。
回忆:
变量的声明和初始化
数据类型 变量名 = 变量值;
现在:
int[] array = {1,3,5,7,9};
其中的 int[]也是一种数据类型,数组类型,它是一种引用数据类型

引用,表示引用一个“对象”,引用堆中的一块内存
Java程序是在JVM中运行,JVM中的内存最最主要的两块区域:栈和堆
其中的栈就是存储我们的局部变量(现在见到的变量都是局部变量),
堆中存储的是对象
*/

//实例
int [] array=new int[]{1,3,5,7,9};
System.out.println(array);//打印数组名
////结果只打印出了:[I@15db9742
//这个值是,数组对象的类型@对象的hasCode编码值
//其中[I,表示int[]类型
//15db9742是这个数组对象的hashCode编码值,类似于每个人都有一个身份证号

//----数组中求最大值、最小值、平均值-----------------------------------------------------
int[] array = {4,2,6,8,9};
//最大值[特别注意]需要一个temp 变量来存储最大值

//方式1
int max=-1;
for(int i=0;i<array.length-1;i++ ){
if(array[i]>array[i+1]){
max=array[i];
}else{
max=array[i+1];
}
}
System.out.println(max);

//方式2

//在数组中找最大值
//类似于:猴子掰玉米
//先假设第一个最大,然后与后面的元素一一比较,如果有比手上还大,就修改手上的玉米
//(1)//先假设第一个元素最大
int max = array[0];
//(2)用max中的值,与后面的元素一一比较,如果有比max的值还大,就修改max的值
//这里i=1的原因,max与[1,长度-1]的元素比较就可以了,不用再与[0]元素进行比较
for(int i=1; i<array.length; i++){
if(array[i] > max){
max = array[i];
}
}
System.out.println("最大值是:" + max);

int[] array = {4,2,-7,8,1,9};
//最小值及其下标
//(1)假设第一个元素最小
int minIndex = 0;//array[minIndex]就是最小值

//(2)用min与后面的元素一一比较
for(int i=1; i<array.length; i++){
if(array[i] < array[minIndex]){
minIndex = i;
}
}
System.out.println("最小值是:" + array[minIndex]);
System.out.println("最小值的下标是:" + minIndex);

*/
//练习
/*
有一组学员的成绩存储在数组中,统计总分和平均分
*/
int[] scores = {78,89,56,99,100};
//总分:
int sum=0;
for(int i=0;i<scores.length;i++){
sum+=scores[i];
}
System.out.println("总分是"+sum);
//平均分
System.out.println("平均分是"+sum/scores.length);

//人数就是数组的长度
/*

/*
程序:
(1)数据结构:如何存储数据
(2)算法:实现功能的代码的逻辑结构

数组的相关的算法操作:
1、在数组中找最大值/最小值
2、在数组中找最大值/最小值及其下标
3、数组的元素累加和及平均值
4、数组的反转
*/
//数组的反转
//有一个数组,存储26个字母
char[] letters=new char[26];
for(int i=0;i<26;i++){
letters[i]=(char)('A'+i);
//赋值后立刻输出看一下
System.out.println(letters[i]);
}
//反转
//原来letters[0]中存储的是'A'-->现在letters[0]中存储的是'Z'
//...
//原来letters[25]中存储的是'Z'-->现在letters[25]中存储的是'A
System.out.println("-----------反转-----------------------------------");
//思考需要交换几次

//方式1
char[] temp=new char[26];
for(int i=0;i<letters.length;i++){
temp[letters.length-1-i]=letters[i];
}
letters=temp;
//再输出反转后的数据
for(int i=0;i<letters.length;i++){
System.out.println(letters[i]);
//方式2

//问题1:交换几次 次数 = 长度/2 例如:6个元素交换3次,5个元素交换2次
/*
这个i可以用作下标,同时循环的次数,可以表示交换的次数
*/
for(int i=0; i<letters.length/2; i++){
//问题2:谁和谁交换
//letters[0] ~ letters[25]
//letters[1] ~ letters[24]
//..
//首尾交换
//letters[i] ~ letters[长度-1 - i]

//问题3:如何交换
//借助第三个变量
char temp = letters[i];
letters[i] = letters[letters.length-1-i];
letters[letters.length-1-i] = temp;
}
//显示结果
for(int i=0; i<letters.length; i++){
System.out.println(letters[i]);
}

//数组的复制---------------------------------------------
/*
程序:
(1)数据结构:如何存储数据
(2)算法:实现功能的代码的逻辑结构

数组的相关的算法操作:
1、在数组中找最大值/最小值
2、在数组中找最大值/最小值及其下标
3、数组的元素累加和及平均值
4、数组的反转
5、数组的复制
(1)复制一个和原来一样的数组,长度和元素
(2)复制一个比原来数组短的
例如:从原数组中截取一部分
(3)复制一个比原来的长的
例如:数组扩容,那么新数组会比原来的数组长
*/
//(1)复制一个和原来一样的数组,长度和元素
int[] arr={1,2,3,4};
//创建一个新数组,和原来长度不一样也可
int[] arrCopy=new int[0];
arrCopy=arr;
//遍历新数组
for(int i=0;i<arrCopy.length;i++){
System.out.println(arrCopy[i]);
}
//方式2
//再创立一个数组,长度和原来一致即可
int []arrCopyTwo=new int[arr.length];
//复制元素
for(int i=0;i<arrCopyTwo.length;i++){
arrCopyTwo[i]=arr[i];
}
//遍历新数组
System.out.println("------------------------"
);
for(int i=0;i<arrCopyTwo.length;i++){
System.out.println(arrCopyTwo[i]);
}

//方式3 复制一个比原来长的数组-----------------------------------------------------
int[] arrCopyThree=new int[arr.length*2];
//复制元素:错误示例

//for(int i=0;i<arrCopyThree.length;i++){
// arrCopyThree[i]=arr[i];//[特别注意。这样是会报错的]
//}
//复制元素:正确示例
for(int i=0;i<arr.length;i++){
arrCopyThree[i]=arr[i];//[特别注意。这样是会报错的]
}
//遍历结果
System.out.println("------------------------");
for(int i=0;i<arrCopyThree.length;i++){
System.out.println(arrCopyThree[i]);
}
























}
}

原文地址:https://www.cnblogs.com/liliang07/p/13277100.html