JavaSE第三十二讲:Java数组内存地址解析
来源:互联网 发布:网红淘宝店前十名2016 编辑:程序博客网 时间:2024/05/16 11:07
1. 数组,Java中的数组与C语言的数组不一样,所以这方面要认真对待。
2. 数组(Array):相同类型数据的集合就叫做数组。
【注意】:数组里面存放的一定的相同数据类型的,它是相同类型数据的集合。
3. 如何定义数组。
public class ArrayTest{public static void main(String[] args){int[] a;}}【说明】:表示定义一个数组a,数组类型为int型,所以数组a里面定义的元素都必须是整型
定义数组及数组长度
public class ArrayTest{public static void main(String[] args){int[] a = new int[4];}}【说明】:从int[] a = new int[4];这边可以看出,new一个数组,所以数组也是一个对象,这和C语言是不一样的,C里面没有对象的概念。
如下所示:
type[] 变量名 = new type[数组中元素的个数];
可以按照下列方式定义长度为10的数组:
int[] a = new int[10];
或者 int a[] = new int[10];
public class ArrayTest{public static void main(String[] args){//第一种定义数组的方式/*int[] a = new int[4];a[0] = 1;a[1] = 2;a[2] = 3;a[3] = 4;System.out.println(a[3]);*/int a[] = new int[2];a[0] = 1;a[1] = 2;System.out.println(a[1]);}}编译执行结果:
D:\src>java ArrayTest
2
【说明】:这是定义数组的两种方式,这里要说明以下,Java中定义数组的方式推荐用第一种 “int[] a” 表示a是一个int类型的数组。int[] a = new int[4]; //注意千万此处不能这样写:int[4] a = new int[4];int[] a 只是为了定义数组类型,具体数组长度应该在new的时候写,new一个数组的时候要开辟内存空间,在此处给数组定义长度。
4. 数组中的元素索引是从0开始的。对于数组来说,最大的索引==数组的长度 – 1。
另外一种定义数组的方式
int[] a = {1, 2, 3, 4};System.out.println(a[2]);int[] b = new int[]{1, 2, 3, 4}; //注意此处不能这样写:int[] b = new int[4]{1, 2, 3, 4};System.out.println(b[3]);
编译执行结果:D:\src>java ArrayTest
3
4
【说明】:int[] b = new int[]{1, 2, 3, 4}; //注意此处不能这样写:int[] b = new int[4]{1, 2, 3, 4};定义数组长度此时由后面来决定。
5. 定义数组的第3种方式:
type[] 变量名 = {new type[]}{逗号分隔的初始化值列表};
*.黑色大括号里面表示可以省略
6. Java 中的每个数组都有一个名为length的属性,表示数组的长度。length属性是public, final,int的。数组长度一旦确定,就不能改变大小。
打印出长度为100的数组里面的值
int[] a = new int[100];for(int i = 0; i < a.length; i++){a[i] = i + 1;}for(int j = 0; j < a.length; j++){System.out.println(a[j]);}编译执行结果为输出1到100的值注意若此处for循环里面 for(int i = 0; i <= a.length; i++){
a[i] = i + 1;
}【说明】:则程序发生越界异常,因为当i = a.length时候,即100时候,数组长度变为101越界,所以出现错误
D:\src>java ArrayTest
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 100
at ArrayTest.main(ArrayTest.java:31)
int[] a = new int[100];for(int i = 0; i < a.length; i++){a[i] = i + 1;}for(int j = 0; j < a.length; j++){System.out.println(a[j]);}a.length = 200;编译执行结果:
D:\src>javac ArrayTest.java
ArrayTest.java:37: 错误: 无法为最终变量length分配值
a.length = 200;
^
1 个错误【说明】:length属性是public, final,int的。数组长度一旦确定,就不能改变大小。 而且length赋值肯定不是在声明的时候给赋的,一定是在构造方法中给其赋值的,因为在new数组对象的时候才能确定数组长度是多少。
int[] a = new int[4];System.out.println(a[3]);boolean[] b = new boolean[3];System.out.println(b[2]);编译执行结果:D:\src>java ArrayTest
0
false【说明】:定义数组时没给数组赋值,则默认int类型是0,boolean类型是false。
数组元素在内存中的存放是连续的
int[] a = {1, 2, 3};int[] b = {1, 2, 3};System.out.println(a.equals(b));编译执行结果:D:\src>java ArrayTest
false【说明】:调用equals()方法,此时方法是继承了Object类的方法,而且没有被重写,a和b分别是指向不同的数组对象地址,所以输出结果为false。从这边可以明确,对于数组内容的比较千万不能使用equals方法。【这地方很多人放错】
7. int[] a = new int[10],其中a是一个引用,它指向了生成的数组对象的首地址,数组中每个元素都是int类型,其中仅存放数据值本身。如图32-1所示。
图32-1
定义一个引用类型的数组:
Person[] p = new Person[3];写法与定义一个int类型的数组类似。
Person[] p = new Person[3];System.out.println(p[0]);编译执行结果输出为null。
【说明】:此时定义的是一个引用类型的数组,注意在这边没有生成Person类型的对象,一个都没有生成,只是生成了一个Person类型数组的对象,这个数组里面存放的不是对象本身,而是存放对象的引用,这里存放三个Person类型的引用。这个是容易搞混掉的,都没有调用构造函数呢哈哈~,如果生成一个Person类型对象,这个对象是存放在堆当中的,是不能移动的,所以不可能被取出来放到数组里面,这边可以这样理解。注意:除了原生类型之外,引用类型如果没有赋其初值,则其内容为null,null表示不指向任何对象。
public class ArrayTest2{public static void main(String[] args) {Person[] p = new Person[3];p[0] = new Person(10);p[1] = new Person(20);p[2] = new Person(30);for(int i = 0; i < p.length; i++){System.out.println(p[i].age);}}}class Person{int age;public Person(int age){this.age = age;}}编译执行结果:
D:\src>java ArrayTest2
10
20
30
继续修改添加一段代码:
public class ArrayTest2{public static void main(String[] args) {Person[] p = new Person[3];p[0] = new Person(10);p[1] = new Person(20);p[2] = new Person(30);for(int i = 0; i < p.length; i++){System.out.println(p[i].age);}Person[] p2 = new Person[5];for(int j = 0; j < p2.length; j++)System.out.println(p2[j]);}}class Person{int age;public Person(int age){this.age = age;}}
编译执行结果:
D:\src>java ArrayTest2
10
20
30
null
null
null
null
null
【未知】:如果将以上程序17行代码改为:System.out.println(p2[j].age);程序执行抛空指针异常了??
D:\src>java ArrayTest2
10
20
30
Exception in thread "main" java.lang.NullPointerException
at ArrayTest2.main(ArrayTest2.java:17)
- JavaSE第三十二讲:Java数组内存地址解析
- JavaSE第三十一讲:Java数组剖析
- #笔记#圣思园 JavaSE 第31讲——包装类、数组、数组内存地址
- JavaSE第三十四讲:Arrays类解析及数组疑难剖析
- JavaSE第三十六讲:Java数组查找方式及二分查找分析
- Java基础:第三十二讲 静态成员
- JAVASE课程 第一章 第三讲程序控制与数组
- JavaSE第九十二讲:数据流深入详解
- JAVASE课程 第一章 第四讲方法,数组,java新特性
- Java内存回收机制(第三讲)
- 第三十二讲|输出小星星
- JavaSE基础第三部分:Java数组和算法之数组
- JavaSE基础第三部分:Java数组和算法之算法
- JavaSE第三十八讲:IDE详细介绍
- JavaSE第三十九讲:深入详解ArrayList
- 第三讲 配置文件解析
- 第三十二讲项目 输出小星星
- JavaSE第三十三讲:Java数组常见问题深度解析
- live555库
- 大数 开方 GMP mpz_sqrt
- 【STL】vector常用函数的例子
- Android 电话的反射调用机制实现自动接听电话
- ZOJ 2112
- JavaSE第三十二讲:Java数组内存地址解析
- mysql备份
- 双线性插值图像放大/缩小算法
- spring读写分离 未测试
- 友善SD卡烧写工具(SD-Flasher)替代解决方案
- 回首过去的那些事儿(5)
- vc通过ADO连接sql server 2000的核心代码
- 计算机视觉相关资源链接( 由xuyuhua1985原创)
- 发放2012年11月迅雷vip账号了~!