导图社区 初中级java面试题
初中级java面试题的思维导图,如Redis以什么数据结构存储?字符串(String),散列(Hash),列表(List),集合(Set),有序集合(Sorted Set或者是ZSet)。
编辑于2023-10-11 09:53:10初级面试题
1.java整个项目的难点和如何解决
用的是分布式架构: 1.分布式事务, 2.分布式锁实现
2.怎么保证数据一致性
1.通过CAS原理(比较和交换),乐观锁
2.通过redis分布式锁或者zk分布式锁
3.建立唯一约束
3.数据库怎么优化,具体说说
1.优化sql和索引
1.用慢查询日志定位执行效率低的SQL语句
2.用explain分析SQL的执行计划
3.确定问题,采取相应的优化措施,建立索引啊,等
2.搭建缓存
将复杂的、耗时的、不常变的执行结果缓存起来,降低数据库的资源消耗
缓存击穿、缓存穿透、缓存雪崩问题如何解决?
3.读写分离
利用现成的中间件mycat或者altas等做读写分离
4.分库分表
1.垂直分表
把没有关联的表分到不同的服务器
2.水平分表
把数据量大的表根据关联字段分到不通的服务器
4.Hibernate缓存机制
Hibernate一级缓存
又称为“Session的缓存”,它是内置的,不能被卸载(不能被卸载的意思就是这种缓存不具有可选性,必须有的功能,不可以取消session缓存)
Hibernate二级缓存
又称为“SessionFactory的缓存”,由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。第二级缓存是可选的,是一个可配置的插件,在默认情况下,SessionFactory不会启用这个插件
什么样的数据适合存放到第二级缓存中?
1 很少被修改的数据 2 不是很重要的数据,允许出现偶尔并发的数据 3 不会被并发访问的数据 4 常量数据
不适合存放到第二级缓存的数据?
1 经常被修改的数据 2 .绝对不允许出现并发访问的数据,如财务数据,绝对不允许出现并发 3 与其他应用共享的数据。
Hibernate查找对象如何应用缓存?
当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;如果都查不到,再查询数据库,把结果按照ID放入到缓存,删除、更新、增加数据的时候,同时更新缓存。Hibernate管理缓存实例无论何时,当你给save()、update()或saveOrUpdate()方法传递一个对象时,或使用load()、 get()、list()、iterate() 或scroll()方法获得一个对象时, 该对象都将被加入到Session的内部缓存中。 当随后flush()方法被调用时,对象的状态会和数据库取得同步。 如果你不希望此同步操作发生,或者你正处理大量对象、需要对有效管理内存时,你可以调用evict() 方法,从一级缓存中去掉这些对象及其集合。
5. Mysql 表锁 行锁 怎么保证数据不冲突
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
保证数据不冲突: 建立唯一约束字段
6.Jdbc连接数据库过程
加载驱动Class.forName(com.mysql.jdbc.Driver)
创建数据连接对象Connection
创建Statement对象
调用Statement对象的相关方法执行相对应的 SQL 语句
关闭数据库连接
7. Java内存区域怎么分布
以上五个区域是Java虚拟机内存划分情况,其中方法区和堆被JVM中多个线程共享,比如类的静态常量就被存放在方法区,供类对象之间共享,虚拟机栈,本地方法栈,pc寄存器是每个线程独立拥有的,不会与其他线程共享。 所以Java在通过new创建一个类对象实例的时候,一方面会在虚拟机栈中创建一个该对象的引用,另一方面会在堆上创建类对象的实例,然后将对象引用指向该对象的实例。对象引用存放在每一个方法对应的栈帧中。
程序计数器(Program Counter Register)
指示Java虚拟机下一条需要执行的字节码指令
Java栈(VM Stack)
虚拟机栈中执行每个方法的时候,都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息
本地方法栈(Native Method Stack)
本地方法栈为虚拟机使用的Native方法服务,执行每个本地方法的时候,都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息
方法区(Method Area)
虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据
堆(Heap)
堆是Java对象的存储区域,任何用new字段分配的Java对象实例和数组,都被分配在堆上
8.java对象的实例化过程
1.加载所有父类
2.在内存堆中分配对象空间
3.进行属性的赋值
4.递归调用父类构造器.(默认调用父类无参构造器)
5.调用本类构造器
9.有无内存泄漏和对溢出经验,如何解决,jvm参数设置
如何避免内存泄漏、溢出
1、尽早释放无用对象的引用
2、程序进行字符串处理时,尽量避免使用String,而应该使用StringBuffer
3、尽量少用静态变量
4、避免集中创建对象,尤其是大对象,如果可以的话尽量使用流操作
5、尽量运用对象池技术以提高系统性能
6、不要在经常调用的方法中创建对象,尤其忌讳在循环中创建对象
7、优化配置
内存溢出的解决方案是什么
1、从代码层面进行优化完善,尽量避免该情况发生
2、调整优化服务器配置 设置-Xms、-Xmx等
10.怎样实现一个线程安全的类
1.synchonized关键字修饰类
2.ThreadLocal保存数据和获取数据
private static final ThreadLocal threadSession = new ThreadLocal(); public static Session getSession() throws InfrastructureException { Session s = (Session) threadSession.get(); try { if (s == null) { s = getSessionFactory().openSession(); threadSession.set(s); } } catch (HibernateException ex) { throw new InfrastructureException(ex); } return s; }
11.了解那些锁 可重入锁说一下
重入锁
可重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响
就如同在饭堂打饭,你在窗口排着队。排到你的时候,突然路人A让你顺带着打个饭吧,然后你就打了两份饭,这时候你还没离开窗口,又有路人B让你打一份汤,于是你又额外打了一份汤
自旋锁
在另一个菜式比较好吃且热门的窗口,可不是这样的,在这里你在窗口,只能点一个菜(进入一次临界区),点完后,你想要再点别的菜,只能重新排一次队(虽然可以插队,当然我们可以引入服务员队伍管理机制:private Lock windows = new ReentrantLock(true);,指定该锁是公平的。)
读写锁
然而餐次的人流量一大,老板发现经常排起很长的队伍,厨师却都闲着没事干。老板拍脑子一想,这样不行啊,所以稍微改进了一下点餐方式。所有人都可以扫二维码用H页进行点餐,只要这个菜不是正在做(写锁),那么就可以随便点。
12.模板模式和策略模式的区别
例如大家所熟知的Spring Data模块,存在JDBCTemplate、RedisTemplate、MongoTemplate等均是典型的模板模式。又例如Spring MVC中各种处理handler,是典型的策略模式
模板模式一般只针对一套算法,注重对同一个算法的不同细节进行抽象提供不同的实现。而策略模式注重多套算法多套实现
策略模式的关注点更广,模板模式的关注点更深
1.你现在做的项目用到了什么框架与技术?
框架
spring boot、dubbo、spring cloud
技术
spring mvc 、spring、mybatis-plus、jwt、redis、zk、mq
2.我对微服务架构的一些看法和理解
3.对spring cloud 的了解
4.Redis为什么这么快?
1、完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);
2、数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的;
3、采用单线程,避免了不必要的上下文切换和竞争条件
4、使用多路I/O复用模型,非阻塞IO;
5、使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求;
5.Redis以什么数据结构存储?
字符串(String),散列(Hash),列表(List),集合(Set),有序集合(Sorted Set或者是ZSet)
1.jdk中哪些用到了乐观锁和悲观锁
乐观锁
CAS(比较和交换)
AtomicInteger
悲观锁
synchronized修饰