上帝视角学JAVA8- 基础02 【2021-07-31】

1、程序流程

1.1 顺序

是个人都知道。

1.2 选择

  • if(布尔表达式){
       //如果布尔表达式为true将执行的语句
    }
  • if(布尔表达式){
       //如果布尔表达式的值为true
    }else{
       //如果布尔表达式的值为false
    }
  • if(布尔表达式 1){
       //如果布尔表达式 1的值为true执行代码
    }else if(布尔表达式 2){
       //如果布尔表达式 2的值为true执行代码
    }else if(布尔表达式 3){
       //如果布尔表达式 3的值为true执行代码
    }else {
       //如果以上布尔表达式都不为true执行代码
    }
  • switch(expression){
        case value :
           //语句
           break; //可选
        case value :
           //语句
           break; //可选
        //你可以有任意数量的case语句
        default : //可选  位置可变,没有匹配到才找它
           //语句
    }
    // switch 的表达式 ,只能是byte、short、char、int、枚举、String 这6种类型之一

1.3 循环

  • while( 布尔表达式 ) {
      //循环内容
    }
  • do {
           //代码语句
    }while(布尔表达式);
  • // 普通for循环
    for(初始化; 布尔表达式; 更新) {
        //代码语句
    }
  • // 增强for循环
    for(声明语句 : 表达式){
       //代码句子
    }

2、continue和break关键字

2.1 import

import 导包 例如:

import java.util.Scanner;

2.2 Scanner

  • Scanner 从键盘接收数据

Scanner scanner = new Scanner(System.in);
String next = scanner.next();

2.3 continue、break

continue 最近的循环内,跳过当前、继续下一次循环
break 跳出最近的循环 或 跳出 switch 中的 case
  • break、continue 带标签可指定循环 进行退出、跳过;用法给for循环前加上一个标签. 格式为 标签名:for(初始化; 布尔表达式; 更新) {}

  • 下面是2个例子;执行一下就知道了。

public static void main(String[] args) {
        // 打印101-150之间所有的质数
        outer: for (int i = 101; i < 150; i++) {
            for (int j = 2; j < i / 2; j++) {
                if (i % j == 0) {
                    continue outer;
                }
            }
            System.out.print(i + "/t");
        }
    }

public static void main(String[] args) {
        // 打印101-150之间所有的质数
        outer: for (int i = 101; i < 150; i++) {
            for (int j = 2; j < i / 2; j++) {
                if (i % j == 0) {
                    break outer;
                }
            }
            System.out.print(i + "/t");
        }
    }

3、数组【重要!!!】

  • 定义:

    多个相同类型的数据按照一定顺序排列的集合,并使用一个名字命名这个集合,这个名字就是数组名。这个集合内每一个元素按照顺序进行编号,即下标或者索引。可以通过数组名加上索引的方式找到具体的某个数据。

  • 数组是引用数据类型。而数组内的元素即可以是基本数据类型,也可以是引用数据类型,但是类型必须相同

  • 创建数组会在内存开辟连续的内存空间,数组名就是这个内存空间的首地址

  • 数组的长度一旦确定,就不能改变。

3.1一维数组:

  • 声明:如 int a[]; 也可以是int[] a; 就是这个[]位置可以放在类型后面,也可以放在变量名后面,一般放在类型后面。

  • java中声明数组时,不可以指定数组的长度,即元素的个数。如 int a[5]; 是 错误的。

  • 初始化:

    1、动态初始化: 声明且为元素分配空间 与 赋值操作分开进行。

    int[] arr = new int[3];
    arr[0] = 3;
    
    // 或者
    String names[];
    nemes = new String[3];
    names[0]= "洗个澡";

    2、静态初始化: 定义数组时就为数组元素分配空间并赋值

    int arr[] = new int[]{2,4,6};
    或者
    int[] arr = {2,4,6};
  • 每个数组都有一个属性 length 可以获取数组的长度。一旦数组初始化,长度就固定不变。

  • 数组元素的引用:

    需要new之后才可以使用数组

    使用 数组名[下标] 注意下标从0开始。而最大个数即长度会比最大下标大1

    所以for 循环 数组 中间的 控制表达式 一般都是 i<数组名.length  用小于号正好取不到最大长度。如果用 <= ,就是  i <= 数组名.length - 1

  • 数组是引用类型,它的每个元素相当于类的成员变量,因此数组一经分配空间,它的每个元素也被按照成员变量同样的方式进行隐式初始化。下图是各种类型的默认初始化值。

思考:数组是引用数组类型,是不是就是一个类呢?如果是一个类,看看源码是怎么实现的。

以下是知乎上面的一些回答!

ans:数组在Java里是一种特殊类型,有别于普通的“类的实例”的对象。Java里数组不是类,所以也没有对应的Class文件。数组类型是由JVM从元素类型合成出来的。从Java语言到Class文件,Java源码编译器会识别出对数组类型的length字段的访问,并生成对应的字节码。JVM里获取数组长度是用arraylength这个专用字节码指令。

JVM 中数组对象是一种特殊的对象,它的Object Header 比普通对象多了一个word 来存储数组的长度,length 会编译成对应的字节码读取这个field 就可以了。

再问:JVM内部是如何实现这个功能? 以HotSpot VM为例,答案是在数组对象的对象头里有一个length字段,记录数组长度。arraylength字节码的实现只要去读那个length字段即可。

还是云里雾里? 自己看看源码,思考一下,如果你是java设计者,如何实现这个数组需求?这个需求是生活实际中常见的,必须要实现的,是你,你会怎么做?

