Java学习
百知教育学习 - 胡鑫喆 - Java数组
01_数组的基本概念
- 数组
- 基本概念:一组连续的存储空间,存储多个相同数据类型的值
- 特点:
- 类型相同
- 长度固定
- 数组中的每个数据格被称为 “数组元素”
- 对每个元素进行赋值或取值的操作被称为 “元素的访问”
- 访问元素时,需要使用 “下标”(从0开始,一次 +1,自动生成)
- 访问的语法:数组名 [下标] ;//例如 存:a[0]=10,取 a[0];
- a = new int [5] 为数组分配空间,并且
- 数值类型 默认值为0
- boolean类型 默认值为false
- 对象(string)类型 默认值null
package day5;
public class TextArray {
public static void main(String[] args) {
int [] a;//一次性定义了多个 int 类型的变量
//int a[]; 或 int []a;两种定义方法
//定义数组后,未给出长度时,虚拟机不会给数组分配相应的存储空间
a = new int[5];
a[0]=2;
a[1]=3;
a[2]=6;
a[3]=8;
a[4]=9;
System.out.println(a[0]);
System.out.println(a[1]);
System.out.println(a[2]);
System.out.println(a[3]);
System.out.println(a[4]);
/*for(int i = 0; i< a.length; i++) {
System.out.println(a[i]);
}*/
}
}
02_ 数组的创建与初始化
- 数组创建语法:
- 先声明、再分配空间
- 数据类型 [ ] 数组名;
- 数组名 = new 数据类型 [长度];
- 声明并分配空间
- 数据类型 [ ] 数组名 = new 数据类型 [长度];
- 声明并赋值(繁):
- 数据类型 [ ] 数组名 = new 数据类型 [ ] {value1 , value2, value3,…};
- 先声明、再分配空间
package day5;
public class TextArray2 {
public static void main(String[] args) {
//数组的默认值为0
int[] a = new int [] {2,1,4,5,7};//显示初始化
//int[] a = new int[5]{2,1,4,5,7};error :数组里边的数目有大括号里的内容决定,小括号不起作用了
//int[] a = {2,1,4,5,7};ok!
/*
int []a;
a = new int[]{2,1,4,5,7}; ok!
*/
/*
int []a;
a = {2,1,4,5,7}; error!
*/
}
}
练习题
计算已知数组的的总分与平均分
package day5;
public class TextArray3 {
public static void main(String[] args) {
double[] exam = {100,80,90.5,85.5,95};
double result = 0;
for(int i=0; i<exam.length; i++) {
result+=exam[i];
}
System.out.println(result);
System.out.println(result/exam.length);
}
}
03_可变长参数
package day5;
public class TextVarArgs {
public static void main(String[] args) {
System.out.println(add(1));
System.out.println(add(1,3));
System.out.println(add(1,3,5));
}
//0~n个int
//参数表里只能有一个可变长参数(不然无法分别),而且必须是参数表中最后一个参数(也就是说:public static int add(int... a,int b)是错误的)
public static int add(int... a) {
//把a作为整形数组处理
int result = 0;
for(int i=0; i<a.length; i++) {
result+=a[i];
}
return result;
}
}
04_数组的扩充
- 在虚拟机分配空间时,数组空间是连续的,以字节存储
- 数组下标从0开始(提高数组的查询效果)
- 因为数组空间是连续的,所以长度是固定的,数组一旦分配好空间,长度就固定了。
- 如何扩充数组:创建一个新数组,将原来的数组复制进去,代码如下:
package day5;
public class TextArrayExpand {
public static void main(String[] args) {
int[] a = {1,2,3,4,5};
int[] b = new int[a.length*2];
for(int i=0; i<a.length; i++) {
b[i]=a[i];
}
for(int i=0; i<b.length; i++) {
System.out.println(b[i]);
}
System.out.println(a.length);
a=b;//a中存放的数组的地址,b变量存放的也是地址(解释见05),地址指向发生变化
System.out.println(a.length);
}
}
05_数组引用的概念(好处:查询效率高 / 弱点:插入,删除数据很难)
链表与数组作用好处相反,散列表浪费空间,从而使查询,插入,删除效率都很高
- java 数据类型(区别:)
- 简单数据类型:8种 int float double char byte long short bool(把数据存入到变量里)
- 对象数据类型:不是以上8种的类型为对象数据类型 (把数据的首地址存入变量里) 整形数组不是整形,所以为对象数据类型
package day5;
public class TextReference {
public static void main(String[] args) {
int[] a = {1,2,3,4,5};
int[] b = a;
b[0] = 10;
System.out.println(a[0]);
int c=1;
int d=c;
d=10;
System.out.println(c);
}
}
package day5;
public class TextReference {
public static void main(String[] args) {
/*
int[] a = {1,2,3,4,5};
int[] b = a;
b[0] = 10;
System.out.println(a[0]);
int c=1;
int d=c;
d=10;
System.out.println(c);
*/
int[] a= {1,2,3,4,5};
change(a);//a代表数组首地址
System.out.println(a[0]);
int c=1;
change(c);
System.out.println(c);
}
static void change(int[] a) {
a[0] = 10;
}
static void change(int c) {
c=10;
}
}
06_二维数组(java中没二维数组,只是在一维数组基础上建成的)
- 概念:一维数组中的一堆数组,数组中的元素还是数组
- java中只维护了一维数组连续的特点
package day5;
public class TextMultiArray {
public static void main(String[] args) {
int[][] a;
//a = new int[4][7];//前边为高维下标,后边为低维下标
a = new int[][] {{100,90,80},{100,20,50},{80,60,90},{40,60,50}};
for(int i=0; i<a.length; i++) {
for(int j=0; j<a[i].length; j++) {
System.out.print(a[i][j]+"\t");
}
System.out.println();
}
/*int[][] a = new int[3][];
a[0] = new int[5];
a[1] = new int[4];
a[2] = new int[6]; 正确,可以做一个不规则的二维数组
int [] [] a = new int [] [8];error 无法分配空间*/
}//a[i]里边的元素内存地址一定连续,但a[0],a[1],a[2]之间不一定连续
}
07_案例 杨辉三角形
package day5;
import java.util.*;
public class Exc4_1 {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int n = s.nextInt();
int[][] a = new int[n][];
for(int i=0; i<n;i++) {
a[i]=new int[i+2];
a[i][0]=1;
a[i][i+1]=1;
for(int j=i; j<n; j++) {
System.out.print(" ");
}
for(int j=1; j<=i; j++) {
a[i][j] = a[i-1][j-1]+a[i-1][j];
}
for(int j=0; j<i+2; j++) {
System.out.print(a[i][j]+" ");
}
System.out.println();
}
}
}