之前笔记整理
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)//b:数据源;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();
4
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是否 属于/能不能转化 该类;
具体区别为:
instanceof 是静态比较,是 Java 内置的比较运算符。instanceof 后面的类名在编译时就已知且固定了,即 obj instanceof ClassA,ClassA 必须是已经存在的类名,不能是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、实现Runable接口;
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 int创建仓库
git add添加文件到缓存区
git commit提交更改
git commit -m "修改日志"
git status 查看git状态
git log 查看日志
git chackout -- fileName使该文件回退到最近一次add或commit
git push origin master 推送
。。。
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 : " 跳转标记,可配合break、continue进行循环的跳转
5、 arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
System.arraycopy(原数组,原数组起始位置,目标数组,目标数组起始位置,复制长度),数组深拷贝需要使用该方法
(Object src,int srcPos, Object dest,int destPos, int length)需要事先创建好数组
6、 copyOf(oringinal, int newlength)
arrays1.copyof(原数组,新数组的长度),返回一个新数组,只能从起始位置开始复制
7、 copyOfRange(oringinal,int from, int to)
arrays1.copyOfRange(原数组,起始位置,结束位置)返回一个新数组,包含起始位置,不包含结束位置。