以上至少可以明确:1 引用数据类型不一定是类 ;2 数组一定有一个数组length,是有专门的指令实现的。

这个问题,待更新到 JVM 知识时,再来探讨一下!

【以上帝视角学习java 其实就是以JAVA设计者的思想,来思考为什么要这么设计!】

3.2 拓展-内存分区(简单版)

    首先 JAVA 是运行在JVM虚拟机里面的。而JVM虚拟机与 我们平时使用的 VirtualBoxvmware 安装的linux一样都是虚拟机。

     其实 JVM 就是运行在操作系统上帝一个普通的应用程序。与QQ、微信、Office的地位是一样的。只不过功能强大而已。

  • JAVA 的内存模型,指的是JVM虚拟机内的内存模型。是逻辑概念,而不是真正的物理内存进行分区。物理内存就是插在电脑上的条子,你又多少G,就是多少G,不存在物理分区。

  • 通过内存分区,可以思考,为什么 jvm 要把它所申请的内存空间,进行分区管理,为什么要分这么几个区域?

  • 电脑可以类别 1栋房子,JVM就是房子的某一层,或者某几层,看JVM申请内存大小。假设申请了1层空间,这1层空间,一般也会分为很多房间,做不同用途,这就是内存分区了,几乎不会有人拿一整层全部打通,混在一起。

  1. JVM内存的逻辑结构:栈(一般较小)、堆(大)、方法区(包括常量池、静态域)

  2. 栈:主要放置局部变量;堆当中一般存放new出的结构;

     对于数组来说,数组名是局部变量,放置在栈里面,而数组是new出来的,数组会在堆中开辟一段连续的空间,大小就是数组长度。在开辟空间的时候,其实这块内存就会全部初始化为0。

    那么,数组名和数组数据都不放在一起,他们之间是如何进行关联的?换句话说,数组名怎么找到他的数据在那?

我们程序员只知道数组名,因为这个名字是我们自己定义的,而开辟内存是JVM干的。

答案就是:

    堆中的数组内存所在位置的首地址会被保存到 栈空间数组名的位置。数组名就是栈中这快内存的名字,就像一个房间名字一样,501房间,房间里面还是可以放东西的。这个东西就是 堆中的数组空间的地址。

至此:我们可以明白,每一个字节【为什么是字节?】大小的内存至少有3个属性:{地址、名称、值 }

就像一个房间:它叫 502,它是xx省xx市xx区xx街道xx小区xx楼栋xx室, 然后这个房间住了 你这个大帅哥!

3.3 二维数组(多维数组)

    首先要明白一定,内存中都是一维排列的,存储方式决定了根本就没有多维数组。都是一维数组!

但是可以逻辑上划分为多维数组。

  • 二维数组 就是我们生活中的表格,有行有列。

  • 如果一个一维数组里面的每一个元素,保存的都是另1个一维数组的地址,那么,这就是一个二维数组了。这就是内存中的实现,而不是像表格一样 二维存储。

  • 初始化

    1、动态初始化

    int[][] arr = new int[3][2];
    // 默认初始化
    外层元素初始化为地址值,必须存地址啊
    内层元素初始化值与一维数组默认初始化情况一致!
    int[][] arr = new int[3][];
    // 默认初始化
    外层元素初始化null
    内层元素初始化值:没有初始化,不能调用!
     
    // 这种初始化是错误的:因为没有指定数组的长度。只是指定了每一个元素的长度,究竟有几个元素没有指定!!!
    int[][] arr = new int[][3];

    2、静态初始化

    int[][] arr = new int[][]{{1,2,3},{4,5,6},{7,8,9}}

    3、默认初始化值

  • 内存分析:

    没什么好分析的,本质还是一维数组,只不过原来数组元素的那一块内存放数组值,现在放的是 另一个数组的 首地址。

  • 书写形式注意:

    int[][] arr = new int[3][2];
    int[] arr[] = new int[3][2];
    int arr[][] = new int[3][2];
    这3种写法都是正确的,其他就不行了。
  • 使用情况

    在算法方面,数组用到的情况很多。比如动态规划经常会用一维数组、二维数组记录。

    所以要注意数组的初始化与遍历。遍历没什么讲的,for循环搞定。长度有length属性确定。

3.4 与数组有关的简单算法

包括数组的复制、反转、排序等。

这一部分内容移动到算法复习专栏讲解。

3.5 Arrays工具类

3.5.1 Arrays.equals() 方法 比较相等

有很多的重置方法。见上图。可以比较 int、byte、char、long、float、short、double、boolean 基本类型的2个数组是否相等。

3.5.2 Arrays.fill() 方法 填充

这个方法就是向数组中填充数据,一般用在数组初始化。有上面这么多的重置方法。看参数就大概能明白怎么用。

像前9个方法,第一个参数就是你要填充的 数组,第二个参数 就是你要填充的值。

3.5.3 Arrays.sort() 方法 排序

你看也有很多重写的方法。前7个对应的是基本类型的排序。

后面的方法等学习了后面的知识,点击源码看看你就懂了。

3.5.4 Arrays.binarySearch() 方法 二分查找法

同样,前提是 需要查找的数组必须是有序的。

对于前7个方法来说,第一个参数你要找的数组,第二个参数是你要找的关键字

3.5.5 其他方法

其他方法,在IDEA 里面 写 Arrays. ,然后进去看源码,找一找有没有你需要的方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值