1、String、StringBuffer和StringBuilder的区别
String
是不可变对象,每次对其操作都等同于生成一个新的String
对象,每次操作后指针指向新的对象,当内存中存在较多无用的对象后,GC
就会开始工作,导致速度很慢,而StringBuffer
和StringBuilder
每次操作都是对自己本身进行操作,两个都是利用缓冲区,这样提升了速度,但是StringBuffer
是线程安全的,而StringBuilder
是非线程安全的,速度会快一些。创建String
对象时一般是会先在字符串常量区创建一个对象然后赋值,这里在类加载的时候是涉及到两个对象,但是在程序执行过程中是创建了一个对象。
2、GC的概念。循环引用的对象能否被回收?
GC
就是JVM
中的内存进行标记,判断哪些内存需要回收,根据一定的回收策略自动回收相关内存,防止出现内存泄漏的情况。循环应用的对象也是可以被回收的,因为GC
回收对象不仅仅考虑对象是否被引用,还要看对象是否被至少一个GC roots
对象直接或间接引用。这里GC roots
有:
a.每个线程当前的函数调用栈,从栈顶到栈底的每个函数里的局部变量
b.静态变量
c.被JNI
引用的变量
3、Java中的内存溢出是如何造成的?
(1)首先要知道Java
中的内存是如何管理的:在Java
程序中,我们通常使用new
为对象分配内存,而这些内存空间都在堆(Heap
)上。java
中对象之间的引用关系像一条链子,每分配一个新的对象,堆指针就会向后移动,当移动到内存的最终地址,内存就耗尽了,此时GC
就会参与进来回收不再使用的内存,当然回收的策略有很多。
(2)java
内存泄漏其实就是不再被使用的对象的内存不能被回收。比如一个类中维护了一个对象实例,而我们希望这个实例只作用于某个方法中,但是当这个方法运行完了之后此对象占用的内存是不会被释放的,只有在类创建的实例对象被释放后此对象才能被释放,严格来说这就是一种内存泄漏,解决方法就是将类中维护的实例放到方法中去维护,这样当方法执行完后此实例也会被释放。
(3)一般解决内存泄漏的方法就是尽量减小对象的作用域,对象不用后设置为null
,还有各类close
方法。如数据库连接、网络连接、IO
连接,单例也会造成内存泄漏,可以使用同步解决。
4、高并发下线程安全的单例模式
一般单例模式有饿汉式与懒汉式,但是在多线程中极易出现线程冲突,解决方法有很多,如对单例模式进行同步,推荐的方式是双检查锁机制,其实就是首先判断是否不为空,不为空直接获取;否则就需要同步,同步之后再加一个判空来实现。当然还有维护静态实例(static
和枚举都行)等方式。
5、异常机制
异常有很多,如文件找不到、网络连接失败等。异常Throwable
分为Exception
异常和Error
错误。Erro
是程序自己无法处理的,而Exception
是程序本身可以处理的异常。Exception
又分为IO
异常和RuntimeException
异常。而总的来说,异常分为可检查的异常,编译器要求必须处理;不可检查异常就是Error
和运行时异常。运行时异常都是RuntimeException
的子类。异常处理一般可以捕获和抛出,常见的运行时异常如NullPointerException UnknowTypeException、ClassNotFoundException
等。
6、HashMap中的key。
在jdk8
中key
是可以为null
的,但是不是所有对象都能作为key
,比如可变对象,当使用可变对象作为key
的时候很容易造成数据丢失,一般如果要将可变对象作为key
,一定要保证在修改其中的某些字段的时候保证其hashcode
值不变。
7、守护线程分为用户守护线程和Daemon守护线程。
只要当前JVM
中存在任何一个非守护线程没有结束,那么守护线程就工作,守护线程最典型的应用就是GC
。我们可以自己设置守护线程,但是必须在线程运行之前,我们不能将一个正在运行的线程设置为守护线程。
8、对SQL进行优化的原则
(1)使用索引来更快地遍历表
(2)不能用null
作索引
(3)EXISTS
要远比IN
的效率高
(4)在海量查询时尽量少用格式转换
(5)循环中不要使用变量
9、数据库存储引擎,存储数据结构
ISAM读取操作快,占用资源少,但是不支持事务和容错;
MYISAM使用表格索引机制,来优化多个并发的读写操作
INNODB支持对事务的处理,支持外来键
10、乐观锁、悲观锁
悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性,但这使得数据库开销太大,特别是长事物。乐观锁大多是基于数据库版本记录机制实现的,即为数据增加一个版本标识,读取数据时将版本号一同读出,对此版本号加一,然后当前版本数据进行对比,如果版本号大于当前的版本号,则更新,否则认为是过期数据。
java中的悲观锁和数据库中的悲观锁类似,而乐观锁是假设完成某项操作不会产生冲突,当在完成过程中发生冲突则重试,直到成功为止。
11、Mybatis的工作原理
查看笔记中内容。
12、IO(BIO)与NIO、AIO(NIO2)的区别,阻塞与非阻塞的区别
IO是同步阻塞式,就是每次只能为一个请求服务,每个请求在处理过程中会阻塞其他请求,当并发量较高时不可用,于是有了伪异步IO,这是用线程池来解决的。当某个请求没有得到响应,则会一直阻塞。
NIO是同步非阻塞式。使用全双工通道Channel和多路复用器Selector实现,可以同时进行读写操作,Selector会不断轮询注册在其上 通道,如果哪个通道准备好了就为其服务。
AIO是异步非阻塞式,AIO提供了异步通道,并提供了异步文件通道和异步套接字的实现,异步套接字时真正的异步非阻塞IO。这种IO的读写都是异步的。
13、海量数据分析
14、多线程
Hibernate一级和二级缓存,其他缓存,事物传播行为种类,如何实现申明式事务
restful的好处,有几种请求,表单如何提交put请求
web中安全问题的考虑如何防止,web系统整体架构
一、
1、hashmap、concurrenthashmap的底层实现和区别;
2、spring框架的原理
3、如何写一个orm框架
4、hibernate一级和二级缓存,其他缓存
5、hibernate事务传播行为种类
6、springmvc原理
7、restful的好处
8、restful有几种请求,表单如何提交put请求
9、web中安全问题的考虑,如何防止
10、web系统整体架构
11、hibernate如何实现声明式事务
12、java并发包
13、volatile
14、spring底层数据 结构
15、如何进行反射,如何提高反射的性能
16、如何实现java的代理,为什么需要实现接口
18、三次握手
19、springmvc有哪些注解
二、
1、什么是restful web service
2、并发集合
3、项目中使用的数据结构
4、TCP中断连接四次挥手
5、http和https
6、知道哪些锁
7、JVM内存
8、springcloud相关
网友评论