从头学习JAVA(四)

流程控制与数组

顺序结构:程序从上到下一次执行,排在前面的代码先执行,排在后面的代码后执行。

分支结构: if else、 switch

switch语句后面的控制表达式的数据类型只能是byte、short、char、int四个整数类型和枚举类型,String类型,不能是bollean类型。

循环语句: while、do while、for

//while 先判断条件再执行循环
int i = 0;
while(i < 10) 
{
i++:
//判断条件为true执行循环
}

//do while 先执行再判断条件
int i = 0do
{
i++;
//while后面必须跟一个逗号( ,)
} while(i < 10);

//for  先计算判断再循环,为false时退出。
for (int i = 0;i < 10; i++) 
{
i++;
}

//for 允许多个初始化语句,循环条件也可以是一个包含逻辑运算符的表达式
for (int a = 0, b = 0 ,c = 0; a < 10 && b < 10 && c < 10; c++) {
            a++;
            b++;
        }

//continue跳出当次循环,继续下一次循环.
//break 跳出整个循环.
//另 break在switch语句中跳出switch的选择语句.

break是结束break所在的循环,如果break后紧跟着一个标签,这个标签用于标识一个外层循环。JAVA中的标签就是一个紧跟着英文冒号( :)的标识符,如outer,putxx,outxx2r随意英文数字组合。

//当break起作用时,就会结束outer标识的外层循环
        outer :
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                System.out.println("i = "+i+" j = "+j);
                if (j == 1) {
                    break outer;
                }

            }
        }
        //打印的结果是:
        //i = 0 j = 0
        //i = 0 j = 1

continue是结束本次循环,继续从下次循环开始。而break是完成终极循环本身。
cotinue也可以紧跟一个标识符,跟break用法一致,作用时结束外层循环的本次循环,继续下次循环。

        outexxx2r :
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                System.out.println("i = "+i+" j = "+j);
                if (j == 1) {
                    continue outexxx2r;
                }

            }
        }
        //打印的结果是 :
        //i = 0 j = 0
        //i = 0 j = 1
        //i = 1 j = 0
        //i = 1 j = 1
        //i = 2 j = 0
        //i = 2 j = 1

return是结束一个方法。当return放到循环内,return会结束方法,循环自然也随之结束了。


数组类型
JAVA的数组要求所有的数组元素具有相同的数据类型。因此,在一个数组中,数组元素的类型是唯一的,即一个数组里面只能存储一种数据类型的数据,而不能存储多种数据类型的数据。

一旦数组的初始化完成,数组在内存中所占的空间将会被固定下来,因此数组的长度将不可改变,即使把某个数组元素的数据清空,但它所占的空间依然会被保留,依然属于该数组,数组的长度依然不变

数组也是一种数据类型,它本身是一种引用类型

JAVA支持两种方法定义数组:
1.type[] arrayName;
2.type arrayName[];

推荐使用第一种方法,因为第一种格式拥有更好的语意,而且有更好的可读性。对于type[] arrayName 可以理解成类型是 type[] ,变量名是 arrayName;而第二种就做不到。

JAVA语言中数组必须先初始化,然后才可以使用。初始化实际时就是为数组的数组元素分配内存空间,并为每个数组元素赋值

数组的初始化有两种方式:
1.静态初始化:初始化时由程序员显示指定每个数组元素的初始值,由系统决定数组长度。
格式:type[] arrayName = new type[]{element1,element2,element3,…}
2.动态初始化:初始化时程序员只指定数组的长度,由系统为数组元素分配初始值。
格式:type[] arrayName = new type[length];

静态初始化和动态初始化不能同时使用!

使用数组时,如果下标小于0或者大于数组长度,编译程序不会出现任何错误,但运行时会出现异常:java.lang.ArrayIndexOutBoundException:N(数组索引越界异常)。

更简单的循环foreach:

//使用foreach无需获得数组的长度,通常使用foreach不要对数组赋值,虽然在语法上允许,但是没有实际意义。
for (type variableName : array | collection) {
  //variableName 自动迭代访问每个元素
}

深入数组
数组时一种引用数据类型,数组引用变量只是一个引用,数组元素和数组变量在内存里时分开存放的。
数组引用变量只是一个引用,这个引用变量时可以指向任何有效的内存,只有当该引用指向有效内存后,才可通过该数组变量来访问数组元素。

栈(stack)内存和堆(heap)内存区别:
当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法里定义的变量将会逐个放入这块栈内存里,随着方法的执行结束,这个方法的内存栈也会自然销毁。因此,所有在方法里定义的局部变量都是放在栈内存中的;当我们在程序中创建一个对象,这个对象将被保存到运行时数据区中,以便反复利用(因为创建的成本通常比较大),这个运行时数据区就是堆内存。堆内存中的对象不会随方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量所引用(在方法的传递时很常见),则这个对象依然不会被销毁。只有当一个对象没有任何引用变量引用它时,系统的垃圾回收器才会在合适的时候回收它。

数组变量是引用真实的内存区:

        int[] a = {1,3,4};
        int[] b = new int[4];

        System.out.println(b.length);
        b = a;
        System.out.println(b.length);
//打印的结果是
//4
//3

按理来说数组的长度不可以变的,但是为什么在a赋值给b后,b的长度会变呢?原因是因为b只是一个引用,真实在的数组对象是不变的。

这里写图片描述

在执行了b = a后,原来的数组对象失去引用,这样的话原来的数组对象会变成垃圾,只有等待垃圾回收机制来回收它。—但它的长度依然是不变的,直到它彻底消失。

二维数组:

int[][] a ;
a = new int[4][];
a[0] = new int[2];
a[0][1] = 6;

内存的样子是:
这里写图片描述

操作数据的工具类:Arrays:
常用方法:void sort(type[] a) ;对数组a的元素进行排序,从小到大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值