文章目录
Object类
Object类主要方法
equals hashcode notify(all) toString wait clone finalize
String类
支持正则表达式的方法
matches
,replaceAll
,replaceFirst
,split
new和""的区别
常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。
在常量池中存储字符串常量的内存空间,即字符串常量池,当需要使用字符串时,先去字符串池中查看该字符串是否已经存在,如果存在,则可以直接使用,如果不存在,初始化,并将该字符串放入字符串常量池中。
使用双引号,JVM会在编译期检查常量池中是否存在"",不存在则在其中开辟空间来存储值,存在则创建指针指向其位置。所有用双引号创建的字符串用==
操作符比较结果都为true
new操作必定会在堆上创建一个对象,并且如果对应的字符串不在常量池中(编译器),还会在常量池中创建对应的对象,new操作创建的String用==
操作符比较的结果都为false
字符串相加实现机制
StringBuilder封装下的语法糖
异常处理机制
finally中return会如何?
除非系统异常退出,finally总能被执行
- finally中的return语句可以覆盖try块中的return语句,前者在后者发生之后,实际返回之前。
(Concurrent)HashMap
与HashMap的区别
HashMap实现原理:https://www.cnblogs.com/chengxiao/p/6059914.html
ConcurrentHashMap实现原理:https://www.cnblogs.com/chengxiao/p/6842045.html
如何实现
CAS+synchronized(Java8及之后,5-7用ReentrantLock)
HashMap与HashTable的区别
-
HashMap :先说HashMap,HashMap是线程不安全的,在并发环境下,可能会形成环状链表,导致get操作时,cpu空转,所以,在并发环境中使用HashMap是非常危险的。
-
HashTable : HashTable和HashMap的实现原理几乎一样,差别无非是1.HashTable不允许key和value为null;2.HashTable是线程安全的。但是HashTable线程安全的策略实现代价却太大了,简单粗暴,get/put所有相关操作都是synchronized的,这相当于给整个哈希表加了一把大锁,多线程访问时候,只要有一个线程访问或操作该对象,那其他线程只能阻塞,相当于将所有的操作串行化,在竞争激烈的并发场景中性能就会非常差。
ConcurrentHashMap的分段锁
List
CopyOnWriteArrayList原理
它是ArrayList的线程安全版本,使用ReentrantLock来支持并发操作,整体上的实现思想就是在有读操作的时候,从原份复制一份出来并进行处理,之后再将复制处理后的数组作为原份。
ArrayList和LinkedList区别
线程池
网络相关
cookie和session的区别
https://www.jianshu.com/p/2f7031a69f43
https://blog.csdn.net/chen13333336677/article/details/100939030
cookie在客户端,session在服务端,前者限制了大小和数量,后者没限制但有删除机制
Spring/springboot/spring mvc
@Controller和@RestController的区别
- @RestController注解相当于@ResponseBody + @Controller合在一起的作用
@ResponseBody
用于将Java对象转换为json/xml格式的数据
其作用是将controller的方法返回的对象通过转换为指定格式写入response对象的body区
IOC AOP原理
IOC容器初始化流程
- spring启动之后,读取xml配置信息、注解、java类,将每一个bean配置解析为一个BeanDefinition对象,再将所有的BeanDefinition对象放入BeanDefinitionMap中(其中bean的id为key键,BeanDefinition对象为值)。
- 从beanDefinitoinMap中取出所有的非懒加载beanDefinition实例化bean(通过反射来实例化),并将bean加载进缓存,即放入singletonObjects(仅单例)的map中。
AOP的基本概念
- 连接点(JoinPoint):需要在程序中插入横切关注点的点,连接点可能是在类初始化、方法调用、字段调用或处理异常等等。Spring中只支持方法执行连接点。
- 切入点(Pointcut):一组相关连接点的集合。
- 通知(Advice):在连接点上执行的行为,增强提供了在AOP中需要在切入点所选择的连接点处进行扩展现有行为的手段。包括前置增强(before advice)、后置增强 (after advice)、环绕增强 (around advice)。
- 切面(Aspect):通知和切入点的结合。
- 织入(Weaving):织入是一个过程,是将切面应用到目标对象从而创建出AOP代理对象的过程。
- 代理(Proxy):通过代理方式来对目标对象应用切面。AOP代理可以用JDK动态代理或CGLIB代理实现。
目标对象(Target):需要被织入关注点的对象。即被代理的对象。
MySQL
简述在MySQL数据库中MyISAM和InnoDB的区别
- MyISAM:
不支持事务,但是每次查询都是原子的;
支持表级锁,即每次操作是对整个表加锁;
存储表的总行数;
一个MYISAM表有三个文件:索引文件、表结构文件、数据文件;
采用非聚集索引,索引文件的数据域存储指向数据文件的指针。辅索引与主索引基本一致,但是辅索引不用保证唯一性。
- InnoDb:
支持ACID的事务,支持事务的四种隔离级别;
支持行级锁及外键约束:因此可以支持写并发;
不存储总行数;
一个InnoDb引擎存储在一个文件空间(共享表空间,表大小不受操作系统控制,一个表可能分布在多个文件里),也有可能为多个(设置为独立表空,表大小受操作系统文件大小限制,一般为2G),受操作系统文件大小的限制;
主键索引采用聚集索引(索引的数据域存储数据文件本身),辅索引的数据域存储主键的值;因此从辅索引查找数据,需要先通过辅索引找到主键值,再访问辅索引;最好使用自增主键,防止插入数据时,为维持B+树结构,文件的大调整。
事务的四种隔离级别
- read uncommited :读到未提交数据
- read committed:脏读,不可重复读
- repeatable read:可重读
- serializable :串行事务
加锁方法
读未提交:读操作不加共享锁
读已提交:读操作加共享锁,写操作加排他锁,读操作完毕释放共享锁,排他锁直到事务提交才释放
可重复读:读操作加共享锁,写操作加排他锁,读操作和写操作直到事务提交才释放共享锁和排他锁
可串行化:额外添加范围锁,例如表锁或者叶锁,或者如InnoDB在记录锁上加间隙锁或者读锁阻塞其他操作直到事务结束
列设置为AUTO INCREMENT时,如果在表中达到最大值,会发生什么情况?
它会停止递增,任何进一步的插入都将产生错误,因为密钥已被使用。
如何在Unix和Mysql时间戳之间进行转换?
UNIX_TIMESTAMP是从Mysql时间戳转换为Unix时间戳的命令
FROM_UNIXTIME是从Unix时间戳转换为Mysql时间戳的命令
什么是通用SQL函数?
CONCAT(A, B) – 连接两个字符串值以创建单个字符串输出。通常用于将两个或多个字段合并为一个字段。
FORMAT(X, D)- 格式化数字X到D有效数字。
CURRDATE(), CURRTIME()- 返回当前日期或时间。
NOW() – 将当前日期和时间作为一个值返回。
MONTH(),DAY(),YEAR(),WEEK(),WEEKDAY() – 从日期值中提取给定数据。
HOUR(),MINUTE(),SECOND() – 从时间值中提取给定数据。
DATEDIFF(A,B) – 确定两个日期之间的差异,通常用于计算年龄
SUBTIMES(A,B) – 确定两次之间的差异。
FROMDAYS(INT) – 将整数天数转换为日期值。
MYSQL支持事务吗?
在缺省模式下,MYSQL是autocommit模式的,所有的数据库更新操作都会即时提交,所以在缺省情况下,mysql是不支持事务的。
但是如果你的MYSQL表类型是使用InnoDB Tables 或 BDB tables的话,你的MYSQL就可以使用事务处理,使用SET AUTOCOMMIT=0
就可以使MYSQL允许在非autocommit模式,在非autocommit模式下,你必须使用COMMIT来提交你的更改,或者用ROLLBACK来回滚你的更改。
什么时候索引失效
- 条件中有or,有不带索引的or条件就不会用索引
- like以%开头
- 用between ,<>,in,!=, is(not) null
- 使用内置函数
- 隐式转换
- 字符串编码转换
- 索引字符串但没有加单引号
索引优化原则
- 全值匹配最佳
- 最佳左前缀法则(分离最多的放最左,左边全放有索引的右边再放无索引的)
- 不在索引上进行计算、函数、转型的操作
- 少用上述3提到的操作,用exists
- 永远不要用select *
linux
知识点集合:https://blog.csdn.net/weixin_41563161/article/details/102618800