java面试题目汇总
- 一:java初级篇
- 1:== 和equal的区别底层原理:
- 2:String和StringBuffer StringBuilder 的区别底层原理和各自使用场景:
- 3:cookie的和session的联系:禁用cookie之后有有什么后果可以实现session吗?
- 4:freemarker的模板后缀是什么:
- 5:单例模式是线程安全的吗?如何修改为多例
- 6:编码格式之间的区别(UTF-8 和UTF-16):
- 7:锁有哪些:Synchronized和lock哪些区别;解释CAS
- 8:hashmap的底层原理;详细解释红黑树的原理**
- 9:ArrayList和Linklist的区别
- 10:接口和抽象类的区别:
- 11:Hashmap和Hashtable和ConcurrentHashMap的区别和联系
- 13:聊一下maven加载jar包的顺序:
- 14:手机电话号等怎样做前后端交互的;如果要实现一个需求对外界所有的敏感信息都进行加密改如何设计;
- 15:object有哪些方法
- 16:Array和ArrayList的区别
- 17:类加载顺序
- 18:start和run的区别
- 19:java创建对象的方法
- 20:实例化加载顺序
- 21:get和post的区别
- 22:跨域的解决办法
- 23:乐观锁和悲观锁
- 24:死锁的解决办法和产生原因
- 25:讲一讲NIO BIO AIO
- 26:深copy和浅copy的区别
- 二:Spring&SpringMVC篇
- 1:怎样声明一个bean
- 2:怎样修改bean的作用域
- 3:怎末注入Bean:有哪些方式
- 4:怎样定义一个切面:有哪些标签;有哪些代理
- 5:线程池原理:如何启动一个线程;几种方式;线程池有哪些参数
- 6:bean和beanFactory和FactoryBean和ApplicationContext;那些关系 那些联系
- 7:bean是如何注入到后台的:
- 8:什么是SpringDateJPA
- 9:spring事务传播方式
- 10:SpringMVC的启动原理
- 三:SpringBoot篇
- 1:SpringBoot的启动过程原理
- 2:SpringBoot优点
- 四:redis篇
- 1:如何保证原子性:
- 2:redis的管道技术:
- 3:聊一下redis的集群模式
- 4:聊一下 set和zset的区别
- 4:如何做到数据不丢失:RDB 和AOP 线上是这样操作的吗?
- 5:聊一下雪崩和缓存穿透问题解决方案
- 6:redis的模式有哪些?redis的主节点挂掉如何解决
- 五:nginx篇
- 1:配置文件怎样配置;做到请求轮训的
- 2:nginx还有那些用处
- 六:mybatis&&hibernate篇
- 1:Btree和B+tree的区别:
- 2:索引的级别:
- 3:索引的种类:
- 4:如何选择索引:
- 5:sql如何调优:
- 6:如何设计表结构;需要注意哪些点;数据库三范式:
- 7:一级缓存;二级缓存理解
- 8:JPA和hibernate的关系:
- 9:mybatis和hibernate的区别:
- 七:命令篇
- 1:查看那个端口被禁用**
- 2:查看端口使用情况
- 3:查看命令前几行
- 八:消息篇
- 1:activemq的消息消费形式那些
- 2:如何保证数据不丢失 详细解释ack原理
- 3:如何保证顺序消费:
- 4:如何保证幂等性问题
- 5:rabbit有几种广播方式
- 九:git篇
- 1:怎样拉去一个分支;
- 十:JVM篇
- 1:jvm的参数有哪些
- 2:jvm有哪些区
- 3:JVM加载class的顺序
- 3:年轻代与年老代的区别联系;8:1:1的理解
- 十一:focker篇
- 1:如何拉取一个镜像
- 2:如何创建一个镜像
- 3:如何启动一个镜像;需要哪些参数
以下是本人面试被问到的问题,我自己总结的答案。如有问题请评论我,鄙人仔细改正。如果帮到您,请收藏哟,本人博客永久更新。
一:java初级篇
1:== 和equal的区别底层原理:
答:==当为基本数据类型时比较的是对象的值是否一样,当作为引用数据类型时,则比较的是内存地址
equals方法不能作用于基本数据类型的变量,equals继承Object类,比较的是是否是同一个对象。如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
举例子:
String a="a";
String b=new String("a");
String d=new String("a");
System.out.println(a==b);//false
System.out.println(a.equals(b));//true
System.out.println(a==d);//false
System.out.println(a.equals(d));//true
2:String和StringBuffer StringBuilder 的区别底层原理和各自使用场景:
String字符串属于对象,每次就行修改都会在堆内存开辟新的对象非常,因此非常耗费性能
StringBuffer和StringBuilder 可以对对象进行多次修改,不会产生心的对象,两者的区别就是,StringBuilder 是线程不安全的,但是StringBuilder 有速度的优势。
3:cookie的和session的联系:禁用cookie之后有有什么后果可以实现session吗?
cookie是保存在浏览器端不安全的。
session是储存在服务器端但是访问量增多话会损耗服务器的性能。单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
4:freemarker的模板后缀是什么:
ftl
5:单例模式是线程安全的吗?如何修改为多例
不安全的,修改作用域
6:编码格式之间的区别(UTF-8 和UTF-16):
7:锁有哪些:Synchronized和lock哪些区别;解释CAS
前者是锁住的方法和代码块 ,是托管给JVM来进行管理,解锁上锁都是内部控制的。
后者是需要指定开始位置和结束位置,lock的代码块来进行处理的,lock的解锁必须手动在fianlly中释放,避免引起死锁。
8:hashmap的底层原理;详细解释红黑树的原理**
9:ArrayList和Linklist的区别
arraylist底层是数组结构:对get和set的调用花费较小,缺点是新项的插入和现有项的删除代价昂贵
linklist底层是双链结构:新项的插入和现有项的删除均开销很小,这里假设变动项的位置是已知的。
10:接口和抽象类的区别:
1.抽象类与接口定义不同:抽象类abstract class ,接口 interface
2.接口里只能包含抽象方法,不包含已经实现的方法;抽象类则完全可以包含普通的方法。
3.接口里不能定义静态方法;抽象类可以定义静态方法
4.接口里只能定义静态常量属性,不能定义普通属性;抽象类里既可以定义普通属性,也可以定义静态常量
5.接口不包含构造函数;抽象类可以包含构造函数,抽象类里的构造函数并不是用于创建对象,而是让其子类调用这些构造函数来完成属于抽象类的初始化操作。
6.接口不包含初始化块,但抽象类可以包含初始化块
7.一个类最多只能有一个直接父类,包括抽象类;但一个类可以直接实现多个接口,通过实现多个接口可以弥补Java的单继承不足
11:Hashmap和Hashtable和ConcurrentHashMap的区别和联系
hashmap不是线程安全的,地层是node数组,key可以为null;jdk1.8之前底层结构是数组+链表,jdk1.8之后使用了数组+链表/红黑树
hashtable是线程安全的,key不能为null;默认的初始大小为11,之后每次扩充,容量变为原来的2n+1
底层采用分段的数组+链表实现,线程安全
通过把整个Map分为N个Segment,可以提供相同的线程安全,但是效率提升N倍,默认提升16倍。(读操作不加锁,由于HashEntry的value变量是 volatile的,也能保证读取到最新的值。)
13:聊一下maven加载jar包的顺序:
14:手机电话号等怎样做前后端交互的;如果要实现一个需求对外界所有的敏感信息都进行加密改如何设计;
15:object有哪些方法
16:Array和ArrayList的区别
ArrayList可以存储异构对象,而Array只能存储相同数据类型的数据。
Array的长度实际上是不可变的,ArrayList的长度既可以指定(即使指定了长度,也会自动2倍扩容)也可以不指定,是变长的。
17:类加载顺序
加载–>验证–>准备–>解析–>初始化
18:start和run的区别
使用start()方法具有异步执行的效果,而使用run()方法是同步执行的效果,运行结果中规中矩。
使用start()方法,是真的启动了相应的线程,而使用run()方法并没有真的启动线程,而是由一个叫main的主线程去调用的run()方法。
所以,正确启动线程的方式是使用start()方法。
19:java创建对象的方法
new创建对象
反射的机制创建对象
采用clone
序列化机制
20:实例化加载顺序
当创建类对象时,先初始化静态变量和静态块,然后是非静态变量和非静态代码块,然后是构造器。由于静态成员只会被初始化一次,所以如果静态成员已经被初始化过,将不会被再次初始化
21:get和post的区别
get是从服务器上获取数据,post是向服务器传送数据。
get传送的数据量较小,不能大于2KB,post传送的数据量较大,一般被默认为不受限制。
get安全性非常低,post安全性较高。
22:跨域的解决办法
23:乐观锁和悲观锁
原子性
一致性
持久性
隔离性
24:死锁的解决办法和产生原因
25:讲一讲NIO BIO AIO
26:深copy和浅copy的区别
二:Spring&SpringMVC篇
1:怎样声明一个bean
@Component 没有明确角色的组件
@Service 在业务逻辑层(Service层)使用
@Repositpry 在数据访问层(dao层)使用
@Controller 用于标注控制层组件
@RestController
2:怎样修改bean的作用域
@Scope标签
有五个作用域
singleton单例模式:Spring 容器中有且只有一个Bean实例,只要Spring容器不销毁或退出,该Bean实例就会一直存活
prototype原型模式:每次获取Bean的时候会有一个新的实例,Spring容器不能对返回Bean实例的整个生命周期负责
request:request只适用于Web程序,每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效,当请求结束后,该对象的生命周期即告结束
session:session只适用于Web程序,session作用域表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效
application:application只适用于Web程序,全局作用域
3:怎末注入Bean:有哪些方式
1:属性注入:属性注入要求bean提供一个默认的构造函数,并且得为需要注入的属性提供set方法。
2:构造函数注入:bean必须提供带参的构造函数。
3:使用Filed注入(用于注解方式).@Resource或者@Autowired、
4:怎样定义一个切面:有哪些标签;有哪些代理
@Aspect定义切点类
@Pointcut定义切点
/**
* 使用注解定义切面
*/
@Aspect
public class UserServiceLogger {
private static final Logger log = Logger.getLogger(UserServiceLogger.class);
@Pointcut("execution(* service.UserService.*(..))")
public void pointcut() {}
@Before("pointcut()")
public void before(JoinPoint jp) {
log.info("调用 " + jp.getTarget() + " 的 " + jp.getSignature().getName()
+ " 方法。方法入参:" + Arrays.toString(jp.getArgs()));
}
@AfterReturning(pointcut = "pointcut()", returning = "returnValue")
public void afterReturning(JoinPoint jp, Object returnValue) {
log.info("调用 " + jp.getTarget() + " 的 " + jp.getSignature().getName()
+ " 方法。方法返回值:" + returnValue);
}
}
5:线程池原理:如何启动一个线程;几种方式;线程池有哪些参数
继承Thread;
实现Runnable接口;
使用线程池创建
避免使用Executors创建线程池,主要是避免使用其中的默认实现,那么我们可以自己直接调用ThreadPoolExecutor的构造函数来自己创建线程池。在创建的同时,给BlockQueue指定容量就可以了。
public class ExecutorsDemo {
private static ThreadFactory namedThreadFactory = new ThreadFactoryBuilder()
.setNameFormat("demo-pool-%d").build();
private static ExecutorService pool = new ThreadPoolExecutor(5, 200,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(1024), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy());
public static void main(String[] args) {
for (int i = 0; i < Integer.MAX_VALUE; i++) {
pool.execute(new SubThread());
}
}
}
6:bean和beanFactory和FactoryBean和ApplicationContext;那些关系 那些联系
BeanFactory 以Factory结尾,表示它是一个工厂类,用于管理Bean的一个工厂 在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)来进行管理的。
但对FactoryBean而言,这个Bean不是简单的Bean,而是一个能生产或者修饰对象生成的工厂Bean,
它的实现与设计模式中的工厂模式和修饰器模式类似。
ApplicationContext:
应用上下文,继承BeanFactory接口,它是Spring的一各更高级的容器,提供了更多的有用的功能;
- 国际化(MessageSource)
- 访问资源,如URL和文件(ResourceLoader)
- 载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层
- 消息发送、响应机制(ApplicationEventPublisher)
- AOP(拦截器)
BeanFactory在启动的时候不会去实例化Bean,中有从容器中拿Bean的时候才会去实例化;
ApplicationContext在启动的时候就把所有的Bean全部实例化了。它还可以为Bean配置lazy-init=true来让Bean延迟实例化;
7:bean是如何注入到后台的:
后要是默认hashmap形式储存到后台的,key=bean的name value为bean的对象
8:什么是SpringDateJPA
操作数据库的规范
9:spring事务传播方式
Propagation.required:如果当前存在事务,则加入该事务,如果当前不存在事务,则创建一个新的事务。
Propagation.supports:如果当前存在事务,则加入该事务;如果当前不存在事务,则以非事务的方式继续运行。
Propagation.mandatory
如果当前存在事务,则加入该事务;如果当前不存在事务,则抛出异常。
Propagation.requires_new
重新创建一个新的事务,如果当前存在事务,延缓当前的事务。
Propagation.not_supported
以非事务的方式运行,如果当前存在事务,暂停当前的事务。
Propagation.never
以非事务的方式运行,如果当前存在事务,则抛出异常。
Propagation.nested
如果没有,就新建一个事务;如果有,就在当前事务中嵌套其他事务。
10:SpringMVC的启动原理
三:SpringBoot篇
1:SpringBoot的启动过程原理
2:SpringBoot优点
1:内嵌servlet容器
2:提供starter简化Maven配置
3:自动装配Spring
4:SpringBoot提供基于http ssh telnet对运行时的项目进行监控。
5:无代码生产和xml配置
四:redis篇
1:如何保证原子性:
调用SETNX命令对某个键进行加锁
2:redis的管道技术:
3:聊一下redis的集群模式
4:聊一下 set和zset的区别
4:如何做到数据不丢失:RDB 和AOP 线上是这样操作的吗?
5:聊一下雪崩和缓存穿透问题解决方案
读库之后回写数据,添加超时时间方式缓存穿透问题,雪崩问题
6:redis的模式有哪些?redis的主节点挂掉如何解决
主从模式:
1、每个客户端连接redis实例的时候都是指定了ip和端口号的,如果所连接的redis实例因为故障下线了,而主从模式也没有提供一定的手段通知客户端另外可连接的客户端地址,因而需要手动更改客户端配置重新连接
2、主从模式下,如果主节点由于故障下线了,那么从节点因为没有主节点而同步中断,因而需要人工进行故障转移工作
3、无法实现动态扩容
哨兵模式:
被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器
redis cluster模式
五:nginx篇
1:配置文件怎样配置;做到请求轮训的
2:nginx还有那些用处
六:mybatis&&hibernate篇
1:Btree和B+tree的区别:
Btree:
(1)所有键值分布在整个树中
(2)任何关键字出现且只出现在一个节点中
(3)搜索有可能在非叶子节点结束
(4)在关键字全集内做一次查找,性能逼近二分查找算法
B+tree
(1)所有关键字存储在叶子节点,非叶子节点不存储真正的data
(2)为所有叶子节点增加了一个链指针
2:索引的级别:
system > const > eq_ref > ref > range > index > All
3:索引的种类:
全文索引;唯一索引;主键索引;组合索引;普通索引
4:如何选择索引:
5:sql如何调优:
6:如何设计表结构;需要注意哪些点;数据库三范式:
1:单个字段不能拆分
2:确保表中的每列都和主键相关
3:确保每列都和主键列直接相关,而不是间接相关
7:一级缓存;二级缓存理解
8:JPA和hibernate的关系:
JPA就是一个接口;hibernate是他的实现
9:mybatis和hibernate的区别:
1:hibernate是全自动,而mybatis是半自动。
2. hibernate数据库移植性远大于mybatis。
3. sql直接优化上,mybatis要比hibernate方便很多
mybatis:小巧、方便、高效、简单、直接、半自动
hibernate:强大、方便、高效、复杂、绕弯子、全自动
七:命令篇
1:查看那个端口被禁用**
netstat -anp |grep 端口
2:查看端口使用情况
netstat -nultp
3:查看命令前几行
grep -A 10 ‘123’ test.log //打印匹配行的后10行
grep -B 10 ‘123’ test.log//打印匹配行的前10行
八:消息篇
1:activemq的消息消费形式那些
集群消费
广播消费
2:如何保证数据不丢失 详细解释ack原理
3:如何保证顺序消费:
1.Producer端保证发送消息有序,且发送到同一个队列。
2.consumer端保证消费同一个队列。
4:如何保证幂等性问题
5:rabbit有几种广播方式
九:git篇
1:怎样拉去一个分支;
十:JVM篇
1:jvm的参数有哪些
2:jvm有哪些区
JAVA栈
本机方法栈
程序计数器
堆
方法区
3:JVM加载class的顺序
3:年轻代与年老代的区别联系;8:1:1的理解
Edon:S0:S1比例为8:1:1当S0或者S1区满时候进行一次minGC这时到年老带,当年老带满时进行fullGC
常用的计数器算法为:
标记清楚算法
标记整理算法
分带垃圾回收算法
复制算法
十一:focker篇
1:如何拉取一个镜像
2:如何创建一个镜像
3:如何启动一个镜像;需要哪些参数