【笔记】Java语言学习笔记

目录

一、基本语法

二、对象与类

三、接口、lambda表达式与内部类

四、异常、断言和日志

五、泛型程序设计

六、集合

七、并发

一、基本语法

1.Java区分大小写

2.类是构建所有Java应用程序和applet的构建块

3.一个简单的Java类

1
2
3
4
5
public class 类名{
public static void main(String[] args){
...
}
}

4.Java文件说明

  • 源代码文件名为为类名.java
  • 编译源代码后会得到类名.class
  • 然后就可以用控制台命令java 类名来运行代码了

5.打印输出

  • System.out.print();打印完后不会自动换行
  • System.out.println();打印完后会自动换行

6.Java数据类型

  • 整型(默认值0)
    • int占4字节
    • short占2字节
    • long占8字节
    • byte占1字节 -128-127
  • 浮点类型(默认值0)
    • float占4字节
    • double占8字节
  • 布尔类型(默认值false)(布尔类型不能与整型互换,即false!=0)
  • 字符、对象(默认值null)

7.前缀ob和OB都代表的是二进制,例如ob1111_0100(下划线是为了方便阅读,实际编译时会自动跳过)

8.值为NaN表示出错,此时用Double.isNaN(a)才能判断double类型的变量a是不是为NaN

  • 注意即使a=NaN、b=NaN,a也不等于b

9.若可以从变量的初始值推断出它的类型则可以直接用var定义

1
var i = 12;

10.枚举

  • 定义枚举类型
    1
    enum Size{SMALL, LARGE};
  • 使用
    1
    2

    Size s = Size.LARGE;

11.math包的导入形式

1
import static java.lang.Math.-;

12.强转(int)x会把x强制转换成整型,注意不要对boolean进行强制转换,最好用b?1:0这样的形式

13.a+=b+=c等同于a+=(b+=c)

14.s.substring(a,b)表示从字符串s取下标[a,b)的子串

15.将一个字符串与一个非字符串的值进行拼接时,后者会自动转换成字符串(任何一个Java对象都可以转换成字符串)

26.”ab”.repeat(3) = “ababab”;

27.字符串相等不要用==判断

  • 用s.eauals(t)判断s与t字符串是否相等
  • 用s.eaualsIgnoreCase(t)也是判断s与t字符串是否相等,但不区分大小写

28.要想通过控制台输入,首先需要构造一个Scanner对象

1
2
3
4
5
import java.util.-;

Scanner in = new Scanner(Systen.in);
s = in.next; //读一个以空格为分隔符的词
s = in.nextLine(); //读一行

29.以下语句会打印出1个空格和7个x里的字符(保留小数点后2位)

1
System.out.printf("%8.2f",x)

30.Java读写文件

  • 读取文件
    1
    2
    3
    4

    import java.util.-;

    Scanner in = new Scanner(Path.of("xx.txt"), StandardCharsets.UTF_8);
  • 写入文件
    1
    PrintWriter in = new PrintWriter(("xx.txt"), StandardCharsets.UTF_8);

31.throw Exception关键字用于把该函数的异常抛出到调用该函数的地方

32.带标签的break

1
2
3
4
5
6
7
...
read_data;
while{
for{
break read_data; //会跳过离read_data最近的循环,即while
}
}

33.声明数组

1
int[] a = new int[100]; 

34.循环的写法

1
2
3
for(int element:a){
...
}

35.数组拷贝

1
int[] b = Array.copyof(a, b数组长度); //若a长度小于b,则b的额外元素会取默认值

36.排序函数

1
Array.sort(a);

37.数组的使用方式

  • 数组的长度
    1
    int n = nums.length;
  • 在返回中构建
    1
    2
    3
    4
    5
    6

    # 返回一个包含元素0和1的长度为2的int[]
    return new int[] {0,1};

    # 返回一个空的int[]
    return new int[];

38.命令行运行.java代码

  • 先用javac生成.class文件
    1
    javac HelloWorld.java
  • 再用java执行
    1
    java HelloWorld

39.源文件名必须和类名相同

40.C++、Go等编译型与Java的区别

  • C++和Go最终得到的是.exe可执行程序,操作系统直接运行即可
  • Java最终得到的是.class字节码程序,操作系统运行的时候还需要Java解释器来解释才能执行

二、对象与类

