Java


2020-04-16


软件:一系列按照特定顺序组织的计算机数据和指令的集合,主要分为系统软件和应用软件。

常用的DOS命令:

  1. - 盘名: : 进入某一目录,如 d:
  2. - dir: 查看当前目录下得所有文件夹
  3. - md: 创建文件夹
  4. - rd: 删除文件夹
  5. - cd: 进入指定目录
  6. - cd..: 退回到上一级目录
  7. - cd\: 返回到根目录
  8. - del: 删除文件
  9. - exit: 退出

面向过程 ——> 面向对象(封装、继承、多态)

两种核心机制:

  • Java虚拟机(Java Virtual Machine,JVM):实现自动将Java程序转换为不同平台上可以运行的指令,保证跨平台性
  • 垃圾回收机制(garbage Collection,GC):使用系统级线程自动回收不再使用的内存空间

JDK:Java开发工具包

JRE:Java运行环境,包括Java虚拟机和Java所需的核心类库等

Java notes - 图1

Hello World

package com.company;

// 类名需与文件名一致
public class Main {

    public static void main(String[] args) {
        // write your code here
        System.out.println("Hello World");
    }
}

注释:

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

Java关键字:

标识符:见名知意

  • 作用:常量、变量、方法、类和包等的名称。
  • 命名规则
    • 必须以字母、下划线、美元符![](https://g.yuque.com/gr/latex?%E5%BC%80%E5%A4%B4%EF%BC%8C%E5%85%B6%E4%BB%96%E9%83%A8%E5%88%86%E5%8F%AF%E4%BB%A5%E6%98%AF%E5%AD%97%E6%AF%8D%E3%80%81%E4%B8%8B%E5%88%92%E7%BA%BF%E2%80%9C%E2%80%9D%E3%80%81%E7%BE%8E%E5%85%83%E7%AC%A6%E2%80%9C#card=math&code=%E5%BC%80%E5%A4%B4%EF%BC%8C%E5%85%B6%E4%BB%96%E9%83%A8%E5%88%86%E5%8F%AF%E4%BB%A5%E6%98%AF%E5%AD%97%E6%AF%8D%E3%80%81%E4%B8%8B%E5%88%92%E7%BA%BF%E2%80%9C_%E2%80%9D%E3%80%81%E7%BE%8E%E5%85%83%E7%AC%A6%E2%80%9C&height=26&width=297)”和数字的任意组合。
    • 大小写敏感,长度无限制
    • 不可以是单独Java的关键字,但是可以包含关键字
    • 不能包含空格

命名规范:

  • 包名:多单词组成时所有字母都小写
  • 类名、接口名:多单词组成时,所有单词首字母大写
  • 变量名、方法名:驼峰命名法
  • 常量名:所有字母大写

数据类型:

  • 基本数据类型(八种):整数类型(byte, short, int, long)、浮点类型(float, double)、字符类型(char)、boolean类型(true, false)
    • long型变量赋值时后面要在值后面跟上字母 l
    • float型变量赋值时要在值后面跟上字母 f
    • byte、int、long、和short都可以用十进制、16进制以及8进制的方式来表示。当使用常量的时候,前缀 0 表示 8 进制,而前缀 0x 代表 16 进制
package com.company;

public class Main {

    public static void main(String[] args) {
        // byte
        System.out.println("基本类型:byte 二进制位数:" + Byte.SIZE);
        System.out.println("包装类:java.lang.Byte");
        System.out.println("最小值:Byte.MIN_VALUE=" + Byte.MIN_VALUE);
        System.out.println("最大值:Byte.MAX_VALUE=" + Byte.MAX_VALUE);
        System.out.println();

        // short
        System.out.println("基本类型:short 二进制位数:" + Short.SIZE);
        System.out.println("包装类:java.lang.Short");
        System.out.println("最小值:Short.MIN_VALUE=" + Short.MIN_VALUE);
        System.out.println("最大值:Short.MAX_VALUE=" + Short.MAX_VALUE);
        System.out.println();

        // int
        System.out.println("基本类型:int 二进制位数:" + Integer.SIZE);
        System.out.println("包装类:java.lang.Integer");
        System.out.println("最小值:Integer.MIN_VALUE=" + Integer.MIN_VALUE);
        System.out.println("最大值:Integer.MAX_VALUE=" + Integer.MAX_VALUE);
        System.out.println();

        // long
        System.out.println("基本类型:long 二进制位数:" + Long.SIZE);
        System.out.println("包装类:java.lang.Long");
        System.out.println("最小值:Long.MIN_VALUE=" + Long.MIN_VALUE);
        System.out.println("最大值:Long.MAX_VALUE=" + Long.MAX_VALUE);
        System.out.println();

        // float
        System.out.println("基本类型:float 二进制位数:" + Float.SIZE);
        System.out.println("包装类:java.lang.Float");
        System.out.println("最小值:Float.MIN_VALUE=" + Float.MIN_VALUE);
        System.out.println("最大值:Float.MAX_VALUE=" + Float.MAX_VALUE);
        System.out.println();

        // double
        System.out.println("基本类型:double 二进制位数:" + Double.SIZE);
        System.out.println("包装类:java.lang.Double");
        System.out.println("最小值:Double.MIN_VALUE=" + Double.MIN_VALUE);
        System.out.println("最大值:Double.MAX_VALUE=" + Double.MAX_VALUE);
        System.out.println();

        // char
        System.out.println("基本类型:char 二进制位数:" + Character.SIZE);
        System.out.println("包装类:java.lang.Character");
        // 以数值形式而不是字符形式将Character.MIN_VALUE输出到控制台
        System.out.println("最小值:Character.MIN_VALUE="
                + (int) Character.MIN_VALUE);
        // 以数值形式而不是字符形式将Character.MAX_VALUE输出到控制台
        System.out.println("最大值:Character.MAX_VALUE="
                + (int) Character.MAX_VALUE);
    }
}

/*
基本类型:byte 二进制位数:8
包装类:java.lang.Byte
最小值:Byte.MIN_VALUE=-128
最大值:Byte.MAX_VALUE=127

基本类型:short 二进制位数:16
包装类:java.lang.Short
最小值:Short.MIN_VALUE=-32768
最大值:Short.MAX_VALUE=32767

基本类型:int 二进制位数:32
包装类:java.lang.Integer
最小值:Integer.MIN_VALUE=-2147483648
最大值:Integer.MAX_VALUE=2147483647

基本类型:long 二进制位数:64
包装类:java.lang.Long
最小值:Long.MIN_VALUE=-9223372036854775808
最大值:Long.MAX_VALUE=9223372036854775807

基本类型:float 二进制位数:32
包装类:java.lang.Float
最小值:Float.MIN_VALUE=1.4E-45
最大值:Float.MAX_VALUE=3.4028235E38

基本类型:double 二进制位数:64
包装类:java.lang.Double
最小值:Double.MIN_VALUE=4.9E-324
最大值:Double.MAX_VALUE=1.7976931348623157E308

基本类型:char 二进制位数:16
包装类:java.lang.Character
最小值:Character.MIN_VALUE=0
最大值:Character.MAX_VALUE=65535
*/
  • 引用数据类型:除了八种基本数据类型之外的都是引用类型
    • String:由0或多个字母数字符号组成的串;可由null初始化;值不可变
  • 运算规则:

    • 有多种类型的数据混合计算时,系统首先自动的将所有的数据转换成容量最大的那种数据类型,然后再进行计算,数字类型从大到小为byte、short、int、long、float、double
    • 数字类型的运算中,多个相同类型变量参与的运算,变量要先转换为相应的数据类型的默认类型,这种情况适用于变量的数据类型的容量比默认类型的容量小
    • byte、short、char之间不会互相转换,他们再计算时首先转换为int类型

      public class dataType {
      public static void main(String[] args){
         short s = 2;
         s = (short)(s + 3);
         System.out.println(s); // 5
      
         int i = 1;
         i *= 0.1;
         System.out.println(i); // 0
      
      }
      }
      
  • 变量参与运算时,Java程序不知道具体的这个变量在昨晚运算后结果会不会溢出,所以会先把变量转换为一个更大的类型。例如

    short s = 2 // 此时为short型
    s = s + 3 //Java不知道s + 3的结果会不会超出short型的取值范围,
           //因此会先将其转换为int型再计算,结果为int型
           //但int型不能自动转换为short型,因此要想正常运行需进行强制类型转换
           // 即 s = (short)(s + 3)
    
  • 在使用扩展赋值运算符时,变量再参与运算时会把结果自动强制转换为当前变量类型,如:

    int i = 1
    i *= 0.1 // 0
    // i 为int型,它和float型值进行运算时会先将其转换为float型变量在计算,结果为0.1,
    //但最后自动执行强制类型转换,,将结果转换为int型,舍弃掉小数部分,最终结果为0
    

Java中的运算符:算术运算符、关系运算符、位运算符、逻辑运算符、赋值运算符和其他运算符。

  • 逻辑运算符

    • &:逻辑与
    • |:逻辑或
    • !:逻辑非
    • ^:逻辑异或
    • &&:短路与
    • ||:段落或

      & 和 &&的区别:

      • &时,左边无论真假,右边都要参与运算
      • &&时,如果左边为真,右边参与运算;如果左边为假,那么右边不参与运算

      | 和 || 的区别如上同理。

  • 位运算符

位运算符 描述
<< 空位补0,被移除的高位丢弃,空缺位补0
>> 被移位的二进制的最高位是0,右移后空缺位补0;被移位的二进制的最高位是1,右移后空缺位补1;
>>> 被移位二进制最高位无论是0还是1均补0
& 二进制位参与&运算
| 二进制位参与 | 运算
^ 二进制位进行^运算
~ 正数取反,各二进制位按补码各位取反;负数取反,各二进制位按补码各位取反
  • 三元运算符
    格式:(条件表达式)?表达式1:表达式2
    • 条件表达式为true,则执行表达式1
    • 否则执行表达式2
      int i = 1;
      int k = i > 0 ? 1 : 0;
      System.out.println(k); // 1
      

运算符优先级:

优先级 运算符 结合性
1 ()、[]、{} 从左向右
2 !、+、-、~、++、— 从右向左
3 *、/、% 从左向右
4 +、- 从左向右
5 «、»、>>> 从左向右
6 <、<=、>、>=、instanceof 从左向右
7 ==、!= 从左向右
8 & 从左向右
9 ^ 从左向右
10 | 从左向右
11 && 从左向右
12 || 从左向右
13 ?: 从右向左
14 =、+=、-=、*=、/=、&=、|=、^=、~=、«=、»=、>>>= 从右向左

数组:
数组.PNG

  • 动态初始化: ```java // 先声明数组变量a,接着创建大小为4的新数组,最后将新数组的引用赋给a int [] a = new int [4] //[]内为数组容量 int [][] b = new int [2][2] int [][] c = new int [2][] //只定义第一维的长度

int [] x, y[]; // x是一维数组,y是二维数组


- 静态初始化:
```java
int [] a = new int []{1,2,3}
int [][] b = new int [][]({1,2}, {3,4})
  • 数组默认初始化:数字数组的默认类型为0,对象数组的默认值为null

常见算法:

  • 求数组元素的最大值、最小值、平均值
    int [] a = new int[]{1,2,3,4,5}
    int maxNum = int.MIN_VALUE
    

访问数组元素:

int [] a = new []{1,2,3}
for(int i = 0; i <= a.length; i++){
    System.out.println(a[i])
}

// For - Each 循环
for(int element : a){
    System.out.println(element)
}

数组作为函数的参数:

public static void printArray(int[] array) {
  ...
}

数组作为函数的返回值:

public static int[] reverse(int[] array){
    int [] res = new int[array.length]
    ...
    return res
}

java.util.Arrays类能很方便的操作数组,它所提供的方法都是静态的。如果指定的数组引用为空,则该类中的方法都将抛出一个NullPointerException。

  • Array.asList():返回指定数组支持的固定大小列表
  • Array.binarySearch(int[] a, int key):在给定的数组中执行二分查找寻找key
  • Array.binarySearch(int[] a, int fromIndex, int toIndex, int key):在给定数组的指定区间中使用二分查找寻找key
  • Array.copyOf(int[] original, int newLength):返回值是一个数组 ,也是复制数组的方法,但是会返回一个新的数组,长度和要复制的长度一样
  • Array.copyOfRange(int[] original, int from, int to):将指定数组的指定范围复制到新数组中。
  • Array.equals(int[] a, int[] a2):判断两数组的内容是否相等
  • Array.equals(int[] a, int aFromIndex, int aToIndex, int[] b, int bFromIndex, int bToIndex)
  • Array.fill(int[] a, int val):填充数组,将数组中的每个元素都替换成输入的值.
  • Array.fill(int[] a, int fromIndex, int toIndex, int val):填充数组的指定区间,将区间中的每个元素都替换成输入的值.
  • Array.mismatch(int[] a, int[] b)查找并返回两个int数组之间第一个不匹配的索引,如果没有发现不匹配,则返回-1。
  • Array.parallelSort(int[] a):将指定的数组升序排列
  • Array.parallelSort(int[] a, int fromIndex, int toIndex):将给定数组的指定区间升序排列
  • Array.sort(int[] a):将指定的数组升序排列
  • Array.sort(int[] a, int fromIndex, int toIndex):将给定数组的指定区间升序排列
  • Array.toString(int[] a):返回指定数组内容的字符串表示形式
package com.company;
import java.util.Arrays;

public class utils_Array_Test {
    public static void main(String[] args) {
        int [] a = new int []{1,4,3,2,5};
        int [] b = new int []{1,4,3,2,5};
        int [] c = new int []{4,5,6,7,8};

        System.out.println(Arrays.asList(a));

        // Array.toString():将数组的内容以string类型输出
        System.out.println(Arrays.toString(a));

        // Array.binarySearch(int[] a, int key)
        System.out.println(Arrays.binarySearch(a, 2));

        //Array.binarySearch(int[] a, int fromIndex, int toIndex, int key)
        System.out.println(Arrays.binarySearch(a, 0, a.length - 1, 3));

        // == :判断数组的地址是否相同
        System.out.println(a == b);

        //Arrays.equals():判断两数组的内容是否相等
        System.out.println(Arrays.equals(a, b));

        //Arrays.copyOf():返回值是一个数组 ,也是复制数组的方法,但是会返回一个新的数组,长度和要复制的长度一样
        int [] d = Arrays.copyOf(c, c.length);
        for(int ele : d){
            System.out.println(ele);
        }

        //Arrays.fill():填充数组,将数组中的每个元素都替换成输入的值.
        Arrays.fill(a, 100);
        for(int ele : a){
            System.out.println(ele);
        }

        //Arrays.sort():对数组升序排列
        Arrays.sort(b);
        System.out.println(Arrays.toString(b));

        //Arrays.parallelSort():对数组升序排列
        Arrays.parallelSort(b);
        System.out.println(Arrays.toString(b));

    }
}