假如我们需要用到1000个相同类型的数据,肯定不可能创建1000个变量,

这样既不方便,也不直观,也不便于我们使用。这时就需要用到数组。

一、数组的声明与使用

 public class Array {
public static void main(String[] args) {
int a[] = null; //数据类型 数组名 = null;声明一维数组
a = new int[10]; //数组名 = new 数据类型[长度];分配内存给数组。
} }

首先第一句,声明了数组a,此时栈内存中就分配了一块内存空间给a,此时将null给a代表不指向任何实例(此时a只在栈内存中进行了创建,但是它没有指向堆内存中任何对象实例,也没有指向堆内存),所以不能使用(引用)具体的实例数据。

第二句,用new在堆内存中创建了十个int类型的存储空间,然后把这个内存空间的地址给a。

此时堆内存中就可以存放10个int型的数据,栈内存中的a存放了堆内存的地址值。这时可以通过数组a引用堆内存的内容。

二、数组元素的表示方法

数组用下标区别元素,下标从0到n-1;

例如创建的a数组长度为10,即下标从0~ 9;

a[10] 并不存在,引用a[10]会出现错误,下标只能到a[9];

public class Array {
public static void main(String[] args) {
int a[] = null;
a = new int[10];
for(int i = 0; i < 10; i++){ //其中i < 10可以写成 i<a.length,
a[i] = i; //数组循环赋值并打印
System.out.println(a[i]);
}
System.out.println(a.length); //数组名.length代表数组的长度,且会返回一个int值。
}
}
运行结果:
0 1 2 3 4 5 6 7 8 9
10

三、数组的静态初始化

上面给数组赋值是在数组创建完毕后,再给数组中元素赋值,属于动态初始化。

在数组元素创建时就直接赋值属于静态初始化。

数据类型 数组名[] = {初始值0,初始值1,初始值2,···,初始值 n};

虽然声明时没有指定数组长度,但由初始化时初始值的个数编译器会自动确定长度和初始值个数相同。

 public class Array {
public static void main(String[] args) {
int a[] = {0,1,2,3,4,5,6,7,8,9};
for(int i = 0; i < a.length; i++){
a[i] = i;
System.out.println(a[i]);
}
System.out.println(a.length);
}
}
运行结果:
0 1 2 3 4 5 6 7 8 9
10

三、二维数组

一维数组可以看做是具有1行n列的元素的集合。

而二维数组可以看做是具有m行n列的元素的集合。

声明方法和一维类似,不同的是需要确定行数和列数。

 public class Array {
public static void main(String[] args) {
int a[][] = new int[3][4]; //代表创建了一个三行四列的数组。
}
}

二维数组的引用

public class Array {
public static void main(String[] args) {
int a[][] = new int[3][4];
int num = 0;
for(int i = 0; i <a.length; i++){
for(int j = 0; j < a[i].length; j++){
a[i][j] = num++;
System.out.print(a[i][j] + " " );//前面的下标代表行,后面代表列
}
System.out.println();
}
}
}
运行结果:
0 1 2 3
4 5 6 7
8 9 10 11

上列的a.length可以看做组成二维数组的一维数组的个数(例如上面可以看做由三个一维数组组成了二维数组),a[i].length可以看做当前行中数组的个数。

由此推到n维,假设有n维数组A;则a.length代表n维数组中n-1维数组的个数,a[i].length代表n-1维数组中n-2维数组的个数......

二维数组中每一行的元素个数也不一定相等

例如

 public class Array {
public static void main(String[] args) {
int a[][] = {{1,},{1,2},{1,2,3}};
int num = 0;
for(int i = 0; i <a.length; i++){
for(int j = 0; j < a[i].length; j++){
a[i][j] = num++;
System.out.print(a[i][j] + " " );//前面的下标代表行,后面代表列
}
System.out.println();
}
}
}
运行结果:
0
1 2
3 4 5

初始化时一共有三个一维数组,但每一行的元素个数不同,a[i].length代表当前行中元素的个数。

我们尝试输出a[0][2]会出现java.lang.ArrayIndexOutOfBoundsException,代表数组下标越界。

说明a[0][2]没有分配内存,也可以说它不存在。

四、数组的引用传递

我们看下列代码

 public class Array {
public static void main(String[] args) {
int a[] = {1,2,3};
fun(a);
System.out.println(a[0]);
}
static void fun(int x[]){
x[0] = 123;
}
}
运行结果:
123

可以发现,我们将数组名a作为参数传递给了fun方法。

fun方法中修改了第一个元素的值,在main中输出的值也改变了了。

说明堆内存中的值被更改了。

传递过程:

首先前面讲到数组名存放的只是堆内存中创建好的数组空间的地址。

将数组名传递给函数fun传递的是堆内存空间的地址。

这时fun中的数组x[]就和main中的数组a[]指向了同一块地址。

利用x[]就可以对堆内存中内容进行操作。

fun方法结束后,数组x[]会被释放掉,但对堆内存的操作却保留了下来。

这点和c语言的指针类似。

五、java对数组的新特性(jdk1.5(javase5.0)之后)。

1.可变参数

在调用一个方法时,会根据定义的传递指定的参数。

而可变参数代表传递给方法的参数个数是不定的。

方法名称(类型...参数名称){

}

public class Array {
public static void main(String[] args) {
int a[] = new int[5];
fun();
fun(1);
fun(1,2,3);
fun(1,2,3,4,5);
} private static void fun(int...arg){
int i = 0;
for(i = 0; i <arg.length; i++){
System.out.print(arg[i]);
}
System.out.println();
}
运行结果:
//此处有一个换行,当
1
123
12345

向方法中传递可变参数后,可变参数是以数组的形式保持下来的,调用可变参数也是以数组得形式调用

上列代码fun方法中可以看做把可变参数传递给了名为arg的数组,arg数组中就存放了传递过来的参数。

2.foreach输出

for(数据类型 变量名称:数组名称){

}

