![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java面试题
猴子奔跑
这个作者很懒,什么都没留下…
展开
-
线程池的核心参数以及线程池的工作流程
序号 参数 说明 1 corePoolSize 核心线程数量 2 maximumPoolSize 最大线程数量 3 keepAliveTime 当前线程数量超过最大线程数量,空闲线程最大存活时间 4 unit keepAliveTime的时间单位 5 workQueue 任务队列 6 threadFactory 线程工厂,用于创建线程 7 handler 由于线程任务过多或者其他原因导原创 2021-06-18 21:23:51 · 1666 阅读 · 0 评论 -
Java单例模式
单例模式的设计是保证了一个类在整个系统中同一时刻只有一个实例存在,主要是被用于一个全局类的对象在多个地方被使用并且对象的状态是全局变化的场景下。单例模式为系统资源的优化提供了一个很好的思路,频繁创建和销毁对象都会增加系统的资源消耗,单例模式很好的节约了资源。1️⃣不安全类public class UnsafeLazyInitialization { private static UnsafeLazyInitialization instance; //加上Synchronized来保证原创 2021-06-16 22:45:05 · 2036 阅读 · 1 评论 -
JVM类加载过程
**加载:**将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区中的运行时数据结构,在堆中生成一个代表这个类的java.lang.Class对象,作为方法区类数据的访问入,这个过程需要类加载器参与。连接: 将java类的二进制代码合并到JVM的运行状态之中验证:确保加载的类信息符合JVM规范,没有安全方面的问题准备:在方法区为类变量分配内存空间并设置类中变量的初始值**注意:**如果是final修饰的变量,会在准备阶段就将变量初始化为value值;如果没有fin...原创 2021-06-07 21:52:57 · 1281 阅读 · 0 评论 -
Java对象的创建过程
加载检查:首先虚拟机在遇到一条new指令的时候,会去检查这个指令的参数在常量池中是否可以定位到这个类的符号引用,并且检查该类是否被加载、解析、初始化过,如果没有就执行类的加载过程。**分配内存:**加载检查完就会为新生对象分配内存。分配内存的方式有两种:1️⃣指针碰撞 2️⃣空闲列表(选择哪一种内存分配方式取决于堆内存是否完整,而堆内存是否完整又取决于用了哪一种GC算法)指针碰撞的分配方式适用于内存规整的情况下,即GC算法采用了标记-清除-压缩算法,或者复制算法,因为在内存规整的情况下,已用内存...原创 2021-06-07 18:18:19 · 1452 阅读 · 2 评论 -
JVM分为哪几部分?
JDK1.8之前: JDK1.8: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CptavYim-1623059396709)(C:\Users\Venture\Desktop\Java\笔记文档\2022秋招面试题准备.asset原创 2021-06-07 17:50:31 · 2956 阅读 · 2 评论 -
HashMap在并发情况下出现死循环的问题?
HashMap的数据结构: HashMap是用一个指针数组(假设为table[])来做分散所有的key,当一个key被加入时,会通过Hash算法通过key算出这个数组的下标i,然后就把这个<key, value>插到table[i]中,如果有两个不同的key被算在了同一个i,那么就叫冲突,又叫碰撞,这样会在table[i]上形成一个链表。我们知道,如果table[]的尺寸很小,比如只有2个,如果要放进10个keys的话,那么碰撞非常频繁,于是一个O(1)的查找算法,就变成了链表遍历,性能原创 2021-05-28 15:44:52 · 1456 阅读 · 0 评论 -
说说你对HashMap的理解?
HashMap是一种存取高效但是不保证有序的常用容器。它的数据结构为“数组+链表”,这是解决哈希冲突的产物(链地址法)。它实现了Map接口,采用KEY-VALUE键值对的形式存储数据,并且实现了浅拷贝和序列化。 HashMap 的默认初始大小为16,初始化大小必须为2的幂,最大大小为2的30次方。数组中存储的链表节点为Entry数组,在jdk1.8源码中将Entry改为了Node,它们都实现了Map下的Entry接口。HashMap 的阈值默认为“容量*0.75f”,当存储节点数量超过该值,则对m原创 2021-05-28 11:48:07 · 1767 阅读 · 0 评论 -
HashMap源码分析hash函数(扰动函数)
JDK1.7的hash()方法(扰动函数):final int hash(Object k) { int h = hashSeed; if (0 != h && k instanceof String) { return sun.misc.Hashing.stringHash32((String) k); } h ^= k.hashCode(); // This function e原创 2021-05-25 21:42:49 · 2034 阅读 · 1 评论 -
String、StringBuffer、StringBuilder的区别?
public final class String implements java.io.Serializable, Comparable<String>, CharSequence {} public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence{}public final class StringBuil.原创 2021-05-23 21:56:30 · 1303 阅读 · 0 评论 -
#{}和${}的区别是什么?(Mybatis怎么防止SQL注入?)
属于静态文本替换,比如{}属于静态文本替换,比如属于静态文本替换,比如{driver}会被替换为com.mysql.jdbc.driver#{}是SQL的占位符,Mybatis会将SQL中的#{}替换为?,在 sql 执⾏前会使⽤PreparedStatement 的参数设置⽅法,按序给 sql 的?号占位符设置参数值。因此,#{}与${}相比,#{}可以很大程度的防止sql注入,因为对sql做了预编译处理,因此在使用中一般使用#{}方式。...原创 2021-05-23 21:51:42 · 1453 阅读 · 0 评论 -
Spring MVC中的控制器是不是单例模式?如果是,如何保证线程安全?
控制器是单例模式。单例模式下会出现线程安全问题。 Spring中保证线程安全的方法:将scope设置成非singleton。但是这样会有一些问题,当并发很大的时候如果每次都生成一个bean的话就会有很多实例。最好的方式是将controller控制器设置成无状态...原创 2021-05-22 22:39:00 · 4017 阅读 · 0 评论 -
Spring如何处理事务
Spring当中支持编程式事务和声明式事务**编程式事务:**通过Transaction Template手动管理事务,硬编码 ,实际应用中很少使用。声明式事务(基于XML和注解): 推荐使用(代码侵入性最小),实际是通过AOP实现。优点:不需要在业务代码中添加事务管理的代码,只需要在配置文件中做相应的事务规则就行。缺点:声明式事务只能针对方法级别,无法控制代码级别的事务管理。Spring中事务传播级别:public enum Propagation { REQUIRED(T原创 2021-05-22 22:25:24 · 1525 阅读 · 0 评论 -
什么是Spring?谈谈你对IOC和AOP的理解
Spring是一个企业级Java应用框架,它的作用主要是简化软件的开发流程以及配置过程,简化项目部署环境。 Spring的优点: 1、Spring的低侵入式设计,对业务代码的污染非常低。 2、Spring的DI机制将对象之间的关系交由框架处理,减少组件之间的耦合。 3、Spring提供了AOP技术,支持将一些通用的功能进行集中式管理,从而提供更好的复用。 4、Spring对于主流框架提供了非常好的支持。IOC:将创建对象的控制权交给Spring来进行管理。简单的来说就是应原创 2021-05-22 20:43:15 · 1929 阅读 · 0 评论 -
Spring容器的启动流程是怎么样的?
使用AnnotationConfigApplicationContext跟踪启动流程:public AnnotationConfigApplicationContext(Class<?>... componentClasses) { this();//初始化reader()和scanner() register(componentClasses);//使用scanner组件来扫描basePackage包下的所有对象,将配置类的BeanDefinition注册到容器中 refresh原创 2021-05-22 20:41:28 · 1422 阅读 · 0 评论 -
Spring框架中Bean的创建过程是怎样的?
首先,简单来说,Spring框架的Bean经过四个阶段:实例化–>属性赋值–>初始化–>销毁 具体来说,Spring经过了以下几个步骤: 1.实例化:new xxx();两个时机:1、当客户端向容器申请一个bean时;2:当容器在初始化一个bean时发现还需要依赖另一个bean。BeanDefinition对象保存。 2.属性对象赋值(依赖注入):Spring通过BeanDefinition找到对象依赖的其他对象,并将这些对象赋予当前对象。 3.处理Aware接口:S原创 2021-05-22 20:38:59 · 1724 阅读 · 0 评论 -
Spring框架中的Bean是线程安全的吗?如果线程不安全,要如何处理?
Spring容器本身没有提供Bean的线程安全策略,因此,也可以说Spring容器中的bean不是线程安全的。 如何处理线程安全问题,分情况讨论: Spring的作用域(scope):singleton:单例,默认作用域。prototype:原型,每次创建一个新对象。request:请求,每次Http请求创建一个新对象,适用于WebApplicationContext环境下。session:会话,同一个会话共享一个实例,不同会话使用不用的实例。global-sessi原创 2021-05-22 20:37:26 · 8529 阅读 · 5 评论 -
Spring如何处理循环依赖问题?
Spring使用了三级缓存来解决循环依赖的问题。三级缓存:Spring在启动的过程中,使用到了三个map,称作三级缓存。public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry { /** Maximum number of suppressed exceptions to preserve. */ private static final int原创 2021-05-22 18:54:30 · 1246 阅读 · 0 评论 -
为什么我们调⽤ start() ⽅法时会执⾏ run() ⽅法,为什么我 们不能直接调⽤ run() ⽅法?
new ⼀个 Thread,线程进⼊了新建状态。调⽤ start() ⽅法,会启动⼀个线程并使线程进⼊了就绪状态,当分配到时间⽚后就可以开始运⾏了。 start() 会执⾏线程的相应准备⼯作,然后⾃动执⾏ run() ⽅法的内容,这是真正的多线程⼯作。 但是,直接执⾏ run() ⽅法,会把 run()⽅法当成⼀个 main 线程下的普通⽅法去执⾏,并不会在某个线程中执⾏它,所以这并不是多线程⼯作。总结: 调⽤ start() ⽅法⽅可启动线程并使线程进⼊就绪状态,直接执⾏ run() ⽅法的话不会以多原创 2021-03-16 21:37:25 · 1494 阅读 · 1 评论 -
Java面试文章整理
1、可见性(Visibility)可见性是指,当一个线程修改了某一个全局共享变量的数值,其他线程是否能够知道这个修改。显然,在串行程序来说可见性的问题是不存在的。因为你在任何一个地方操作修改了某个变量,那么在后续的程序里面,读取这个变量的数值,一定是修改后的数值。但是,这个问题在并行程序里面就不见得了。在并行程序里面,如果一个线程修改了某一个全局变量,那么其他线程未必可以马上知道这个变动。下面的图1展示了可见性问题的一种。如果在CPU1和CPU2上...原创 2021-03-13 14:13:47 · 1269 阅读 · 0 评论 -
面试题2 java静态方法与非静态方法的区别
转载博客:https://www.cnblogs.com/pretty-boy/p/3177494.html● 生命周期(Lifecycle):静态方法(Static Method)与静态成员变量一样,属于类本身,在类装载的时候被装载到内存(Memory),不自动进行销毁,会一直存在于内存中,直到JVM关闭。非静态方法(Non-Static Method)又叫实例化方法,属于实例对象,实例化后才会分配内存,必须通过类的实例来引用。不会常驻内存,当实例对象被JVM 回收之后,也跟着消失。● 在...转载 2021-03-11 11:37:58 · 1267 阅读 · 0 评论 -
面试问题1 array与ArrayList的区别
参考博客:https://www.cnblogs.com/wqbin/p/11185400.html ArrayList内部是由一个array实现的。如果你知道array和ArrayList的相似点和不同点,就可以选择什么时候用array 或者使用ArrayList , array提供 O(1)的查找性能和很基本的方式去存储数据。ArrayList是Java集合框架类的一员,可以称它为一个动态数组。array是静态的,所以一个数据一旦创建就...转载 2021-03-11 11:35:14 · 1309 阅读 · 0 评论