Java概述

  • JDK: Java Development Kit 的英文缩写,中文翻译:Java开发工具包。是Java开发的核心,包括了Java运行环境 jre,很多的Java工具,以及一些Java基础类库。
  • JRE: Java Runtime Environment 的英文缩写,中文翻译:Java运行环境。是运行基于Java语言编写的程序所不可缺少的运行环境。
  • JVM:Java Virtual Machine 的英文缩写,中文翻译:Java虚拟机。是Java实现跨平台的最核心部分。所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行。由虚拟机将程序解释给本地系统执行。

注释

  • //:单行注释
  • /* */:多行注释
  • /** */:文档注释

!> 多行注释不能嵌套

变量和常量

1.声明变量

  • 声明变量时需要先声明类型,然后就是变量名
  • 变量名必须由字母开头和其他数字或字母构成,变量名长度没有限制
  • 不能使用Java保留字作为变量名,Java9中单下划线_不能作为变量名

2.变量初始化

  • 变量需要用=进行赋值
  • 变量的声明尽可能靠近变量第一次使用的地方
  • Java10开始,局部变量会根据初始值来判断其类型

3.常量

  • 在变量的前面添加final关键字表示是一个常量
  • 被关键字final修饰后的常量初始化后将不能更改
  • 如果常量需要在多个类中共享可以用static关键字修饰
  • 习惯上常量名全部使用大写字母

输入与输出

1.读取输入

  • 构建扫描器(Scanner)与System.in关联
  1. Scanner sc = new Scanner(System.in);
  • 读取控制台输入数据
  1. // 读取一行数据
  2. String s = sc.nextLine();
  3. // 读取一个字符串
  4. String next = sc.next();
  5. // 读取一个数字
  6. int i = sc.nextInt();
  7. // 判断是否输入字符串
  8. boolean b1 = sc.hasNext();
  9. // 判断是否输入数字
  10. boolean b2 = sc.hasNextInt();

2.格式化输出

  1. // 输入x
  2. System.out.print(x);
  3. // 补全8个字符,保留2位小数
  4. System.out.printf("%8.2f", x);
  5. // 多个参数(printf转换符)
  6. System.out.printf("Hello, %s. Next year, you'll be %d", "hzlim", 159);
  7. // 用,分割数值(printf标志)
  8. System.out.printf("%,.2f", x);
  9. // 格式化时间,以t开始(printf日期和时间转换符)
  10. System.out.printf("%tc", new Date());

基本数据类型

1.整型

  • 用于表示没有小数的数值,允许负数。有4种数据类型 | 类型 | 存储需求 | 取值范围 | | —- | —- | —- | | int | 4字节 | -2147483648 ~ 2147483647; -2^31 ~ 2^31-1 | | short | 2字节 | -32768 ~ 32767; -2^15 ~ 2^15-1 | | long | 8字节 | -9233372036854775808 ~ 9233372036854775807; -2^63 ~ 2^63-1 | | byte | 1字节 | -128 ~ 127; -2^7 ~ 2^7-1 |
  • 长整型(long)数值有一个后缀L或l
  • 数值可以用进制表示:十六进制加前缀0x或0X、八进制加前缀0、二进制加前缀0b或0B
  • 数值可以加_1_000_000表示100万,加下划线只是为了更容易读

10进制转2进制:除二取余法或拆分法

负10进制转2进制:按位取反最后加1

2.浮点型

  • 浮点型用于表示有小数部分的数值。有2种数据类型 | 类型 | 存储需求 | 取值范围 | | —- | —- | —- | | float | 4字节 | -3.403E38 ~ 3.403E38 | | double | 8字节 | -1.798E308 ~ 1.798E308 |
  • float类型后有一个F或f,没有后缀的默认为double类型

!> 浮点型进行计算时会产生误差,如果需要进行精确运算则需要使用BigDecimal类

3.boolean型

  • boolean(布尔)类型只有2个值:false和true

4.char类型

  • char类型用于表示单个字符
  • 占用2个字节,并且没有符号位,范围是0 ~ 65535
  • 字面量需要用''括起来,如'A'代表65的字符串常量
  • 常用ASCII有:'0' - 48;'A' - 65;'a' - 97;空格 - 32;换行符 - 10
  • 可以使用Unicode字符集,范围是\u0000 ~ \uFFFF,'\u0041'则代表'A'

!> 不建议在程序中使用char类型,最好使用字符串