 public class Array {
public static void main(String[] args) {
int a[] = new int[10];
for(int i = 0; i < a.length; i++)
a[i] = i;
for(int m:a){ //用foreach输出,就相当于逐次将数组元素给变量m,
System.out.print(m + " "); //然后通过变量m来进行操作。
}
}
}
运行结果:
0 1 2 3 4 5 6 7 8 9

下面结合可变参数和foreach

 public class Array {
public static void main(String[] args) {
int a[] = new int[5];
fun();
fun(1);
fun(1,2,3);
fun(1,2,3,4,5);
} private static void fun(int...ar){
for(int m : ar){
System.out.print(m);
}
System.out.println();
}
}
运行结果:

1
123
12345

1.14(java学习笔记)数组的更多相关文章

  1. JAVA学习笔记--数组初始化

    JAVA中,数组只是相同类型的.用一个标识符名称封装到一起的一个对象序列或基本类型数据序列.数组通过方括号下标操作符[]来定义和使用,要定义一个数组只需在类型名后面加上一个方括号即可,如: int[] ...

  2. java学习笔记 --- 数组

    一.Java的内存分配   A:栈内存: 存储局部变量,只要是在方法中定义的变量都是局部变量.一旦变量的生命周期结束该变量就被释放.   B:堆内存: 存储所有new出来的,及实体(对象),每一个实体 ...

  3. JAVA学习笔记-数组的三种初始化方式

      package Study; public class TestArray02 { public static void main(String[] args){//声明 int[] a; int ...

  4. Java菜鸟学习笔记--数组篇(三):二维数组

    定义 //1.二维数组的定义 //2.二维数组的内存空间 //3.不规则数组 package me.array; public class Array2Demo{ public static void ...

  5. Java学习笔记之---方法和数组

    Java学习笔记之---方法与数组 (一)方法 (1)什么是方法? 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 (2)方法的优点 使程序变得更简短而 ...

  6. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  7. 20145330第八周《Java学习笔记》

    20145330第八周<Java学习笔记> 第十五章 通用API 通用API 日志:日志对信息安全意义重大,审计.取证.入侵检验等都会用到日志信息 日志API Logger:注意无法使用构 ...

  8. Java学习笔记4

    Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...

  9. java学习笔记11--集合总结

    java学习笔记系列: java学习笔记10--泛型总结 java学习笔记9--内部类总结 java学习笔记8--接口总结 java学习笔记7--抽象类与抽象方法 java学习笔记6--类的继承.Ob ...

  10. java学习笔记8--接口总结

    接着前面的学习: java学习笔记7--抽象类与抽象方法 java学习笔记6--类的继承.Object类 java学习笔记5--类的方法 java学习笔记4--对象的初始化与回收 java学习笔记3- ...

随机推荐

  1. 孤荷凌寒自学python第二十三天python类的封装

    孤荷凌寒自学python第二十三天python类的封装 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.从怎么样访问类的内部代码块中定义的私有属性说起 类中定义的私有属性和私有方法是无法被 ...

  2. mac book pro 安装keras (无gpu)

    转自http://www.jianshu.com/p/01dc42595733 注:Macbook pro 13' 没有NVIDIA的显卡,没办法CUDA编程,所以下面都是CPU编程. 1. 安装ho ...

  3. fisheye在centos上的安装

    目录 描述 部署过程 安装及配置 破解 添加存贮库 在jira上配置 描述 Fisheye 一个源代码库深度查看软件,它可以挖掘源代码库中的有用信息,呈现在Web浏览器界面上. Crucible是一个 ...

  4. nginx的入门到框架设计

    mac上安装nginx 安装与启动 安装 brew install nginx 命令 通过 Homebrew 下载的软件默认位置在 /usr/local/Cellar 应该ln-s 加连接就能全局 n ...

  5. MPSVPX 配置

    MPSVPX 配置 设置主机名,IP地址,掩码,网关,DNS服务器,时区(使用WebGUI界面设置). bash-2.05b# cat svm.conf arp -d -a route flush i ...

  6. 【普通の惨败】GDOI2015卖萌记

    前记:这次可真的全程卖萌了.... Day 0 早早坐上前往广州的火车,然后转车到韶关 然后就到了偏远郊区的(准)四星酒店 周围连路灯都没有,极其僻静极其荒凉 大家都极其安静地回到自己房间复习 这一天 ...

  7. [HNOI2015][bzoj4011] 落叶枫音 [拓扑DP]

    题面 传送门 思路 首先有一个结论(应该是有比较大的利用价值的): 有向无环图的生成外向树树个数等于所有入度非0的点的入度乘积 然后这道题里面,唯一不合拍的因素就是这里有一条可能成环的边 我们可以把这 ...

  8. Codeforces Round #355 (Div. 2) C 预处理

    C. Vanya and Label time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  9. win2008服务器信任问题

    右键计算机,管理,在第一个页面里面有个安全信息,里面的右边有一个配置IE ESC ,点击他后会出现一个窗口,在那里面选择禁用即可!

  10. spring in action学习笔记十五:配置DispatcherServlet和ContextLoaderListener的几种方式。

    在spring in action中论述了:DispatcherServlet和ContextLoaderListener的关系,简言之就是DispatcherServlet是用于加载web层的组件的 ...