小白Java笔记——数组

一、数组类型

数组是编程语言常见的一种数据结构,可以储存多个数据,每个数组元素存放一个数据,通常通过数组元素的引索来访问数组元素。
(一)数组也是一种类型

  • 在一个数组中,数组元素的类型是唯一的,即一个数组只能存储一种数组类型的数据。
  • 通俗理解:类之间可以继承,比如一个水果数组,数组元素可以是苹果、梨,表面上是另一种类型,其实只是水果的特殊类型,他们继承了水果组,仍然是水果类型。
  • 数组初始化完成以后,数组在内存中所占的空间将被定下来,因此数组长度就不再改变,也不可被改变。也就是即使数组数据被清空,内存仍然在,长度仍然不变。
  • 数组也是一种数据类型,本身是一种引用类型。如int是一个基本类型,int[]就是一种引用类型了
    (二)数组的定义

  • 数组是一种引用类型,因此用它定义一个变量,仅仅表示定义了一个引用变量(也就是一个指针),这个引用变量未指向任何有效的内存,因此定义数组时不能指定数组的长度,也因此只有在初始化以后才能使用(没有内存)。

//两种方法:
type[] arrayName;
type arrayName[];
//第二种方法不推荐使用了

(三)数组的初始化

  • 上面也说过了,只能初始化,有了内存,才能使用;也就是为定义的数组分配内存空间。
  • 问题:不能只分配内存,不给初始值。因为内存的分配和初始值是挂钩的:只要为数组分配了内存空间,数组元素就有了初始值。初始值获得两种方式:1.系统自动分配2.程序员指定;也就是即使程序员没有给指定值,系统也自动分配,就是空内容,即null,这也是一种值。
  • 两种初始化方式:静态方式和动态方式

1.静态初始化(设定初始值)

int[] intArr;
intArr = new int[]{5,8,9};//只指定初始值,不指定长度
Object[] objArr;
objArr = new String[]{"java","疯狂讲义"};
Object[] objArr2;
objArr = new Object[]{"java","疯狂讲义"};
//上面String是Object的子类,即字符串是一种特殊的Object实例。这一部分是子类和父类的继承关系,以后祥讲
//实际开发中,习惯用另一种简便的方法初始化,如下:
int[] intArr = {5,8,9};

2.动态初始化(设定长度)

//种类一:数组的定义和初始化同时完成,使用动态初始化语法
int[] prices = new int[5];
//种类二:数组的定义和初始化同时完成,初始化数组时元素的类型,是定义数组时元素类型的子类
Object[] books = new String[4];
  • 执行动态初始化时,程序员只需指定数组的长度,即为每个数组元素指定所需的空间,系统将负责为这些数组元素分配初始值:
    数组元素的类型是时:
    1.整数类型(byte、short、int和long),则数组元素的值是0;
    2.浮点类型(float、double),则数组元素的值0.0;
    3.字符类型(char),数组元素的值‘\u0000’;
    4.布尔类型(boolean),数组元素的值是false;
    5.引用类型(类、接口和数组),数组元素的值是null.
    特别注意:不要同时使用静态初始化和动态初始化的方法,也就是不要同时给定数组的初始值和长度。
    再解释一下Object:

”Object[]“是定义了一个一维的对象,这个Object是任何对象的父类,也就是说可以转换成任何的类型。举例:

Object[] object = new Object[3] ;
object [0] = new String(“12312”);
object [2] = new Date();
解释:也就是说Object类型之后可以给任意类型的值或者对象赋值给当前的object 对象,而不需要强制类型转换,方便操作。

(四)使用数组
数组最常用的方法就是使用数组的值,包括对数组进行赋值和去除数组的值。

Object[] objArr1 = {"java","疯狂讲义"};
Object[] objArr2 = {"java","疯狂讲义"};
System.out.println(objArr1[1]);
objArr2[0] = {"Spring"};
System.out.println(objArr2[0]);

结果:

疯狂讲义
Spring

如果数组索引超出数组的长度:编译时不会出错,但是运行时会出错:

F:\JL\ch04>javac -d . ArrayTest.java

F:\JL\ch04>java ArrayTest
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
        at ArrayTest.main(ArrayTest.java:5)
  • 所有数组都有一个length属性,通过这个属性可以访问数组的长度。因此一旦获得数组的长度,就可以循环遍历该数组的每个数组元素。
Object[] books = new String[3];
  books[0] = "疯狂讲义";
  books[1] = "小白笔记皆出自此处";
  for(int i=0;i<books.length;i++)
{ 
   System.out.println(books[i]);
}

结果:

疯狂讲义
小白笔记皆出自此处
null
  • 从代码可以看出,初始化一个数组以后,就相当于初始化了多个相同类型的变量,通过数组的索引就可以自由访问这些变量。
  • 通俗理解:就相当于在宾馆里开好多个房间,只能等着入住一样。就算某个房间没有人住,但是房间已经存在。
    (五)foreach循环
    这个循环是Java 5之后才有的,可以遍历数组和集合,它的特点是不用获得数组的长度,无需根据索引来访问数组元素和集合元素。
Object[] books = new String[3];
  books[0] = "疯狂讲义";
  books[1] = "小白笔记皆出自此处";
  //注意是Object book而不是String book,因为books是Object类型的,不能转换成子类String,但是子类String可以自动转换成父类Object
  //从子类向父类的转换不需要什么限制,只需直接将子类实例赋值给父类变量即可,这也是Java中的多态的实现机制
  for(Object book : books)
 {
   System.out.println(book);
}
//并且其中Object book中book可以写其他的名字,只要不是books就可以,因为已经定义了

book相当于foreach循环里生成了一个临时变量,把数组元素的值依次赋给book并输出,再看一个例子,加深对book的理解:

 Object[] books = new Object[3];
  books[0] = "疯狂讲义";
 books[1] = "小白笔记皆出自此处";
  for(Object book : books)
   {
     book = "疯狂Java讲义";
     System.out.println(book);
   }
 System.out.println(books[0]);

结果:

疯狂Java讲义
疯狂Java讲义
疯狂Java讲义
疯狂讲义

如果在循环内给book赋值,就会覆盖数组的值。可以看到数组元素并没有改变,说明book是一个临时变量,并不影响数组。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值