堆和栈

  • 栈用于存放程序运行过程中所有的局部变量,一个运行的Java程序从开始到结束会有多次变量的声明
  • JVM会在其内存空间中开辟一个称为堆的存储空间,这部分空间用于存储使用new关键字创建的数组和对象
  • 栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收

调用示意图

字符串

1.字符类型

  • Java字符串就是Unicode字符序列
  • 转义字符有:\" - "\' - '\\ - \\t - 制表符\n - 换行符

2.字符串连接符

  • 可以使用+连接两个字符串,来组成一个新的字符串
  • +两边只要有一个变量是字符串,另一个变量将会被转换成字符串

类型转换

1.自动类型转换

  • 从小类型到大类型进行转换:byte—>short/char—>int—>long—>float—>double

2.强制类型转换

  • 主要是从大类型转换成小类型:目标类型 变量名 = (目标类型) 源类型变量名

!> 强制类型转换可能会导致精度丢失

运算符

1.算数运算符

  • +、-、*、/ 、%表示加、减、乘、除、取余运算
  • 如果将一个类标记为strictfp,这个类中的所有方法都要使用严格的浮点计算
  • 整数被0整除会产生一个异常,浮点数被0除会得到Infinity或NaN结果

2.数学函数与常量

  • 幂运算:Math.pow(x, a)
  • 取余运算:Math.floorMod(x, y)
  • 三角函数:Math.sin、Math.cos、Math.tan、Math.atan、Math.atan2
  • 指数函数:Math.exp、Math.log、Math.log10
  • 常量:Math.PI、Math.E

3.结合赋值和运算符

  • x = x + 4等于x += 4

4.自增自减运算符

  • n将变量n的当前值加1,n—则将n减1;,—都可以放在n的前面如++n
  • 在表达式中,前缀形式的会先完成加1操作;而后缀的形式会使用原来的变量,然后再加1

!> 建议不要再表达式中使用++,这样可能会导致降低可读性或出现BUG

5.关系和boolean运算符

  • ==相等,!=不相等,<小于,>大于,<=小于等于,>=大于等于
  • &&与,||
  • 三元运算符:x < y ? x : y当x < y为true时返回x,反正返回y

6.位运算符

  • <<左移运算符,用于将数据的二进制位向左移动,右边0填充
  • >>右移运算符,用于将数据的二进制位向右移动,左边使用符号位填充
  • >>>表示逻辑右移运算符,用于将数据的二进制位向右移动,左边使用0填充
  • &表示按位与运算符,按照二进制位进行与运算,同1为1,一0为0
  • |表示按位或运算符,按照二进制位进行或运算,一1为1,同0为0
  • ~表示按位取反运算符,按照二进制位进行取反,1为0,0为1

7.运算符优先级

运算符 综合性
[] . ()(方法调用) 从左向右
! ~ ++ -- +(一元运算) -(一元运算) ()(强制类型转换) new 从右向左
* / % 从左向右
+ - 从左向右
<< >> >>> 从左向右
< <= > >= instanceof 从左向右
== != 从左向右
& 从左向右
^ 从左向右
从左向右
&& 从左向右
|| 从左向右
?: 从右向左
= += -= *= /= %= &= |= ^= <<= >>= >>>= 从右向左

流程控制

1.条件语句

  • 当条件condition成立时则会执行代码块中的内容
  1. if (condition){
  2. statement1
  3. statement2
  4. ...
  5. }
  • 当条件condition不成立时则会执行代码块中的statement2
  1. if (condition){
  2. statement1
  3. ...
  4. } else {
  5. statement2
  6. ...
  7. }
  • 当满足条件condition1时则会执行statement1。如果不满足condition1,但是满足condition2则会执行statement2,当上面2个条件都不满足则会执行statement3
  1. if (condition1){
  2. statement1
  3. ...
  4. } else if (condition2){
  5. statement2
  6. ...
  7. } else {
  8. statement3
  9. ...
  10. }

2.循环

  • 当满足条件condition则会执行statement。执行完之后,再次判断condition是否满足条件,满足则再次执行statement。直至不满足condition条件时停止执行。
  1. while (condition){
  2. statement
  3. ...
  4. }
  • 先执行statement,执行完后判断condition是否满足,满足则再次执行statement,不满足则直接结束循环
  1. do {
  2. statement
  3. ...
  4. } while (condition);

