Object
toString()
equals()
hashCode()
wait()
notify()
notifyAll()
getClass()
String
常量池
String s1="aaa"+"bbb"+"ccc";
//字面值连接编译器优化成"aaabbbccc"
String s2="aaabbbccc";
s1==s2
//true
s1+s2+s3+s4
字符串连接的运算过程
s1+s2
sb=new StringBuffer(s1);//一个对象
sb.append(s2);
sb.toString();//两个对象
每个加号产生两个对象,那么一共产生6个对象。
StringBuilder/StringBuffer
StringBuilder线程不安全,效率高
StringBuffer线程安全,效率低
正则表达式
基本类型包装类
Integer.valueOf()256个缓存对象。-128-127
减少基本类型的创建
BigDecimal,BigInteger
1.精确浮点数运算,超大整数运算
- BigDecimal.valueOf(2)
集合
ArrayList
访问任意位置效率高
增删数据效率可能低
默认容量10,1.5倍增长
LinkedList(Mq,Redis中的列表)
两端效率高
数据量小时,频繁增删数据效率高
HashMap
key.hashCode()
哈希值计算下标i
新建Entry对象,放入i位置
空位置,直接放入
有数据,依次用equals()比较是否相等
@有相等的覆盖值
@没有相等的,链表连接在一起
负载率,加载因子0.75
新建翻倍长度新数组
所有数据,重新执行哈希运算,放入新数组
jdk1.8
链表长度到8,转成红黑树
红黑树减少到6,转回成链表
HashSet
内部用HashMap的键存放数据
内部无序,不重复
HashTable
旧版本的哈希表
线程安全
TreeMap
TreeMap是一课红黑树
键:不重复,有序
键比较大小,使用Comparable或Comparator
TreeSet
内部用TreeMap放数据
ConcurrentHashMap、ConcurrentHashSet
添加线程同步锁,保证多线程并发访问安全
对内部数据进行分段,每一段单独加锁
LinkedHashMap
有序的HashMap
哈希表
存放的数据,形成双向链表结构
从第一个数据,依次向后访问每个数据
可以用键迅速定位查找数据
异常
IO
序列化
ObjectInputStream/ObjectOutputStream
被序列化必须实现Serializable
(设置了Mybatis缓存或者远程调用必须序列化)
readObject()
writeObject()
NIO
new IO
非阻塞的IO操作模型
网络操作:单线程处理多个客户端的通信
用频道来区分不同客户端的数据
线程
线程的创建
1继承Thread
2实现Runnable
3线程池-只是线程的工具-内部创建的线程本质还是继承Thread
4Callable/Future-只是线程的工具,本质还是Runnable
线程的方法
Thread.sleep()-会引起线程的暂停,不释放锁
join()-会引起线程的暂停-不释放锁
wait()-是对象的方法,释放锁
同步synchronized
获得指定对象的锁
synchronized(对象){
}
获得当前对象的锁
synchronized void f(){
}
获得类对象的锁
static synchronized void f(){
}
join:有两个线程,第二个线程要使用第一个线程的执行结果,结果要过一段时间才能产生,这段时间没有结果,第二个线程要等第一个线程有执行结果才能继续。
生产者、消费者
生产者、消费者是线程之间或进程之间的通信模型。典型的例子是MQ(消息队列)。
多个进程之间用MQ传递数据。
等待和通知
wait()
notify()
notifyAll()
必须在synchronized代码内调用
有synchronized才有同步监视器,才有等待区
等待通知的对象必须是加锁的对象
synchronized(对象){
对象.wait();
对象.notify();
}
synchronized void f(){
this.wait();
this.notify();
}
static synchronized void f(){
类名.class.wait();
类名.class.notify();
}
线程池
ExecutorService/Executors(工具类)
Executors.createCachedThreadPool()
CachedThreadPool会创建足够多的线程,让任务瞬间被处理。
Executors.createFixedThreadPool(4)
创建固定的4个线程
线程池本质上不是创建线程的方式,它只是个封装的工具,它内部创建的线程也是继承了Thread。
Callable/Future
Callable/Future也是调用线程池执行。这个工具会在线程执行结束后,自动运行(回调)一段代码——相当于回调
网络
ServerSocket
Socket
反射
类对象
A.class
Class.forName(“类名”)
对象.getClass()
创建实例
c.newInstance()执行无参构造
注解
自定义注解
SpringMVC的注解@RequestMapping根据配置文件生成一个HashMap,一个配置的路径对应一个对象。所以RequestMapping就是维护一个集合。