1.Java类之间的关系

  • 依赖:该类的方法使用了另一个类的对象
  • 聚类:该类的对象包含一个别的类的对象
  • 继承:该类是别的类的扩展

2.一个程序会定义多个类,但其中只能一个类有main方法

  • main方法一般存在于用public声明的公共类里
  • 该公共类名字与源文件名字相同

3.静态方法是不对对象自身成员执行的方法,例如Math.pow(x,a)只对x、a执行,不对Math类里的数据成员执行,即可以不创建类对象也能调用静态方法(和C++一样)

4.方法的签名:方法名和参数类型

5.Java允许用package把类组织在一个集合中

6.一个包里的类可以使用

  • 该包的所有类
  • 其他同样被程序引入的包的公共类

7.引入包的格式

1
import java.xx.- //表示引入名为xx的包

8.通过jar在控制台启动代码

1
java -jar xx.jar

9.以下表示Manager是Employee的子类

1
public class Manager extends Employee

10.在子类中调用超类的方法用super关键字

1
2
3
class child{
super.getSalary(); //表示调用child的超类的getSalary()方法
}

11.子类构造器格式:

1
2
3
4
public 子类名(参数....){
super(参数1...);
子类自己的参数=xx;
}

12.可以指示多种实际类型的变量称多态变量,能根据对象类型选择不同方法的称作动态绑定

13.用final关键字声明的类和方法不允许继承

14.抽象类声明要用abstract关键字,注意该类不能创建对象

15.Object类是Java中所有类的超类,它意味着所有对象都可以用.equals()、.getclass()和toString()判断是否相同、返回其超类和返回”类名[字段值]”格式的字符串

16.ArrayList泛型数组在添加或删除元素时,它能够自动调整数组容量

  • 例:以下语句表示定义一个名为astaff的Employee数组
    1
    var staff = new ArrayList<Employee>(); //var相当于用来声明局部变量的auto
  • staff.add()-添加元素
  • staff.size()-返回元素个数
  • staff.trimToSize()-删掉没用到的空间,仅保存当前有数据的空间
  • staff.set(i, xx)-将第i个元素设为xx
  • staff.get(i)-返回第i个元素
  • staff.remove(i)-删除第i个元素

17.反射:在代码时,能够获取类内部的成员、方法等信息的程序称为反射

  • 例如所有类都有的方法
    • .getFields()-返回类的公共字段
    • .getMethods()-返回类的方法
    • .getConstructors()-返回类的构造器

18.Java和C++的区别是

  • Java的类最后括号不用加”;”
  • Java的构造函数的声明不能加返回值类型(c++会用void)
  • Java的main函数要用如下形式:
    1
    2
    3
    4

    public static void main(String[] args){
    ......
    }

19.每个.java文件里面

  • 一个源文件中只能有一个 public 类
  • 一个源文件可以有多个非 public 类
  • 源文件的名称应该和 public 类的类名保持一致。例如:源文件中 public 类的类名是 Employee,那么源文件应该命名为Employee.java。
  • 如果一个类定义在某个包中,那么 package 语句应该在源文件的首行。
  • 如果源文件包含 import 语句,那么应该放在 package 语句和类定义之间。如果没有 package 语句,那么 import 语句应该在源文件中最前面。
  • import 语句和 package 语句对源文件中定义的所有类都有效。在同一源文件中,不能给不同的类不同的包声明。

三、接口、lambda表达式与内部类

1.接口是对类的一组需求,满足了这些需求的类才称作符合这个接口,接口中会有方法的参数类型,返回值类型,但绝对不会实现方法

  • 接口声明用interface
    1
    2
    3
    4
    # 一个名为Comparable接口的声明
    public interface Comparable{
    int compare(Object other);
    }
    1
    2
    3
    4
    5
    6
    # Employee类实现了Comparable接口
    class Employee implements Comparable<Employee>{
    pbulic int compareTo(Employee ohter){
    return Double.compare(salart, other.salary);
    }
    }

四、异常、断言和日志

五、泛型程序设计

六、集合

七、并发

八、常用数据结构

1.哈希表

  • 声明
    1
    Map<Integer, Integer> memo = new HashMap<Integer, Integer>();
  • 插入
    1
    memo.put(key, val)
  • 检查是否存在
    1
    2

    if(memo.containsKey(target - nums[i])) return xx;
  • 获得val
    1
    int a = memo.get(key);