3.确定循环

  • int i = 0所在位置代表变量i的初始值,i < 10所在位置代表i满足条件时才会执行下面代码块中的代码,i++所在位置代表每次循环i所发生的变化。下方代码表示i从0开始每次循环加1,一共循环10次,结果将会打印0-9
  1. for (int i = 0; i < 10; i++) {
  2. System.out.println(i);
  3. }

4.多重选择

  • 传入一个参数value,在case标签中进行匹配,当有一个case匹配成功则执行匹配成功的case下的代码,最后由break来退出整个代码块。当case条件一个都不满足,则执行default下的代码然后退出。
  1. switch (value) {
  2. case 1:
  3. System.out.println("1");
  4. break;
  5. case 2:
  6. System.out.println("2");
  7. break;
  8. default:
  9. System.out.println("def");
  10. }
  • case标签可以是

    • 类型为char、byte、short、int的常量表达式
    • 枚举常量
    • 从Java7开始,case标签还可以是字符串

5.中断控制流程

  • break将会立刻结束当前循环。下方的结果将会打印0-6然后结束
  1. for (int i = 0; i < 10; i++) {
  2. if (i == 7){
  3. break;
  4. }
  5. System.out.println(i);
  6. }
  • continue将会跳过本次循环。下方的结果将会打印0-6,8-9
  1. for (int i = 0; i < 10; i++) {
  2. if (i == 7){
  3. continue;
  4. }
  5. System.out.println(i);
  6. }

数组及应用

  • 当需要在Java程序中记录多个类型相同的数据内容时,则声明一个一维数组即可,一维数组本质上就是在内存空间中申请一段连续的存储单元
  • 数组是相同数据类型的多个元素的容器,元素按线性顺序排列,在Java语 言中体现为一种引用数据类型
  • 可以直接通过下标(或索引)的方式访问指定位置的元素,速度很快
  • 数组要求所有元素的类型相同
  • 数组要求内存空间连续,并且长度一旦确定就不能修改
  • 增加和删除元素时可能移动大量元素,效率低

1.声明数组

  1. // 声明数组
  2. int[] a1;
  3. // 初始化了一个可以存储100个整数的数组
  4. int[] a2 = new int[100];
  5. // 初始化数组的简写形式
  6. int[] a3 = {1, 2, 3, 4, 5,};
  7. // 重新初始化一个数组
  8. int[] a4 = new int[]{1, 2, 3, 4, 5,};

2.访问数组元素

  • 可以通过变量名[下标]来获得数组的元素
  1. for (int i = 0; i < a4.length; i++) {
  2. System.out.println(a4[i]);
  3. }
  • 可以通过增强for循环来遍历数组,而不用考虑数组长度
  1. for (int i : a4) {
  2. System.out.println(i);
  3. }

3.数组拷贝

  • 将a4数组拷贝到copyArray,并重新指定数组长度
  1. int[] copyArray = Arrays.copyOf(a4, a4.length + 5);

4.数组排序

  • 将a4数组进行排序
  1. Arrays.sort(a4);

5.常用API

方法声明 功能介绍
static String toString(xxx[] a) 返回包含a元素的字符串
stataic xxx[] copyOf(xxx[] a, int end) 拷贝数组,长度为end,数组长度大于a,则填充0或者false
stataic xxx[] copyOfRange(xxx[] a, int start, int end) 拷贝数组,长度为end-start,数组长度大于a,则填充0或者false
stataic void sort(xxx[] a) 使用优化的快速排序算法进行排序
static int binarySearch(xxx[] a, xxx v) 使用二分查找算法在有序数组a中查找v。找到返回下标,否则返回负数
static int binarySearch(xxx[] a, int start, int end, xxx v) 使用二分查找算法在有序数组a中查找v。找到返回下标,否则返回负数
stataic void fill(xxx[] a, xxx v) 将数组所有元素设置成v
stataic boolean equals(xxx[] a, xxx[] b) 数组大小,元素相等,返回true

6.多维数组

  • 维数组本质上就是由多个一维数组摞在一起组成的数组,二维数组中 的每个元素都是一维数组,而一维数组中的每个元素才是数据内容
  • 声明并初始化数组(使用方式和一维数组类似)
  1. int[][] b1 = new int[行数][列数];
  • 声明一个固定行数不确定列的二维数组
  1. int[][] b2 = new int[3][];
  2. b2[1] = new int[3];
  3. b2[1] = new int[4];
  4. b2[1] = new int[5];

更新时间:{docsify-updated}