之前笔记整理
1、流、文件、IO等
- 创建文件前若父文件夹不存在会抛出异常,因此创建文件前通常会创建父目录:
file1.getParentFile().mkdirs();
- 创建的文件夹存在时不会创建新的文件夹覆盖旧的,而是会合并。
Double.MAX_VALUE .MAX_VALUE
某数字类型的最大值。fileInputStream1.read()
调用后会阻塞进程,并不会一下子读完。调用一次取消阻塞一次,读取是读取到JVM中(内存);返回读取字节数,读取完之后再次调用会返回-1。fileOutputStream1.write(byte[] b, int off, int len)
:数据源;off
:起始偏移;len
:长度;以byte
字节形式写入文件。- 用循环可批量创建实例,用数组承载。
(int) string1.indexof(string2)
第一次出现string2的索引,未找到返回-1。printWriter1.Println(string1)
基于文件或流,写入字符串,若创建的是非自动刷新的PrintWriter,则需flush冲刷缓冲区。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));
new File(fileParent1, stringChild1)
在fileParent1
下新建stringChild1
的文件。- 字符串比较使用
string1.equals(string2)
而非“==”。 obj1 instanceof class1和class.isInstance(obj)
:该obj是否属于/能不能转化该类。具体区别为:
instanceof
是静态比较,是 Java 内置的比较运算符。instanceof
后面的类名在编译时就已知且固定了,即obj instanceof ClassA
,ClassA
必须是已经存在的类名,不能是obj.getClass()
,不然编译都过不了。isInstance()
是动态比较,是个方法。isInstance()
的左边可以在运行时决定,即可以这样objA.getClass().isInstance(objB),objA
可以作为某个方法的参数被传进来,这样可以动态的看两个对象是否类型兼容。
FileInputStream/FileOutputStream 字节流,无缓冲区,每个字节都会访问硬盘。
- FileReader/FileWriter 字符流,都建立在File上。
- BufferedReader 缓冲字符输入流,可以一次读取一行。
- DataInputStream 数据流,建立在字节流上,只能读取 DataOutputStream 输出的数据。
- ObjectInputStream/ObjectOutputStream 对象输入输出流,建立在字节流上。
Lambda 表达式是一种把方法作为参数进行传递的思想。
- 优点:代码紧凑,不会满是接口和匿名类。
- 缺点:可读性差,匿名类啰嗦但是清晰,Lambda 一旦变长就难以理解;难以调试,很难在 Lambda 中添加 log;版本支持,需要 JDK8 以上。
创建多线程的三种方式:
- 继承 Thread 类。
- 实现 Runnable 接口。
- 匿名类。
2、SQL
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
git init
创建仓库git add
添加文件到缓存区git commit
提交更改git commit -m "修改日志"
git status
查看git状态git log
查看日志git checkout -- fileName
使该文件回退到最近一次add或commitgit push origin master
推送- ...
- To Be Continued...
4、IDEA
- Alt+Insert 构造面板
- Ctrl+Shift+Enter 自动补全
- Shift+F6 重命名
- Ctrl+Alt+M 抽取逻辑,构建新方法
- Ctrl+D 快速复制
- Ctrl+W 选择代码
- Ctrl+左/右 移动到单词前后
- Ctrl+[/] 方法内部跳跃,代码块前后
- Ctrl+< > 快速折叠
- Alt+上/下 不同方法间跳跃
- Ctrl+N、Ctrl+Shift+N、双击Shift:查找classes、files、all
- Ctrl+H 类继承关系
- Ctrl+F12 当前类所有方法
5、Others
transient
短暂的,被transient
修饰的变量不会被序列化。ArrayList.ensureCapacity(N)
可以预设list大小。ArrayList.clone()
ArrayList 的浅拷贝,即变量中的元素指向同一个元素。"mark :"
跳转标记,可配合break
、continue
进行循环的跳转。arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
:System.arraycopy(原数组,原数组起始位置,目标数组,目标数组起始位置,复制长度)
数组深拷贝需要使用该方法,需要事先创建好数组。
copyOf(oringinal, int newlength)
:arrays1.copyOf(原数组,新数组的长度)
返回一个新数组,只能从起始位置开始复制。
copyOfRange(oringinal, int from, int to)
:arrays1.copyOfRange(原数组,起始位置,结束位置)
返回一个新数组,包含起始位置,不包含结束位置。