一. 数组基础知识:
所谓数组就是数据的组合,但是这个数据在C、C++、Java、pascal中要求是同一类型。但也并非所有涉及数组的地方都这样,比如在Visual Foxpro中的数组就并没这样的要求,但是要求同一类型也有它的道理,就像人们把吃的和吃的放一起用的和用的放一起一样以方便存取。
Java中数组是存储同一类型的数据的集合。
数组是一种数据结构,是一种线性的连续存储数据空间的数据结构,同样也是所有数据结构中访问速度最快的一种,之所以访问速度快在于数组可以通过数组的下标进行定位获取和存储数据。
上面介绍数组是存储同一类型数据的集合,可是有时候在存储前并不知道自己到底存储哪个类型怎么办,在这之前我们先了解一下数据类型
数据类型:基本数据类型和引用数据类型
基本数据类型包括:byte,short,int,long,float,double,char,boolean
引用数据类型:所有用class定义的类
Object是Java中所有类的父类,同样也是所有基本数据类型所对应的封装类的父类(所有数据类型都有一个对应的封装类),所以我们在不确定类型时可以用Object类
数组在java中是类,类肯定有方法和属性,数组自身有且仅有一个属性即获取数组存储多少数据的属性:length;但是有从Object继承过来的属性
二.数组的定义
数组基础知识有了初步了解,可是我们现在如何定义呢,如何创建一个数组呢?接下来以一维和二维数组为例,来了解一下数组的定义方式。在定义数组时我们要切记数组的大小在定义时就已经给出,并且后边不容更改。
1.定义一维数组
数据类型[] 数组名 = {值,.......};
数据类型[] 数组名 = new 数据类型[长度];
数据类型[] 数组名 = new 数据类型[]{值,.......};
数据类型[] 数组名;
数组名 = new 数据类型[长度];
数组名 = new 数据类型[]{值,......};
2.定义二维数组
数据类型[][] 数组名 = {{值,.......},.......};
数据类型[][] 数组名 = new 数据类型[行][列];
数据类型[][] 数组名 = new 数据类型[][]{{值,...........},.........};
数据类型[][] 数组名;
数组名 = new 数据类型[行][列];
数组名 = new 数据类型[][]{{值,.......},........};
三.数组的使用
数组现在大家已接会定义了,可是如何用呢?说到如何用我们就来看我们需要什么,我们首先要知道一个数组能存储多少元素,还要知道数组某一位置的值,多维数组有多少行等,接下来依旧以一维和二维数组为例:
获取一维数组中能存储的元素总数:数组名.length
获取或者设置一维数组的某一个位置的值:数组名[下标]
数组的下标是从什么时候开始计数的? 从0开始
数组的length是从什么时候开始计数的? 从1开始
获取二维数组有多少行:数组名.length
获取二维数组中某一行有多少列:数组名[行下标].length
获取二维数组中能存储的元素总数:
new 数组类型[][]{{值,…},…}:数组名[行下标].length+…
new 数组类型[行][列]:数组名.length*数组名[行下标].length
四.数组在内存中的存储
如图所示,数组在内存中存储的方式是把数组名和数组在堆中数据的地址存储在栈中,数组的每一行都是线性的连续存储数据空间,一维数组只有一行,所以就是一个单独的线性连续存储空间,而二维数组由多行组成,栈中
第一步:栈存储局部变量(在方法定义中或方法声明的变量),所以int[] a,int[][] a1存放在栈中;
第二步:new出的变量放在堆里,所以 new int[7],new int[3][4]在堆中;
第三步:每一个new出来的东西都有地址值(系统随机分配),所以new int[7],new int[3][4]的地址值分别是@12,@123;把@12赋给a,把@123赋给a1,在栈中的数组通过地址值找到堆中相应的地址。用数据名和编号的配合就可以找到数组中指定编号的元素,这种方法叫做索引;
第四步:int类型的数据默认值为0;
第五步:给数组中的每一个元素赋值,把原先的默认值替代;
栈和堆的内存方式的特点:
堆内存的特点:
1.每一个new出来的东西都有地址值;
2.每个变量都有默认值:
数据类型 | byte | short | int | long | float | double | char | boolean | 引用类型 |
---|---|---|---|---|---|---|---|---|---|
默认值 | 0 | 0 | 0 | 0 | 0.0 | 0.0 | 空字符 | false | null |
3.使用完毕后就变成了垃圾,但是并没有立即回收。会在垃圾回收器空闲时回收。
栈内存的特点:
栈内存中数据用完就会释放掉。是脱离了变量的作用域后会释放掉。
例:
//建一个学生类,根据输入值,随机生成学生信息
import java.util.Random; //random()函数,返回一个随机0~num-1之间的随机数
import java.util.Scanner;
public class student1 {
private String name;
private int age;
private int number;
private int grade;
public void setname(String name){
this.name=name;
}
public String getname(){
return name;
}
public void setage(int age){
this.age=age;
}
public int getage(){
return age;
}
public void setnumber(int number){
this.number=number;
}
public int getnumber(){
return number;
}
public void setgrade(int grade){
this.grade=grade;
}
public int getgrade(){
return grade;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("学生数量:");
int length = sc.nextInt();
student1 [] st= cratest(length);
printst(st);
}
//随机产生学生信息
public static student1[] cratest(int length){
int age ;
int number;
String name;
int grade;
int a,b;
student1 [] st= new student1[length];
for(int i=0;i<st.length;i++){
st[i]=new student1();
Random rand = new Random();
//获取年龄
age = rand.nextInt(10) + 15;
st[i].setage(age);
//获取学号
number = rand.nextInt(100000) + 100000;
st[i].setnumber(number);
//获取姓名
String[] firstNameArray = { "李", "王", "张", "刘", "陈", "杨", "赵", "黄", "周", "吴", "徐", "孙", "胡", "朱", "高", "欧阳",
"太史", "端木", "上官", "司马" };// 20个姓,其中5个复姓
String[] LastNameArray = { "伟", "勇", "军", "磊", "涛", "斌", "强", "鹏", "杰", "峰", "超", "波", "辉", "刚", "健", "明", "亮",
"俊", "飞", "凯", "浩", "华", "平", "鑫", "毅", "林", "洋", "宇", "敏", "宁", "建", "兵", "旭", "雷", "锋", "彬", "龙", "翔",
"阳", "剑", "静", "敏", "燕", "艳", "丽", "娟", "莉", "芳", "萍", "玲", "娜", "丹", "洁", "红", "颖", "琳", "霞", "婷", "慧",
"莹", "晶", "华", "倩", "英", "佳", "梅", "雪", "蕾", "琴", "璐", "伟", "云", "蓉", "青", "薇", "欣", "琼", "宁", "平",
"媛" };// 80个常用于名字的单字
a = rand.nextInt(20) ;
b = rand.nextInt(80) ;
name=firstNameArray[a] +LastNameArray [b];
// name = "2";
st[i].setname(name);
// System.out.println(name+"\t"+age+"\t"+number);
//获取班级
grade = rand.nextInt(10) + 15;
st[i].setgrade(grade);
}
return st;
}
//输出信息
public static void printst(student1[] st) {
System.out.println("姓名"+"\t"+"年龄"+"\t"+"学号"+"\t"+"班级\t"); //"\t"制表符
for (int i = 0; i < st.length; i++) {
System.out.println(st[i].getname() + "\t"+st[i].getage()+"\t"+st[i].getnumber()+"\t"+st[i].getgrade()+"\t");
}
System.out.println();
}
}
下面以输入4和输入8为例,结果如下: