1、流、文件、IO等

  1. 创建文件前若父文件夹不存在会抛出异常,因此创建文件前通常会创建父目录:file1.getParentFile().mkdirs();
  2. 创建的文件夹存在时不会创建新的文件夹覆盖旧的,而是会合并。
  3. Double.MAX_VALUE .MAX_VALUE某数字类型的最大值。
  4. fileInputStream1.read()调用后会阻塞进程,并不会一下子读完。调用一次取消阻塞一次,读取是读取到JVM中(内存);返回读取字节数,读取完之后再次调用会返回-1。
  5. fileOutputStream1.write(byte[] b, int off, int len):数据源;off:起始偏移;len:长度;以byte字节形式写入文件。
  6. 用循环可批量创建实例,用数组承载。
  7. (int) string1.indexof(string2)第一次出现string2的索引,未找到返回-1。
  8. printWriter1.Println(string1)基于文件或流,写入字符串,若创建的是非自动刷新的PrintWriter,则需flush冲刷缓冲区。
  9. String、StringBuilder、StringBuffer:

    • String:本质不可变,可变现象的原因是重新创建了对象,速度最慢。
    • StringBuilder:可变字符串,适用于单线程字符缓冲区操作,线程不安全,速度最快。
    • StringBuffer:可变字符串,适用于多线程字符缓冲区操作,线程安全,速度中间。
    1 String string = "";
    2 StringBuilder stringBuilder = new StringBuilder();
    3 StringBuffer stringBuffer = new StringBuffer();
    
    5 int n = 3000000; // 数据在300万之前StringBuffer时间小于StringBuilder,在300万之后时间越差越大
    6 long s1 = System.currentTimeMillis();
    7 for (int i = 0; i < n; i++) {
    8     // string += i; // 速度过慢。。。
    9 }
    10 long e1 = System.currentTimeMillis();
    11 long s2 = System.currentTimeMillis();
    12 for (int i = 0; i < n; i++) {
    13     stringBuilder.append(i);
    14 }
    15 long e2 = System.currentTimeMillis();
    16 long s3 = System.currentTimeMillis();
    17 for (int i = 0; i < n; i++) {
    18     stringBuffer.append(i);
    19 }
    20 long e3 = System.currentTimeMillis();
    21 System.out.println("string:" + (e1 - s1));
    22 System.out.println("stringBuilder:" + (e2 - s2));
    23 System.out.println("stringBuffer:" + (e3 - s3));
  10. new File(fileParent1, stringChild1)fileParent1下新建stringChild1的文件。
  11. 字符串比较使用string1.equals(string2)而非“==”。
  12. obj1 instanceof class1和class.isInstance(obj):该obj是否属于/能不能转化该类。

    Image

    具体区别为:

    • instanceof 是静态比较,是 Java 内置的比较运算符。instanceof 后面的类名在编译时就已知且固定了,即 obj instanceof ClassAClassA 必须是已经存在的类名,不能是obj.getClass(),不然编译都过不了。
    • isInstance() 是动态比较,是个方法。isInstance() 的左边可以在运行时决定,即可以这样 objA.getClass().isInstance(objB),objA 可以作为某个方法的参数被传进来,这样可以动态的看两个对象是否类型兼容。
  13. FileInputStream/FileOutputStream 字节流,无缓冲区,每个字节都会访问硬盘。

    • FileReader/FileWriter 字符流,都建立在File上。
    • BufferedReader 缓冲字符输入流,可以一次读取一行。
    • DataInputStream 数据流,建立在字节流上,只能读取 DataOutputStream 输出的数据。
    • ObjectInputStream/ObjectOutputStream 对象输入输出流,建立在字节流上。
  14. Lambda 表达式是一种把方法作为参数进行传递的思想。

    • 优点:代码紧凑,不会满是接口和匿名类。
    • 缺点:可读性差,匿名类啰嗦但是清晰,Lambda 一旦变长就难以理解;难以调试,很难在 Lambda 中添加 log;版本支持,需要 JDK8 以上。
  15. 创建多线程的三种方式:

    1. 继承 Thread 类。
    2. 实现 Runnable 接口。
    3. 匿名类。

2、SQL

  1. 1 Class.forname(com.mysql.jdbc.Driver);//加载数据库驱动
    2 Connection c = DriverManager.getConnection(
    3     "jdbc:mysql://127.0.0.1:3306/databaseName?characterEncoding=utf-8","userName","password");
    4 Statement s = c.createStatement;
    5 PrepareStatement ps = c.PrepareStatement($);
    6 s.execute();//执行
    7 create table tableName(
        id int(11) Auto_Increment,
        name varchar(30),
        Primary Key (id)
      ) Default Charset=utf-8;//新建一个具有id、name字段,主键为id,表名为tableName的表
    8 增:insert into tableName values($);
      删:delete from tableName where $;
      改:update tableName set $ where $;
      查:select * from tableName where $;
    9 boolean:execute(sql)增查删改
      int:executeUpdate(sql)增删改
      ResultSet:executeQuery(sql)查
    10 c.setAutoCommit(false);//事务,关闭自动提交
       c.commit();//手动提交
    11 ORM 一个对象对应一条记录,
       DAO 数据访问对象,把数据访问封装在该类,其他地方看不到JDBC代码

3、Git

  1. git init 创建仓库
  2. git add 添加文件到缓存区
  3. git commit 提交更改
  4. git commit -m "修改日志"
  5. git status 查看git状态
  6. git log 查看日志
  7. git checkout -- fileName 使该文件回退到最近一次add或commit
  8. git push origin master 推送
  9. ...
  10. To Be Continued...

4、IDEA

  1. Alt+Insert 构造面板
  2. Ctrl+Shift+Enter 自动补全
  3. Shift+F6 重命名
  4. Ctrl+Alt+M 抽取逻辑,构建新方法
  5. Ctrl+D 快速复制
  6. Ctrl+W 选择代码
  7. Ctrl+左/右 移动到单词前后
  8. Ctrl+[/] 方法内部跳跃,代码块前后
  9. Ctrl+< > 快速折叠
  10. Alt+上/下 不同方法间跳跃
  11. Ctrl+N、Ctrl+Shift+N、双击Shift:查找classes、files、all
  12. Ctrl+H 类继承关系
  13. Ctrl+F12 当前类所有方法

5、Others

  1. transient 短暂的,被transient修饰的变量不会被序列化。
  2. ArrayList.ensureCapacity(N) 可以预设list大小。
  3. ArrayList.clone() ArrayList 的浅拷贝,即变量中的元素指向同一个元素。
  4. "mark :" 跳转标记,可配合breakcontinue进行循环的跳转。
  5. arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

    System.arraycopy(原数组,原数组起始位置,目标数组,目标数组起始位置,复制长度)

    数组深拷贝需要使用该方法,需要事先创建好数组。

  6. copyOf(oringinal, int newlength)

    arrays1.copyOf(原数组,新数组的长度)

    返回一个新数组,只能从起始位置开始复制。

  7. copyOfRange(oringinal, int from, int to)

    arrays1.copyOfRange(原数组,起始位置,结束位置)

    返回一个新数组,包含起始位置,不包含结束位置。

标签: Java, 笔记

添加新评论