目录
1.顺序结构
任何编程语言最常见的就是顺序结构,顺序结构就是从上到下一行一行执行,排在前面的代码先执行,中间没有跳转(没有循环条件控制)。
2.分支结构
Java中常见的分支结构有:if语句和switch语句。if是使用布尔表达式或者布尔值来作为控制分支的条件,而switch则是绝对多个同类型值进行匹配。
3.循环结构
循环结构是在满足循环条件时一直执行循环体,直到条件不满足为止。
- while循环
- do-while循环
while和do-while的区别是先判断再执行还是先执行再判断。while是先判断再执行,do-while是先执行在判断。
- for循环
- foreach循环:JDK1.5之后提供了这种循环方式,使用foreach循环无需获取数组和集合的长度,无需根据所有访问数组元素和集合元素。这种循环自动迭代数组的每个元素,当每个元素都被迭代一次之后,自动结束循环。例如下面代码:
String[] books={"十万个为什么","格林童话","安徒生童话"};
for (String book:books){
System.out.println(book);
}
- break和continue的区别:break是跳出循环结构,不再执行;而continue是不再执行此次循环的后面内容,进入下一次循环。还有一种结束循环的方式是使用return,这时候直接返回,不再执行该方法的任何内容。
4.数组类型
Java中数组的定义方式有两种:
int[] a;
int b[];
一般情况下我们支持使用第一种方式,不仅是因为这样的寓意更好,也是具有更好的语义。甚至在很多其他的语言例如C#已经不支持第二种定义方式了。
数组是一种引用类型的变量,因此在定义它的时候,仅仅是定义了一个应用变量(也就是说定义了一个指针),这个引用类型还没有指向任何变量,这个数组也不能被使用,只有初始化之后才能使用。
4.1数组初始化方式
数组的初始化方式有两种:
- 静态初始化:初始化时,由程序员显示地指定每个数组元素的值,这时候需要系统决定数组的长度。例如:
int[] a={1,2,3,4};
或者int[] a=new int[]{1,2,3,4};
,这里是定义加初始化。- 动态初始化:初始化时,由程序员指定数组长度,系统为数组分配数组元素。例如:
int[] a=new int[4];
4.1.1系统分配初始值规则
- 数组元素的类型是基本类型中的整型类型(byte、short、int、long):0。
- 数组元素的类型是基本类型中的浮点类型(float、double):0.0。
- 数组元素的类型是基本类型中的字符类型(char):’\u0000’。
- 数组元素的类型是基本类型中的布尔类型(boolean):false。
- 数组元素的类型是引用类型(接口、类、数组):null。
4.1.2能不能只分配内存空间,不赋初始值?
答:不能!一旦为数组的每个元素分配了内存空间,每个内存空间存储的内容就是数组元素的值,即使这个内存空间的内容是空的,那也是一个空值(null)。不过以哪种方式初始化数组,只有为数组分配了内存空间,就一定会有初始值。初始值的获取方式有两种:一种是程序员指定,一种是系统自动分配。
- 注意:不用静态初始化和动态初始化同时使用,也就是说不要在进行数组初始化时,既指定数组的长度,也为每个数组分配初始值。
4.2数组的使用
数组进行初始化之后就可以使用数组了,包括对数组进行访问、对数组元素进行赋值。访问数组元素都是通过在数组引用变量后紧跟一个[]
,方括号里面是数组元素的索引值,这样就可以访问数组了。访问到数组元素之后,可以把数组元素当成一个普通变量使用,包括对该变量赋值和取出,这个变量的类型就是定义数组时的类型。Java语言的数组索引是从0开始的。当索引下标小于0或者大于等于数组长度时,会出现ArrayIndexOutOfBoundsException(数组下标索引越界异常)。
我们在编写程序的时候不能保证自己写的代码一定是正确的,因此我们要学会调试程序,记住这些经常出现的异常对我们程序的调试有很大的帮助。
4.3内存中的数组
实际上数组元素被存储在堆(heap)内存中,而数组引用被存在栈(stack)内存中。
4.3.1为什么有堆内存和栈内存之分
当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法内定义的变量会逐个放入到这块栈内存中,随着方法执行结束,这个方法的内存栈也会被销毁。所以所有方法的变量都是在栈内存区的;当我们创建一个对象时,这个对象会保存在运行时的数据区中,这个数据区就是堆内存。堆内存的对象不会随方法的结束而销毁,即使这个方法结束了,这个对象还可能被其他方法的变量引用,只要这个对象还有变量引用它就不会别销毁。只有当这个对象没有任何一个引用变量引用时,系统的垃圾回收机制才会在合适的时候回收它。
4.3.2数组创建时内存分配情况
我们通过下面这段代码分析:
//1.定义一个数组
int[] array;
//2.初始化数组, 长度为3
array=new int[3];
//3.采用循环的方式为数组赋值
for (int i=0;i<array.length;i++){
array[i]=i+1;
}
1. 定义数组
首先会在栈内存中给这个数组分配一个空间
2. 初始化数组
在堆内存中创建长度为3的长度数组元素,系统自动为每个元素初始化为0
3.依次为数组元素赋值
显式指定数组元素的每个值。
二维数组内存分配图
上图是二维数组内存分配图,有人可能会想能不能将上面二维数组的数组元素再指向一个堆里面的变量变成三维数组呢?
答:不能!至少在这个二维数组中是不能的,因为Java语言是强类型的语言,当我们定义二维数组array时,已经确定了是int[]类型,而array[0]只能是int类型的。所以不能一个二维数组拓展成三维数组。
我们可以得出结论,一个二维数组是一维数组,其数组元素是一维数组;一个三维数组是一维数组,其数组元素是二维数组;一个四维数组是一维数组,其数组元素是三维数组…从这个角度看,Java没有多维数组,都可以看做是一维数组。