面试用Java知识点小结

Object类

Object类主要方法

equals hashcode notify(all) toString wait clone finalize

String类

支持正则表达式的方法

matchesreplaceAllreplaceFirstsplit

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容器初始化流程

  1. spring启动之后,读取xml配置信息、注解、java类,将每一个bean配置解析为一个BeanDefinition对象,再将所有的BeanDefinition对象放入BeanDefinitionMap中(其中bean的id为key键,BeanDefinition对象为值)。
  2. 从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来回滚你的更改。

什么时候索引失效

  1. 条件中有or,有不带索引的or条件就不会用索引
  2. like以%开头
  3. 用between ,<>,in,!=, is(not) null
  4. 使用内置函数
  5. 隐式转换
  6. 字符串编码转换
  7. 索引字符串但没有加单引号

索引优化原则

  1. 全值匹配最佳
  2. 最佳左前缀法则(分离最多的放最左,左边全放有索引的右边再放无索引的)
  3. 不在索引上进行计算、函数、转型的操作
  4. 少用上述3提到的操作,用exists
  5. 永远不要用select *
    在这里插入图片描述

linux

知识点集合:https://blog.csdn.net/weixin_41563161/article/details/102618800

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值