HASHMAP的数据结构是 哈希表=数组+链表
如果HashMap的key是自定义对象,那一定要重写HashCode和Equals方法
HashMap是线程不安全的,非同步的,效率快的。
HashTable是线程安全的,同步的,效率慢的。
2.TreeSet的元素是有序的不重复的 原理是 TreeSet的底层是二叉树
3.Jdk8版本之后哈希表引入了二叉树,从而达到查询的效率
4.Map集合的应用常营 比如说 统计商品出现次数
JVM
栈,堆,方法区
栈:方法运行时所进入的区域,里面还会有承运变量
堆:New出来的东西
方法区:字节码文件加载时所进入的内存
线程
每一个线程都会有自己独立的栈空间,堆内存的数据被多个线程所共享的
jvm中 堆内存和方法区是唯一的,栈内存可以有多个
重点:多线程消费同一个产品,可以将该商品定义为共享资源,存放在堆内存中
异常的处理方式
1.问题可以自己处理掉的
try_catch的处理方式:自己将问题处理掉,不会影响后续代码的继续执行
2.问题自己处理不掉的
throws抛出处理方式
创建线程的几种方式
1.继承Thread:java的类是单继承的,所以继承Thread类方式创建线程,该类无法继承其他类
2.实现Runable:java的类是单继承的,如果自己的类已经实现了别的类,将无法继承Thread类,所以这时候可以用实现Runable接口方式创建线程。
但是代码复杂
3.线程池方式:其实就是容器,易于管理,自动化装配,省去了频繁创建线程对象的操作
ExcuterService
Lock(同步锁)和Synchornize(同步代码块)的区别
1.Lock是Synchornize扩展
2.lock可以实现 公平锁,非公平锁 而且可以判断锁状态
3.Synchornize只能实现非公平锁 无法判断锁状态
4.买票案例:
一个线程相当于一个窗口,多线程相当于多个窗口卖票,多个线程大大的提高效率
HashCode和Equals的区别
1.需要重写
String,StringBuilder,StringBuffer的区别
1.String是不可改变的字符序列,因为String没有Set方法,只要是赋值就是新对象,所以不可改变,String的内部是Final修饰的char数字
2.StringBuilder是可以改变成字符序列
3.比如拼接Sql的话 如果内容多可以用StringBuilder效率高,而不用String拼接
4.StringBuffer是线程安全的,StringBuilder是线程不安全的
(因为StringBuffer字符串缓冲区安全的用于多个线程)
Sql的拼接的场景多,而且Dao层一般都是单线程的所以直接用StringBuilder就好了
Waite和Sleep的区别
1.waite方法在等待过程中,释放锁对象
2.sleep方法在休眠过程中,不会释放所对象
3.通过waite和notify我们可以实现线程之间的通讯
HashMap和HashTable
hashMap是线程不同步的
Hashtable是线程同步的但是用的不多
HashTable的子类Propotirs大量使用中,通过Io流来加载配置文件
单例模式中饿汉式和懒汉式的区别
懒汉式类延时加载,使用是才创建对象(比如配置文件实现懒汉式)
饿汉式类加载时就完成了初始化