目录
一、基本语法
二、对象与类
三、接口、lambda表达式与内部类
四、异常、断言和日志
五、泛型程序设计
六、集合
七、并发
一、基本语法
1.Java区分大小写
2.类是构建所有Java应用程序和applet的构建块
3.一个简单的Java类
1 | public class 类名{ |
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 | import java.util.-; |
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 | ... |
33.声明数组
1 | int[] a = new int[100]; |
34.循环的写法
1 | 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 | class child{ |
11.子类构造器格式:
1 | public 子类名(参数....){ |
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);