Java笔记01 - 快速入门

程序基础

基本结构

public class Hello {
    public static void main(String[] args) { // 方法名是main
        // 方法代码...
    } // 方法定义结束
}
  • class 类名关键字
  • public 访问修饰符, 表示公开; 修饰类, 也修饰方法
  • 返回值void, 表示没有任何返回值
  • static, 修饰符, 表示静态方法
  • 括号内的参数, 表示必须是Sting数组

变量

  • 变量可以重新赋值

基本数据类型

  • 整数类型: byte(1), short(2), int(4), long(8)
  • 浮点数类型: float(4), double(8)
  • 字符类型: char(2)
  • 布尔类型: boolean(1)
  • 计算机知识: 最小存储单位字节: 一个字节8个bit(二进制), 换成十进制就是(0 ~ 255)

整型

  • java只定义了带符号的整型
  • 最高位bit表示正负

浮点型

  • 浮点型表示小数
  • 对于float型, 需要加上f后缀

布尔型

  • true 和 false
  • 理论上1bit, JVM通常存为4bit

字符型

  • char, 使用'号, 仅有一个字符

常量

  • 使用final进行修饰, 不可修改

变量作用范围

  • {}作为自身范围
  • 访问本作用域以内的变量

整数运算

  • 整数永远是精确的, 计算结果页永远是精确的
  • 整数计算结果超过范围会溢出, 溢出不会报错, 一个错误的结果
  • 如果参与运算双方类型不一致, 计算结果为较大类型的整型
int i = 12345;
short s = (short) i; // 12345
  • i 强制转换为short 类型. (强制转换的结果可能是错的)

浮点数运算

  • 浮点数的计算存在误差
  • 浮点数在内存中的表示很复杂
  • 整数和浮点数计算, 整数提升为浮点数
  • 解决办法: "整数和小数部分分开计算"

布尔运算

  • 依旧支持短路运算
  • 支持三元运算

字符类型和字符串类型

  • 字符类型char是基本数据类型, 占用两个字符. 单引号表示
  • 字符串类型String是引用类型, 双引号表示
  • 无法表示的时候, 使用\进行转义.
  • 编译器允许使用+链接任何字符串和其他类型
  • 使用""...""表示多行字符串
  • 字符串不可变, 改变不了本质, 只能改变指针指向的内存
  • 引用类型的变量可以指向一个空null

数组类型

  • 定义使用类型[], 初始化new int[5]必须确定需要包含的数量
  • 所有元素初始化后的默认值, 整型是0, 浮点型为0.0, 布尔型为false
  • 数组一旦创建后, 大小不可改变
  • 访问数组, 使用索引. 索引超过范围, 将会报错
public static void main(String[] args) {
    int[] ns = new int[] {1, 2, 3, 4, 5, 6};
    System.out.println(ns[5]);
}
  • 快速创建数组, 并推断数组长度
int[] ns = new int[] {1, 2, 3, 4, 5, 6};
ns = new int[] {1, 2, 4};
  • 原数组没有改变, 只是改变可指针的引用

流程控制

输出

  • 格式化输出printf(), 通过使用占位符%?, 可以格式化后面的参数为指定格式
  • %%表示%本身
  • 两个%占位符, 必须传入两个参数

输入

  • System.in代表标准输入流
  • 可以使用java提供的scanner来方便输入

if判断

  • 注意if的判断顺序与边界问题
  • 浮点数使用==并不靠谱
  • 引用类型的==用来判断是否指向同一个对象
String s1 = "hello";
String s2 = "HELLO".toLowerCase();
System.out.println(s1.equals(s2));
  • 使用equals()判断值是否相等
  • 避免NullPointerException错误, 可以使用短路运算&&

switch多重选择

  • 漏写break会导致意想不到的结果
  • 字符串匹配时, 是比较的内容相等
  • 不要忘记default, 不要忘记break
public static void main(String[] args) {
  String fruit = "mango";
  switch (fruit) {
  case "apple" -> System.out.print("apple");
  case "pear" -> System.out.print("pear");
  case "mango" -> {
    System.out.print("aaa");
    System.out.print("bbbb");
  }
  default -> System.out.print("No fruit");
  }
}
  • 新语法, java12支持->运算符
public static void main(String[] args) {
  String fruit = "apple";
  int opt = switch (fruit) {
    case "apple" -> 1;
    case "pear" -> 2;
    default -> {
      int code = fruit.hashCode();
      yield code;
    }
  };
  System.out.print(opt);
}
  • 使用yield返回简单值

while和do while

  • 避免死循环
  • do while会少运算一次

for循环

  • 不要在执行内部操作游标
  int[] ns = {2, 199, 32, 4123};
  for (int n : ns) {
      System.out.println(n);
  }
  • 使用for each可以遍历可迭代的数据类型. 例如List, Map

break和continue

  • 在循环过程中, 使用break跳出循环
  • break只跳出自己的这层循环
  • continue提前结束本次循环, 继续执行下次循环

数组操作

遍历数组

  • 直接打印地址, 打印的是在JVM中的引用地址
  • Arrays.toString(ns)可以打印出数组

数组排序

  • Arrays.sort(ns)可以进行排序
  • 对数组排序改变的是数组本身
  • 其实原来内存中的值并未改变, 但是数组索引每个值的指向改变了

多维数组

  • 使用deepToString()进行打印

命令行参数

  • main函数的执行可以获取命令行参数
posted @ 2020-02-03 20:14  张润昊  阅读(170)  评论(0编辑  收藏  举报