存储结构、使用场景、和List的区别,HashMap的key的hashcode值相同就会覆盖原来的value吗
什么场景下使用list,set,map呢
HashMap的key的hashcode值相同就会覆盖原来的value吗
如果key相同,但是hashcode不同,那么value不会被覆盖
如果key相同,并且hashCode相同,那么value会被覆盖
比如Aa和BBhashcode相等,但equals不相等,不会覆盖
1、HashTable
2、SynchronizedMap
3、ConcurrentHashMap - 推荐
https://donglin.blog.csdn.net/article/details/127834133
1.Callable
2.Semaphore
3.ReentrantLock与Condition
4.BlockingQueue
5.CountDownLatch
6.CyclicBarrier
多态性是指允许不同子类型的对象对同一消息作出不同的响应。
1.要有继承关系
2.子类要重写父类的方法
3.父类引用指向子类对,
final可以用来修饰的结构:类、方法、变量
final 用来修饰一个类:此类不能被其他类所继承。
比如:String类、System类、StringBuffer类
final 用来修饰方法:表明此方法不可以被重写
比如:Object类中getClass();
final 用来修饰变量:此时的"变量"就称为是一个常量
4.1 final修饰属性:可以考虑赋值的位置有:显式初始化、代码块中初始化、构造器中初始化
4.2 final修饰局部变量:
尤其是使用final修饰形参时,表明此形参是一个常量。当我们调用此方法时,给常量形参赋一个实参。一旦赋值以后,就只能在方法体内使用此形参,但不能进行重新赋值。
static final 用来修饰属性:全局常量
在Java中,数据类型分为引用类型和基本类型,基本类型分为八种
整型byte,short,int,long
浮点型:float,double
字符型:char
Boolean型:boolean
String不是基本的数据类型,是final修饰的java类,是引用类型。
1.Thread类创建线程类
2.Runnable接口创建线程类
3.Callable创建线程类
4.线程池创建线程类
runnable接口和callable接口除了返回结果之外其他的区别?
(1)是否有返回值 callable有
(2)是否抛异常 callable有
(3)落地方法不一样,一个是run,一个是call
7大参数,4个拒绝策略
1、corePoolSize:线程池中的常驻核心线程数
2、maximumPoolSize:线程池中能够容纳同时执行的最大线程数,此值必须大于等于1
3、keepAliveTime:多余的空闲线程的存活时间,当前池中线程数量超过corePoolSize时,当空闲时间达到keepAliveTime时,多余线程会被销毁直到只剩下corePoolSize个线程为止
4、unit:keepAliveTime的单位
5、workQueue:任务队列,被提交但尚未被执行的任务
6、threadFactory:表示生成线程池中工作线程的线程工厂,用于创建线程,一般默认的即可
7、handler:拒绝策略,表示当队列满了,并且工作线程大于等于线程池的最大线程数(maximumPoolSize)时如何来拒绝请求执行的runnable的策略
拒绝策略都有哪些?
1.AbortPolicy(默认):直接抛出RejectedExecutionException异常阻止系统正常运行
2.CallerRunsPolicy:“调用者运行”一种调节机制,该策略既不会抛弃任务,也不会抛出异常,而是将某些任务回退到调用者,从而降低新任务的流量。
3.DiscardOldestPolicy:抛弃队列中等待最久的任务,然后把当前任务加人队列中尝试再次提交当前任务。
4.DiscardPolicy:该策略默默地丢弃无法处理的任务,不予任何处理也不抛出异常。如果允许任务丢失,这是最好的一种策略。
异常处理方式
方式一:try-catch-finally
方式二:throws+异常类型
狼来了
try-catch-finally相当于我能解决狼
throws自己搞不定,就喊人
先执行try,如果有异常进入catch ,最终进入finally
没有异常,先执行try,再进入finally
仅仅在下面4中情况下不会执行finally语句 :
①.如果在try 或catch语句中执行了System.exit(0)。
②.在执行finally之前jvm崩溃了。
③.try语句中执行死循环。
④.电源断电。
public static int demo5() {try {return printX();}finally {System.out.println("finally trumps return... sort of");}}public static int printX() {System.out.println("X");return 0;}
输出结果:
X
finally trumps return... sort of
0
存储的内容,程序计数器存储的数值是什么?
PC寄存器存储字节码指令地址
因为CPU需要不停的切换各个线程,这时候切换回来以后,就得知道接着从哪开始继续执行。
https://donglin.blog.csdn.net/article/details/127831153
ClassLoader是Java的核心组件,所有的Class都是由ClassLoader进行加载的,ClassLoader负责通过各种方式将Class信息的二进制数据流读入JVM内部,转换为一个与目标类对应的java.lang.Class对象实例。然后交给Java虚拟机进行链接、初始化等操作。
类的加载器有哪些
查看内存使用情况:free
显示进程信息(包括CPU、内存使用等信息):top、ps
查看驱动占用内存:lsmod
待更新
ACID
原子性(atomicity)
原子性是指事务是一个不可分割的工作单位,要么全部提交,要么全部失败回滚。
一致性(consistency)
根据定义,一致性是指事务执行前后,数据从一个 合法性状态 变换到另外一个 合法性状态 。这种状态是 语义上 的而不是语法上的,跟具体的业务有关。
隔离型(isolation)
事务的隔离性是指一个事务的执行 不能被其他事务干扰 ,即一个事务内部的操作及使用的数据对 并发 的其他事务是隔离的,并发执行的各个事务之间不能互相干扰
持久性(durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是 永久性的 ,接下来的其他操作和数据库故障不应该对其有任何影响。
持久性是通过 事务日志 来保证的。日志包括了 重做日志 和 回滚日志 。
1.读未提交
2.读已提交
3.可重复读
4.序列化
侧重于RR和RC来解释
读未提交之脏读
对于两个事务 Session A、Session B,**Session A 读取 了已经被 Session B 更新 但还 没有被提交 的字段。**之后若 Session B 回滚 ,Session A 读取 的内容就是 临时且无效的
读已提交之不可重复读
在事务2中commit,事务1没有commit读到了事务2提交的数据(不可重复读)
可重复读
不可重复读和脏读都没有问题
可重复读出现幻读的现象
脏读
解决办法:把数据库的事务隔离级别调整到READ_COMMITTED(读提交/不可重复读)
幻读
解决办法:把数据库的事务隔离级别调整到SERIALIZABLE_READ(序列化执行),或者数据库使用者自己进行加锁来保证。
全值匹配我最爱
全职匹配我最爱指的是,查询的字段按照顺序在索引中都可以匹配到!
最佳左前缀法则
过滤条件要使用索引必须按照索引建立时的顺序,依次满足,一旦跳过某个字段,索引后面的字段都无法被使用。
计算、函数导致索引失效
范围条件右边的列索引失效
建议:将可能做范围查询的字段的索引顺序放在最后
不等于(!= 或者<>)索引失效
is not null无法使用索引,is null可使用索引
like以通配符%开头索引失效
类型转换导致索引失效
inner join、left join、right join
怎么避免笛卡尔积,判断条件用哪个关键字
where
从数据操作的粒度划分:表级锁、页级锁、行锁
InnoDB 中的行锁的实现依赖于索引,一旦某个加锁操作没有使用到索引,那么该锁就会退化为表锁。
记录锁存在于包括主键索引在内的唯一索引中,锁定单条索引记录。
间隙锁存在于非唯一索引中,锁定开区间范围内的一段间隔,它是基于临键锁实现的。
临键锁存在于非唯一索引中,该类型的每条记录的索引上都存在这种锁,它是一种特殊的间隙锁,锁定一段左开右闭的索引区间。
从对待锁的态度划分:乐观锁、悲观锁
乐观锁 适合 读操作多 的场景,相对来说写的操作比较少。它的优点在于 程序实现 , 不存在死锁
问题,不过适用场景也会相对乐观,因为它阻止不了除了程序以外的数据库操作。
悲观锁 适合 写操作多 的场景,因为写的操作具有 排它性 。采用悲观锁的方式,可以在数据库层
面阻止其他事务对该数据的操作权限,防止 读 - 写 和 写 - 写 的冲突。
synchronized用的锁是存在Java对象头里的Mark Word中,锁升级功能主要依赖MarkWord中锁标志位和释放偏向锁标志位
偏锁
当一段同步代码一直被同一个线程多次访问,由于只有一个线程那么该线程在后续访问时便会自动获得锁
同一个老顾客来访,直接老规矩行方便
看看多线程卖票,同一个线程获得体会一下
轻锁
有线程来参与锁的竞争,但是获取锁的冲突时间极短
本质就是自旋锁
偏向锁和轻锁的区别
争夺轻量级锁失败时,自旋尝试抢占锁
轻量级锁每次退出同步块都需要释放锁,而偏向锁是在竞争发生时才释放锁
待更新
只要调用某个接口就输出日志,日志内容为接口的响应时间spring的核心业务都是基于AOP的,在刚接到请求的时候就存入ThreadLocal中(AtBefore方法完成),业务处理完成后,调用After方法再从ThreadLocal中get
待更新
ThreadLocal的实现原理是每一个Thread维护一个ThreadLocalMap映射表,映射表的key是ThreadLocal实例,并且使用的是ThreadLocal的弱引用 ,value是具体需要存储的Object。下面用一张图展示这些对象之间的引用关系,实心箭头表示强引用,空心箭头表示弱引用。
注意:内存泄漏
弱引用,只要发生gc就会回收,但是会出现一个问题
1.ThreadLocalMap中就会出现key为null的Entry,就没有办法访问这些key为null的Entry的value,如果当前线程再迟迟不结束的话,这些key为null的Entry的value就会一直存在一条强引用链:Thread Ref -> Thread -> ThreaLocalMap -> Entry -> value永远无法回收,造成内存泄漏。
2.当然,如果当前thread运行结束,threadLocal,threadLocalMap,Entry没有引用链可达,在垃圾回收的时候都会被系统进行回收。
3 但在实际使用中 我们有时候会用线程池 去维护我们的线程,比如在Executors.newFixedThreadPool()时创建线程的时候,为了复用线程是不会结束的,所以threadLocal内存泄漏就值得我们小心
set、get、remove方法会去检查所有键为null的Entry对象
待更新
待更新
待更新
待更新