函数式接口
接口中只有一个抽象方法
匿名对象,只实例化不赋值给变量
匿名内部类,继承同时实例化
String s = new String(“abc”);创建了两个对象,一个是常量池中“abc” 一个是字符串对象
static
静态变量,在静态区
final static int //常量
局部代码块(局部变量的位置)
构造代码块(构造函数)
静态代码块 static{}
顺序:静态->构造->局部
pojo内一般包装类
局部变量一般基本数据类型
包装类除了Double和Float都会缓存一定范围数据
包装类和基本数据类型==
Integer a = 1;
Integer b = 1;
a==b;//true
Integer a = 128;
Integer b = 128;
a==b;//false
int a = 128;
int b = 128;
a==b;//true
Integer a = new Integer(1);
Integer b = new Integer(1);
a==b;//false
Integer a = new Integer(1);
int b = 1;
a==b;//true 隐式转换
接口
默认方法defaut,可以被继承重写
接口中的静态方法只能通过接口调用
接口中私有方法,只能在接口中调用,提供给接口中的默认方法和静态方法使用
集合
集合中必须存引用数据类型
Collection接口有两个子接口List、Set
List:ArrayList,LinkedList 有序,重复
Set:HashSet,TreeSet 无序,不重复
ArrayList实际上是一个长度可变的数组
数组:查询快,增删慢
链表:查询慢,增删快
泛型
把运行时错误提前到编译时
泛型的上限和下限
<? extends Person> 限定Person类的子类
<? super Student> 限定Student类的父类
IO流
file.getAbsolutePath()
file.getName()
file.getPath()
file.length()
f.createNewFile() //创建文件
f.delete() //删除文件
f.exist() //文件存在
f.isFile() //是否是文件
f.list() //f下所有文件和文件夹的名字
f.listFiles() //f下所有文件和文件夹的文件对象
字节输入/输出
FileInputStream FileOutputStream
bytes[] bys = new bytes[1024];
int len = fis.read(bys) fos.write(bys)
字符输出/输出
FileReader FileWriter
char[] buf= new char[10];
int len = fr.read(buf) fw.write(buf,0,len)
字节缓冲
BufferedInputStream BufferedOutpuStream
字符缓冲
BufferedWriter BufferedReader
bw.write() bw.newLine br.readLine()
序列化
被序列化的类必须实现serializable接口
private **transient **Integer age; 表示不被序列化
properties集合与io流交互
Properties pro = new Properties();
pro.setProperty(“zhangsan”,“23”);
FileOutputStream out = new FileOutStream(“template/pro.properties”);
pro.store(out,“save date”);//保存数据
out.close;
读取
Properties pro = new Properties();
FileInputStream input = new FileInputStream(“template/pro.properties”);
pro.load(input);
System.out.println(pro);
反射注解
在运行状态中,对于任何一个类,都能知道这个类的所有属性和方法;对于任意一个对象,都能调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法能成为java语言的反射机制
获取Class类的对象(字节码文件对象对应的Class类型的对象)
1.Object类的getClass方法
Person p = new Person();
p.getClass();
2.通过 类名.class
Class c1 = Person.class;
3.通过Class中的方法(将类名作为字符串传递给Class类中的今天方法forName即可)
Class c2 = Class.forName(“com.zz.demo.Person”);
多线程
不同线程在不同的栈空间下,不互相影响
线程6种状态
线程池
可以控制一定线程数量,降低资源消耗,任务直接从线程池取出线程运行,运行完毕后归还,省去了线程的创建和销毁提高了效率、响应速度
sychronize
锁的标识存储在markword
锁升级
自旋锁 CAS(compare and set)不需要拿到锁
读取数据->操作完数据后与原数据比较,如果不同说明有其他线程修改过,重新读取再操作,否则将数据修改为操作后的值
ABA问题,在数据被修改多次后回到了原本的值,jdk提供解决方法,给资源加上一个version(一种version是修改过后就变成true,一种是版本号改变)
乐观锁,悲观锁,轻量级锁,重量级锁
**乐观锁 **在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测
** 悲观锁**修改数据之前先锁定,再修改
自旋锁->轻量级锁 线程在jvm级别,while(true)一直判断
轻量级锁 适合临界区操作时间短(执行时间短),少量的线程数 因为在jvm级别,所以线程是活的,需要一直线程切换,切换过多浪费资源
重量级锁->把线程交给操作系统,需要排队等待 适合
重量级锁 适合临界区操作时间长的(执行时间长),数量多的线程 操作系统级别,需要等待