• 首页
  • 关于
    • Pg.lost photo

      Pg.lost

    • 更多
    • LinkedIn
    • Github
    • Weibo
  • 文章
    • 列表
    • 标签
  • 项目

Java编程的逻辑-编程基础

27 Jul 2018

Reading time ~1 minute

  • 1.1 数据类型和变量
  • 1.2 赋值
    • 1.2.1 基本类型
    • 1.2.2 数组类型
  • 1.3 基本运算
    • 1.3.1 算术运算
    • 1.3.2 比较运算
    • 1.3.3 逻辑运算
  • 1.4 条件执行
    • 1.4.1 语法和陷阱
    • 1.4.2 实现原理
  • 1.5 循环
    • 1.5.1 循环的4种形式
    • 1.5.2 循环控制
    • 1.5.3 实现原理
  • 1.6 函数的用法
    • 1.6.1 基本概念
    • 1.6.2 进一步理解函数
  • 1.7函数调用的基本原理
    • 1.7.1 栈的概念
    • 1.7.2 函数执行的基本原理
    • 1.7.3 数组和对象的内存分配
    • 1.7.4 递归调用的原理
    • 1.7.5 小结

1.1 数据类型和变量

基本数据类型:

  • 整数类型:byte/short/int/long
  • 小数类型:float/double
  • 字符类型:char
  • 真假类型:boolean

数组:表示固定长度的同种数据类型的多条记录,在内存中连续存放。

对象类型:组合

变量:给数据起的名字,方向访问不同的数据,值可以改变,但是含义不变。

1.2 赋值

1.2.1 基本类型

  1. 整数类型
    • byte、short、int、long分别占1、2、4、8字节
    • 在给long类型赋值时,如果常量超过了int的表示范围,需要在常量后面加L。
  2. 小数类型

    • double、float分别占4字节和8字节
  3. 真假类型

  4. 字符类型
  • char占用两个字节

1.2.2 数组类型

  • 基本类型的数组有三种赋值形式
	int[] arr = {1, 2, 3};
	int[] arr = new int[]{1, 2, 3};
	int[] arr = new int[3];
	arr[0] = 1; arr[1] = 2; arr[2] = 3;
  • 数组变量存储的是数组内存的地址
  • 数组的长度可以动态确定
	int length = ...;
	int[] arr = new int[length];
  • 数组的长度确定了之后就不可再改变
  • 不可变指的是数组的内存空间,一经分配,长度就不可改变
  • 但是可以让数组变量指向一个不同长度的空间

1.3 基本运算

  • 算术运算
  • 比较运算
  • 逻辑运算

1.3.1 算术运算

+、-、*、/、%、++、–

  1. 加减乘除注意事项
  • 注意结果的范围,使用恰当的数据类型。
  • 整数相除直接舍去小数位
  1. 小数计算结果不精确
  2. 自增/自减

1.3.2 比较运算

>、>=、<、<=、==

  • 数组变量的比较,比较的不是数组的内容,而是数组的内存地址

1.3.3 逻辑运算

& | ! ^ && ||

  • &、 和 &&、   的区别
	boolean a = true;
	int b = 0;
	boolean flag = a | b++>0;

b = 1。虽然已知a为true,b++还是会去计算

	boolean a = true;
	int b = 0;
	boolean flag = a || b++>0;

b = 0。已知a为true之后,会忽略后半部分的计算

1.4 条件执行

1.4.1 语法和陷阱

  • if/else
  • if/else if/else
  • 三元运算符:条件赋值
	int max = x > y ? x : y;		
  • switch:表达式的值不同执行不同的分支

1.4.2 实现原理

指令跳转:条件跳转、无条件跳转、跳转表

跳转表为什么更高效?

  • 条件值必须为整数
  • 可以使用二分查找
  • 如果条件值连续的话,还可以优化成一个数组

1.5 循环

1.5.1 循环的4种形式

  1. while
  2. do/while
  3. for
  4. foreach

1.5.2 循环控制

  1. break
  2. continue

1.5.3 实现原理

条件跳转+无条件跳转

1.6 函数的用法

1.6.1 基本概念

  • 减少重复代码:重复执行的代码,可以定义函数,在需要的地方调用
  • 分解复杂的操作:复杂的操作,可以将操作分为多个函数

1.6.2 进一步理解函数

  1. 参数传递:可变长度参数
    • 在函数内,可以看做是数组。
    • 必须是参数列表的最后一个
    • 一个函数只能有一个可变长度参数
         public static int max(int min, int ...a) {
             int max = min;
             for(int i = 0; i < a.length; i++) {
                 if(max < a[i]) {
                     max = a[i];
                 }
             }
             return max;
         }
    
  2. 返回
    • 一个函数只能有一个返回值
  3. 重载
  4. 调用匹配
  5. 递归函数

1.7函数调用的基本原理

1.7.1 栈的概念

程序执行的基本原理:CPU有一个指令器,指向下一条要执行的指令,要么顺序执行,要么进行跳转。

函数的调用可以看做是一个无条件跳转,跳转到对应函数的指令处开始执行,碰到return语句或者函数结尾时,再执行一次无条件跳转,跳转回调用方,执行调用函数后的下一条指令。

计算机系统主要使用栈来存放函数调用过程中需要的数据,包括参数、返回地址以及函数内定义的局部变量。

1.7.2 函数执行的基本原理

1.7.3 数组和对象的内存分配

对于数组和对象类型,一般有两块内存,一块存放实际的内容,一块存放实际内容的地址。

  • 存储实际内容的空间分配在堆上
  • 存储地址的空间分配在栈上

1.7.4 递归调用的原理

递归调用执行的过程中,每调用一次,就会有一次入栈,生成一份不同的参数、局部变量和返回地址。

1.7.5 小结

  • 函数调用主要是通过栈来存储相关的数据,系统就函数的调用者和函数如何使用栈做了约定,返回值可以简单的认为是通过一个专门的返回值存储器存储的。

  • 函数的调用是有成本的



Java编程的逻辑编程基础 Share Tweet +1