equals和hashCod
HashCod
hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。 作用可以使查询对象速度更快
hashCode() 定义在JDK的Object.java中,这就意味着Java中的任何类都包含有hashCode() 函数。
equals
是进行比较对象是否相等,如果默认的话是比较两个对象的地址
在底层HashSet不能重复就是进行比较 hashCod和equals 先比较hashCode 如果不相等那么久不用比较equals了。
如果equals相等那么hashCode也一定相等
cookie 和session
https://www.cnblogs.com/it774274680/p/12793004.html
@Autowired和@Resource的区别
@Autowired是spring的 @resource是jdk的 @Autowired默认按照类型装配,默认情况下它要求依赖对象必须存在如果允许为null,可以设置 required属性为false,如果我们想使用按照名称装配,可 以结合@Qualifier注解一起使用;
@Resource默认按照名称装配,当找不到与名称匹配的bean才会按照类型装配,可以通过name属性指定,如果没有指定name属 性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找 依赖对象.
Mybatis
#{}和${}的区别是什么?
${}是字符串替换,#{}是预处理;
Mybatis在处理 时 , 就 是 把 {}时,就是把 时,就是把{}直接替换成变量的值。而Mybatis在处理#{}时,会对sql语句进行预处理,将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
使用#{}可以有效的防止SQL注入,提高系统安全性。
如何使用 like通配符
可以使用 concat 函数
LIKE concat('%',#{userName},'%'))
resultMap和resultType
Spring
事务
READ_UNCOMMITTED
读未提交。脏读、不可重复读、幻读都会发生。
READ_COMMITTED
读已提交。脏读不会发生,不可重复读、幻读都会发生。
REPEATABLE_READ
可重复读。脏读、不可重复读都不会发生,幻读会发生。
SERIALIZABLE
可串行化。脏读、不可重复读、幻读都不会发生。
IOC/DI
依赖注入,通过set 方法注入,或者通过构造器注入
将由手动创建的类交给spring容器来进行创建,解决了耦合性
AOP
面向切面
使用动态代理 分为 cglib 和jdk
对象目标生成了接口用jdk 没有接口用cglib
Spring AOP是基于动态代理的,如果要代理的对象实现了某个接口,那么Spring AOP就会使用JDK动态代理去创建代理对象;
而对于没有实现接口
的对象,就无法使用JDK动态代理,转而使用CGlib动态代理生成一个被代理对象的子类来作为代理。
@autowried 和 @resource
@autowried:默认按照 Tpye注入
@Resource: 默认按照Name注入
JUC
创建线程的几种方法
new Thread
接口rannable
calable
new ThreadPool
线程池的参数
初始
最大
超时时间
超时单位
阻塞队列
创建工厂
拒绝策略
/**
* 解析底层创建线程池
* 7大参数
* new ThreadPoolExecutor(
* 2,//默认开启线程池
* 5,//最大线程池
* 5,//超时没有调用释放线程
* TimeUnit.SECONDS,//时长单位
* new ArrayBlockingQueue<>(2), //阻塞队列
* Executors.defaultThreadFactory(),//工厂
* new ThreadPoolExecutor.AbortPolicy()//拒绝策略
* );
* 4大拒绝策略
* new ThreadPoolExecutor.AbortPolicy() //当线程数超过线程池的最大时,那么抛出异常
* new ThreadPoolExecutor.CallerRunsPolicy()//当线程数超过线程池的最大时,哪里来回到哪里 将由调用此线程的线程执行,回调
* new ThreadPoolExecutor.DiscardPolicy()//线程池满了 那么就丢掉不执行
* new ThreadPoolExecutor.DiscardPolicy()//线程池满了 ,不报错,等待 尝试去抢第一个执行的线程,如果时间超过等待时长丢掉
* 实例来理解
* :理解 默认线程池是2个线程 当沾满时会在 阻塞队列中等待,如果阻塞队列满载时,会启用最大线程池
*
*/
String
String | StringBuffer | StringBuilder |
---|---|---|
String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量优先的内存空间 | StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量 | 可变类,速度更快 |
不可变 | 可变 | 可变 |
线程安全 | 线程不安全 | |
多线程操作字符串 | 单线程操作字符串 |
MYISAM