美文网首页
PHP转JAVA的记录

PHP转JAVA的记录

作者: 鱼落于天 | 来源:发表于2020-11-03 15:46 被阅读0次

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 创建线程
      1. 创建 Callable 接口的实现类,并实现 call() 方法,该 call() 方法将作为线程执行体,并且有返回值<T>。
      2. 创建 Callable 实现类的实例,使用 FutureTask 类来包装 Callable 对象,该 FutureTask 对象封装了该 Callable 对象的 call() 方法的返回值。
      3. 使用 FutureTask 对象作为 Thread 对象的 target 创建并启动新线程。
      4. 调用 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} 每次都会判断 锁对象
    • 同步方法
      1. 方法名前添加synchronize关键字使用this作为锁对象
      2. 静态方法名前添加synchronize关键字使用本类Class属性->Class文件对象
      1. 创建Lock对象 ReentrantLock lock = new ReentrantLock()
      2. lock.lock();
      3. 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包绝对路径 引入外部代码

相关文章

网友评论

      本文标题:PHP转JAVA的记录

      本文链接:https://www.haomeiwen.com/subject/mptivktx.html