假如我们需要用到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. Restful API实战

    简介:随着移动互联网的发展,客户端层出不穷,app,web,微信端等等,而后端业务逻辑基于是一致的,如何做到业务逻辑“一次编写,随时接入”?答案是通过远程调用API,而目前比较火的方案是“Restfu ...

  2. (转\整)UE4游戏优化 多人大地型游戏的优化(一)游戏线程的优化

    施主分享随缘,评论随心,@author:白袍小道 小道暗语: 1.因为小道这里博客目录没自己整,暂时就用随笔目录结构,所以二级目录那啥就忽略了.标题格式大致都是(原or转) 二级目录 (标题) 2.因 ...

  3. 【志银】Dev-Cpp配置OpenGL图形库(成功版本:Dev-Cpp 5.7.1 MinGW 4.8.1)

    ★配置前须知:Dev-Cpp自带OpenGL的使用和OpenGL简介 (附Dev-Cpp下载地址:http://sourceforge.net/projects/orwelldevcpp/?sourc ...

  4. pytorch下对简单的数据进行分类(classification)

    看了Movan大佬的文字教程让我对pytorch的基本使用有了一定的了解,下面简单介绍一下二分类用pytorch的基本实现! 希望详细的注释能够对像我一样刚入门的新手来说有点帮助! import to ...

  5. awk学习笔记

    1. 数据格式 id1,n1 id2,n2 ... 要对每个id进行一个n的加和 cat file1 | awk -F"," '{if(n[$1]>0){n[$1]=n[$1 ...

  6. SQL 唯一标识 写法

    创建唯一标识的方法~16位唯一标识 SELECT LTRIM(STR(CONVERT(varchar(100), GETDATE(), 112)))+right(cast(power(10,6) as ...

  7. 【bzoj3144】[Hnoi2013]切糕 网络流最小割

    题目描述 输入 第一行是三个正整数P,Q,R,表示切糕的长P. 宽Q.高R.第二行有一个非负整数D,表示光滑性要求.接下来是R个P行Q列的矩阵,第z个 矩阵的第x行第y列是v(x,y,z) (1≤x≤ ...

  8. 【bzoj3809/bzoj3236】Gty的二逼妹子序列/[Ahoi2013]作业 莫队算法+分块

    原文地址:http://www.cnblogs.com/GXZlegend/p/6805252.html bzoj3809 题目描述 Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了 ...

  9. [BZOJ3600] 没有人的算术 [重量平衡树+权值线段树]

    题面 传送门 思路 这道题目是陈立杰论文<重量平衡树和后缀平衡树在信息学奥赛中的应用 >中关于重量平衡树维护序列排名算法的一个应用 具体方法为:令根节点保存一个实数区间$[0,1]$ 若当 ...

  10. RocketMQ 源码分析 RouteInfoManager(四)

    在上一章分析了NamesrvController的构造函数时,会生成一个RouteInfoManager对象,该对象存放着整个消息集群的相关消息,所以这里单独拿出来分析.其实试想一下namesrv的功 ...