当当买的新书今天到了,叫《疯狂Java突破程序员基本功的16课》。我记得罗永浩好像说过什么打着几天速成/疯狂/轻松之类旗号的都不靠谱,其实我也是抱着不靠谱的心态买的这书。但是今天到手后看来……还是那个事,比较适合我这种基本功薄弱的菜鸟。虽说我做了快3年的Java,但是说实话我根本就没有学过Java,现在用的所有开发技巧都是早年学C语言时学的(现在C语言压根就不会了。。。)。所以这本书比较补内功心法,推荐跟我一样Java入门的菜鸟看看。
Java的数组跟对象类似,属于引用类型的变量。
Java语言是典型的静态语言,因此Java的数组是静态的,即当数组被初始化后该数组的长度不可改变。
初始化数组的方式有两种:静态初始化/动态初始化。
静态初始化:
String[] books = new String[]{
"a",
"b"
}
String[] names = {
"c",
"d"
}
动态初始化:
String[] strArr = new String[5];
OK,Java数组就讲到这里,下面讲讲数组的内存分配。
再讲内存分配之前先介绍四个关键字:
栈内存、堆内存、变量、对象
这里最关键的就是变量与对象的区别,我们看一个例子:People p = new People();这里红色的就是变量,而蓝色的就是对象。
下面我们来分析一下基本类型数组的初始化过程:
int [] iArr;
iArr = new int[]{2, 5};
1.在main栈内存申请iArr空间;
2.在堆内存中申请int型2和5的连续空间;
3.将连续空间的地址值赋给栈内存中的iArr。
下面我们再来分析一下引用类型数组的初始化过程:
Person[] students;
students = new Person[2];
Person p1 = new Person();
Person P2 = new Person();
students[0] = p1;
students[1] = p2;
1.在main栈内存申请students空间;
2.在堆内存中申请2个连续空间;
3.在main栈内存中申请p1空间;
4.在堆内存中申请p1对象空间,并把地址值给栈内存中的p1;
5.在main栈内存中申请p2空间;
6.在堆内存中申请p2对象空间,并把地址值给栈内存中的p2;
7.将p1对象的地址值给堆内存中的students[0];
8.将p2对象的地址值给堆内存中的students[1]。
===============================================================================================
有些书籍这样描述:
基本类型变量的值存储在栈内存中。(这句话是错误的,例子中基本数据类型的值2、5都是存放在堆内存里的)
正确的描述应为:
所有局部变量都是放在栈内存里保存的,不管其是基本数据类型变量还是引用类型的变量,都是存储在各自的方法栈区域中;但引用类型变量所引用的对象(包括数组、普通Java对象)则总是存储在堆内存中。
请看下面这个例子:
int k = 5;//k在栈内存中,存储的值是5,也就说5在栈内存中
People p = new People();//p在栈内存中,存储的值是new People()的地址值,new People()在堆内存中
int[] s = {5};//s在栈内存中,存储的值是{5}的地址值,{5}在堆内存中,也就说5在堆内存中。
这里还引出了一个概念就是:
数组元素就是变量 |
int n;
n与iArr[x]都是变量。
本节的重点:
1.Java数组的基本语法;
2.数组的静态特性;
3.数组的内存分配机制;
4.初始化Java数组的两种方式;
5.数组引用变量和数组对象;
6.数组元素等同于变量。