从零开始学习java,一天进步一点点,一天学习一点点,多掌握知识和多多做题,本篇主要写java的基本语法中数组的基础
java基础语法
java基础学习(四)
1.数组定义和访问
1.1.1 数组(容器)概述
- 容器概念
- 容量:是将多个数据存储到一起,每个数据称为该容器的元素。
- 生活中的容器:水杯、教室、衣柜
- 案例分析
- 假如需要统计某公司员工的工资情况,例如计算平均工资、最高工资、最低工资等。假设该公司有500名员工,用前面学的知识,程序员首先需要声明500个变量分别存储每位员工的工资,然后在进行操作,这样做会很麻烦的,而且错误率也会很高,因此我们可以使用数组(容器)进行操作,将所有的数据全部存储到一个数组中,统一操作。
1.2 数组概念
- 数组概念:数组就是存储一组相同类型数据的数据结构。
- 数组本身属于引用类型
- 数组中的元素可以是基本数据类型,也可以是引用类型。
- 【引用类型包括:数组、类、接口】
1.3数组的定义
1.3.1语法一
-
语法:
-
数组存储的数据类型[] 数组名字=new 数组存储的数据类型[长度];
-
数组定义语法详解:
- 数组存储的数据类型:创建数组存储什么类型数据的数据类型
- []:表示数组
- 数组名字:定义数组时起的变量名,符合标识符即可,可以使用数组名字对数组进行操作。
- new:关键字,创建数组使所使用的关键字
- 数组存储数据的数据类型:必须和前面定义的数据类型一致
- [长度]:表示数据的长度,也就是表示数组中可以存储多少数据
- 注意,数组是定长特性,长度一旦指定,就不可改变
-
举例:
- 定义可以存储5个整数的数组,代码如下:
public class Test01 {
public static void main(String[] args) {
int[]nums=new int[5];
char[]c=new char[5];
boolean[]b=new boolean[2];
String[]str=new String[5];
}
}
1.3.2 语法二
- 语法:
数据类型[]数组名=new 数据类型[]{元素1,元素2,元素3,…};
- 这种语法,属于在创建数组时,就对数组进行初始化操作。
- []:不需要指定数组的长度,数组的长度由{}中元素的个数来决定。
- 例如:
public class Test02 {
public static void main(String[] args) {
int[]arr=new int[]{1,2,3,4,5};
}
}
1.3.3 语法三
- 语法:
数据类型[]数组名={元素1,元素2,元素3,元素4,…};
- 例如:
public class Test03 {
public static void main(String[] args) {
int[]nums={1,2,3,4,5};
}
}
1.4数组的访问
1.4.1 概述
- 索引:每一个储存到数组的元素,都会自动拥有一个整数编号,从0开始,这个自动编号称为数组的索引(index)或下标,可以通过数组的索引访问到数组中的元素。
- 语法:数组名[索引]
- 数组的长度属性:每个数组都具有长度,而且是固定的,java中赋予了数组一个属性,可以获取数组的长度,语法为,数组名.length,属性length的执行结果就是数组的长度。由此可以推出数组的最大索引值为数组-1,也就是数组名.length-1。
- 索引访问数组的元素
- 数组名[索引]=数值,为数组的元素赋值
- 数组名[索引],获取数组中的元素
1.4.2 示例
package com.bdit;
import java.sql.SQLOutput;
public class Test04 {
public static void main(String[] args) {
// 定义数组
int[] num1 = new int[5];
int num2[]= new int[5];
// 赋值:动态赋值
// 像 num1和num2这种定义的方式,定义后本身没有数据,应先用 “ 数组名称[下标值]=数据 ” 这种方式给予赋值,然后进行输出
num1[0]=0;
num1[1]=10;
num1[2]=20;
num1[3]=30;
num1[4]=40;
// 输出
// 第一种输出方式:
System.out.println("这是Sys输出num1的方式"+num1[0]);
System.out.println("这是Sys输出num1的方式"+num1[1]);
System.out.println("这是Sys输出num1的方式"+num1[2]);
System.out.println("这是Sys输出num1的方式"+num1[3]);
System.out.println("这是Sys输出num1的方式"+num1[4]);
System.out.println("--------------分隔符------------------");
// 第二种输出方式:
/*” 数组名称.length “ 用于获取数组元素的总长度
num1[i] 通过i来获取num1数组的下标值,在输出数组num1中的数据*/
for(int i=0;i<num1.length;i++){
System.out.println("这是for循环输出num1下标的方式"+i);
System.out.println("这是for循环输出num1的方式"+num1[i]);
}
System.out.println("==============================分隔符==============================");
/*第二种方法:
数据类型[] 数组名称 = new 数据类型[]{元素1,元素2,元素3,元素4,......}*/
double[] num3 = new double[]{2.3,2.6,2.36,23.0,36.9};
for(int i=0;i<num3.length;i++){
System.out.println("这是for循环输出num3的方式"+num3[i]);
}
System.out.println("==============================分隔符==============================");
/*第三种方法:
数据类型[] 数组名称 = {元素1,元素2,元素3,......}*/
char[] num4 = {'a','b','c','d'};
for(int i=0;i<num4.length;i++){
System.out.println("这是for循环输出num4的方式"+num4[i]);
}
}
}
1.5 数组的常见操作
1.5.1 数组越界异常
- 在程序运行后会抛出:ArrayIndexOutOfBoundsException 则代表数组索引越界异常
- 示例:
package com.bdit;
public class Test05 {
public static void main(String[] args) {
int[]arrs={1,2,3};
System.out.println(arrs[3]);
}
}
1.5.2 数组空指针异常
- 示例:
package com.bdit;
public class Test06 {
public static void main(String[] args) {
int[]arr=null;//数组属于引用类型,如果给引用类型赋值为空,那就是null
System.out.println(arr[0]);
}
}
- 以上代码,在运行过程中,因为数组arr=nulll,索引再访问数组中的元素时,会产生一个NullPointerException空指针异常。
1.6 数组的遍历
public class Test07{
public static void main(String[] args) {
int[]nums=new int[]{1,2,3,4,5,6,7,8,9};
for(int i=0;i<nums.length;i++){
System.out.println(nums[i]);
}
}
}
1.6.1 示例
package com.bdit;
/*
数组的反转,例如原始数组为1,2,3,4,5,反转后的数组为5,4,3,2,1
*/
public class Test7 {
public static void main(String[] args) {
int[]arr={1,2,3,4,5};
//获取最大索引
int max=arr.length-1;
for(int min=0;min<=max;min++){
//利用第三方变量完成数组中的元素交换
int temp=arr[min];
arr[min]=arr[max];
arr[max]=temp;
max--;//最大索引
}
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
}
}
1.7 练习
1.7.1 计算某个数组中所有元素的和以及平均数
package com.bdit;
/*
* 求数组中所有元素的和、平均数
* */
public class Test3 {
public static void main(String[] args) {
int[]nums=new int[]{19,22,34,10,76,54,88};
int sum=0;
for(int i=0;i<nums.length;i++){
sum+=nums[i];//sum=sum+nums[i]
}
double avg=sum/ nums.length;
System.out.println("和:"+sum+",平均数:"+avg);
}
}
1.7.2 自定义一个数组,统计出数组中最大的数和最小的数
public class Test04 {
public static void main(String[] args) {
// 自定义一个数组,数组里的数随意排放,统计出数组中最大的数和最小的数
int[] a = {89,30,2,1,3,66};
int max =a[0];
int min =a[0];
for(int i=0;i<a.length-1;i++){
int i1=a[i];
if(max<i1){
max=i1;
}else if(min>i1){
min=i1;
}
}
System.out.println(max);
System.out.println(min);
}
}
1.7.3 自定义一个数组,存储5个学员的成绩,求最高成绩、最低成绩、总成绩、平均成绩
package com.bdit;
public class Test05 {
public static void main(String[] args) {
// 自定义一个数组,存储5个学员的成绩,求最高成绩、最低成绩、总成绩、平均成绩
int[] a = {33,56,89,52,30};
int max =a[0];
int min =a[0];
int b=0;
int c=0;
for(int i=0;i<a.length;i++){
int i1=a[i];
// System.out.println(a[i]);
if(i1>max){
max=i1;
}else if(i1<min){
min=i1;
}
b+=a[i];
c=b/a.length;
//System.out.println(i1);
}
System.out.println("最高成绩"+max);
System.out.println("最低成绩"+min);
System.out.println("总成绩"+b);
System.out.println("平均成绩"+c);
}
}
1.7.4 键盘输入5个学员的成绩存储到数组中,并计算总成绩和平均成绩和最高个人成绩以及最低成绩
package com.bdit;
import java.util.Scanner;
public class Test06 {
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
System.out.println("请输入要输入学员的个数:");
//使输入学员个数位整数
int in = sc.nextInt();
// 键盘输入5个学员的成绩存储到数组中,并计算总成绩和平均成绩和最高个人成绩以及最低成绩
//获取要输入学员的个数
double[] a= new double[in];
double all = 0;
double avg = 0;
//循环输出五次提示输入第几名学员(1-5)的成绩
for(int b=0;b<in;b++){
System.out.println("请输入第"+(b+1)+"位学员的成绩:");
a[b] = sc.nextDouble();
}
//循环输出第几名学员(1-5)的成绩(根据输入使第几名依次增加)
for(int f=0;f<a.length;f++){
System.out.print("第"+(f+1)+"位,学员成绩-->"+a[f]+" ");
}
System.out.println("\n");
double max =a[0];
double min =a[0];
for (int c=0;c<=a.length-1;c++){
//输出最大值
if(a[c]>max){
max=a[c];
}
//输出最小值
if (a[c] < min){
min = a[c];
}
//输出总值
all+=a[c];
//输出平均数
avg=all/in;
}
System.out.println("最大值"+max);
System.out.println("最小值"+min);
System.out.println("总成绩"+all);
System.out.println("平均成绩"+avg);
}
}
1.8增强for循环
1.8.1 格式
for(数据类型 变量名:数组名或集合名){
}
1.8.2示例
public static void main(String[] args) {
int[]nums={1,2,3,4,5,6};
//增强的for循环
for(int n : nums){
System.out.println(n);
}
}
- 增强for循环弊端
- 无法获取元素索引值
- 增强的for循环只适用于对数组中的元素进行遍历操作
2.数据内存分析
2.1内存概述
- 内存是计算机中的重要原件,临时数据存储区域,作用是运行程序。我们编写的程序是存放在硬盘中,在硬盘中的程序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存。
- Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。
2.2Java虚拟机的内存划分
- 为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据的方式和内存管理方式。
区域名称 | 作用 |
---|---|
寄存器 | 给CPU使用,和我们开发无关 |
本地方法栈 | JVM在使用操作系统功能的时候使用,和我们开发无关 |
方法区 | 存储可以运行的class文件 |
堆内存 | 存储对象或者数组,new来创建的,都存储在堆内存中 |
方法栈 | 方法运行时使用的内存,比如main方法运行,就会进入方法栈中 |
2.3 数组在内存中的存储
-
一个数组的内存图
public static void main(String[] args) { int[]arr=new int[4]; System.out.println(arr);//[I@f5f2bb7 }
以上方法执行,输出的结果是[I@f5f2bb7,这个是什么?是数组在内存中的地址,new出来的内容,都是在堆内存中存储的,而方法中的变量arr保存的是数组的地址。
输出arr[0],就会输出arr保存的内存地址中数组中索引为0上的元素。
-
二个数内存图
- 两个变量指向一个数组
public static void main(String[] args) {
int[]arr=new int[4];
//数组赋值
arr[0]=10;
arr[1]=20;
arr[2]=30;
arr[3]=40;
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println(arr[3]);
//定义数组变量arr2,将arr的地址赋值给arr2
int[]arr2=arr;
arr2[1]=99;
System.out.println(arr[1]);
}
2.4 Java中内存分配
2.5方法栈
package com.bdit.Test;
public class Test02 {
// 当方法运行时,先进入main方法的方法栈,运行代码当运行到 ”test_Ff01()“ 方法时,进入 ”test_Ff01()“ 方法的方法栈,
// 当运行完后 ”test_Ff01()“ 其方法栈则会消失,而这时 "main()" 方法并没运行完,再继续运行 "main()" 方法,
// 当 "main()" 方法运行完, "main()" 方法对应的方法栈也会消失
// 栈就是内存
public static void main(String[] args) {
System.out.println("===main方法的开始===");
// 调用方法
test_Ff01();
test_Ff001();
System.out.println("===main方法的结束===");
}
public static void test_Ff01(){
System.out.println("无参数,无返回值");
}
public static void test_Ff001(){
System.out.println("这是test_Ff001();");
}
}
3.总结
本篇大部分为应用,最好不要死记硬背,因为这样就算记住在应用上也是很生涩的,并没有那种依靠自己理解来记住用的方便,而基础的问题一定要掌握,基础打好等到后面难的也会变简单。