Java
数组
int[] ints = {1, 3, 2, 4, 6, 5};
String[] stings = new String[10];
byte[] bytes = new byte[]{1, 3, 5};
内部类
- 内部类的创建:
- 内部类可以对包内其他类隐藏
- 想实现一个接口时, 不想新建类文件
- 内部类可以访问外部类的私有变量
- 外部实例化成员内部类: 外部类势力.new 内部类()
Outer.Inner inner = new Outer().new Inner();
// 或者
Outer outer1 = new Outer();
Outer.Inner inner2 = outer1.new Inner();
- 匿名内部类: 是一个继承了类或实现了某个接口的类的对象
public void hideShow() {
Comparable<Integer> comparable = new Comparable<Integer>() {
@Override
public int compareTo(Integer o) {
int limit = 10;
return limit - o;
}
};
System.out.println(comparable.compareTo(3));
System.out.println(comparable.compareTo(10));
System.out.println(comparable.compareTo(11));
}
枚举
- 每个枚举都是通过 Class 在内部实现的, 因此 SMALL("S") 代表实例化 类 SMALL, 参数 "S"
- 枚举跟普通类一样可以用自己的变量、方法和构造函数,构造函数只能使用 private 访问修饰符,所以外部无法调用
包装类
- 自动拆包, 装包
String,StringBuilder,StringBuffer
- StringBuilder和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问),但 StringBuilder 具有速度优势
Object
- equals
- hashCode
- toString
集合
- HashSet
- (equals 和 hashcode) 内容唯一
- 内容无序
- HashMap
- key 唯一, value不唯一
- 根据键的 HashCode 值存储数据,具有很快的访问速度,最多允许一条记录的键为 null,不支持线程同步
- 内容无序
- ArrayList
io / file / 输入输出
- 不同系统的换行符号不一样
- 字符流
- 字节流
-
InputStream, FileInputStream, BufferedInputStream
IO流类图
-
序列化
- serialVersionUID 序列化ID 一个类可以有一个 ,但必须是 static, long, final
- 不想序列化的属性使用关键字 transient 修饰
private transient int grade;
- 序列化时三种错误
- 无参数构成方法
- 类中包含未知的数据类型
- 类的串行版本与从流中取出的描述符不一致[serialVersionUID]
- 父类未实现Serializable,子类实现了,序列化子类实例的时候,父类的属性是直接被跳过不保存
线程
- 进程 内存[RAM]中的任务应用
- 多线程问题: 由多个线程访问共享内存导致线程题目
- 属于抢占式调度, 新线程,开辟新的栈空间 一个线程,start之后,不能多次start
- 调用的两种方式
- 实现 Runnable 接口的类 [无返回结果],调用Thread.start()
- 继承 Thread 类, 重写 run() 方法
- 通过 Callable 和 Future 创建线程
- 创建 Callable 接口的实现类,并实现 call() 方法,该 call() 方法将作为线程执行体,并且有返回值<T>。
- 创建 Callable 实现类的实例,使用 FutureTask 类来包装 Callable 对象,该 FutureTask 对象封装了该 Callable 对象的 call() 方法的返回值。
- 使用 FutureTask 对象作为 Thread 对象的 target 创建并启动新线程。
- 调用 FutureTask 对象的 get() 方法来获得子线程执行结束后的返回值
// 实现 Runnable
Runnable runnable = new Runnable() {
private int ticket = 20;
@Override
public void run() {
while (ticket > 0) {
System.out.println(Thread.currentThread().getName() + " 正在出售: " + ticket);
ticket--;
}
}
};
new Thread(runnable, "窗口1").start();
// 继承
public class MyThread extends Thread {
public MyThread(String name) {
super(name);
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("当前i:" + i);
}
}
}
new MyThread().start();
- 线程同步
- 同步代码块 synchronized(锁对象) {code} 每次都会判断 锁对象
- 同步方法
- 方法名前添加synchronize关键字使用this作为锁对象
- 静态方法名前添加synchronize关键字使用本类Class属性->Class文件对象
- 锁
- 创建Lock对象 ReentrantLock lock = new ReentrantLock()
- lock.lock();
- lock.unlock();
- Wait()和notify():如果条件不满足,则等待。当条件满足时,等待该条件的线程将被唤醒。一般用在synchronized机制中, Wait()方法调用了long类型参数,线程进入计时等待状态
- join()方法的主要作用是同步,它可以使得线程之间的并行执行变为串行执行。在A线程中调用了B线程的join()方法时,表示只有当B线程执行完毕时,A线程才能继续执行, 这里的A线程,有可能是主线程
JDBC
- 所有下表从1开始
- 注册驱动
- 获取连接
- 获取数据库操作对象
- 执行sql
- 获取结果集
- 释放资源
Class.forName("com.mysql.jdbc.Driver");// DriverManager.registerDirver(new com.mysql.jdbc.Driver());
Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/coa_finance_test?useSSL=false", "root", "");
Statement statement = connection.createStatement();
ResultSet set = statement.executeQuery("sql");
statement.close();
connection.close();
- 执行sql的三种方式
- Statement.executeQuery() 返回ResultSet结果集, 一般执行Select 语句
- Statement.executeUpdate() 返回int类型,影响的行数, 一般执行update,delete 语句 如果执行Drop table, 返回0
- Statement.execute() 返回bool类型 true:返回结果有结果集, 使用 Statement.getResultSet() 获取ResultSet结果集
- 事务
- connection.setAutoCommit(false);取消自动提交
- connection.commit(); 提交
- connection.rollback(); 回滚
JDBC连接池
反射
// 示意类
public class Person() { private int age;public Person()}
public class Student extense Person () { private String name; public Student()}
- classloader
- SystemClassLoader\PlatformClassLoader\bootClassLoader
- bootClassLoader 通常为null
- Class类 描述类文件.class属性的类
- 获取方式
- Class<?> c = Object.getClass()
- Class<?> c =Student.class
- Class<?> c =Class.formName("类名称")
- 反射字段
- Field[] fields = c.getDeclaredFields() // 获取所有类字段,不包含父类,包含私有字段
- Field[] fields = c.getFields() // 获取所有类字段,不包含父类,不包含私有字段
- Field field = c.getField("类名称") // 获取指定字段
- 如果获取父类字段,需要调用 Class<?> cSuper = c.getSuperClass(), 使用父类的反射类
- 使用 Field.set(object, value)设置字段时, 父类需要 Field.setAccessible(true)
- 反射方法与反射字段类似只是Field改为Method
+ Method[] methods = c.getDeclaredMethods()
+ Method[] methods = c.getMethods()
+ Method method = c.getMethod("方法名称", 参数.class) 因为java方法重载机制,所以 参数类型很重要
+ 使用 method.invoke(object, 参数...) 调用方法 - 构造方法 类比 反射方法
- 获取注解, 注意需要 注解被元注解@Returntion(RetentionPolicy.RUNTIME)修饰
- Field 或 Method等反射属性 isAnnotationPresent(Annotation.class) 判断是否包含注解
- getAnnotation(Annotation.class) 获取注解对象, 调用方法获取对应的注解数据
注解
泛型
代理
awt
包package
数据库
- 事务隔离 两个事务 T1, T2
- 脏读: T1读取了T2更新但未提交的值, T2回滚,T1 的值就是临时且无效的.
- 不可重复读取: T1读取了某个字段,然后T2更新,T1再读时,值是不一样的.
- 幻读: T1, T2读取数据库后, T2插入数据,T1再度时,数据不一致.
- 事务隔离级别
- READ UNCOMMITTED 读未提交数据,
- READ COMMITTED 读已提交数据, 避免脏读
- REPEATABLE READ 可重复读 避免脏读和不可重复读
- SERIALIZABLE 串行化 所有问题都能避免,但是并发性能低下
生成注释文件
- javadoc target.java
java命令行
- 生成自己的jar包
- 需要先将文件编译为class文件,然后使用jar命令
javac *.java -d .
jar cvf base.jar base
- 编译目标文件
- .java文件含有包名时,使用java 运行需要 java 包名.文件名
- 有外部引用jar包时, java、javac都需要使用命令参数 -cp jar包绝对路径 引入外部代码
网友评论