常见面试题

八大基本数据类型及长度
字节 字符
Byte​​​ 1​​8
Short​​ 2​​16
Int​​​ 4​​32
Long​​​ 8​​64
Float​​ 4 32
Double​​ 8​​64
Char​​​ 2​​16
Boolean
Java中final和static都是什么时候赋值的?
final修饰的实例属性,在实例创建的时候才会赋值。
static修饰的类属性,在类加载的准备阶段赋初值,初始化阶段赋值。

线程的状态
操作系统五个:新建、就绪、运行、阻塞、死亡
Java六个 :NEW(新建状态)、RUNNABLE(可运行状态)、BLOCKED(阻塞状态)、WAITING(无限等待)、TIMED_WAITING(计时等待状态)、TERMINATED(消亡状态)

创建线程的四种方式
Thread类
Runnable接口
Callable接口
线程池
底层核心都是Thread

线程和进程的区别
1.根本区别:进程是操作系统进行资源分配的最小单元,线程是操作系统进行运算调度的最小单元。
2.从属关系不同:进程中包含了线程,线程属于进程。
3.开销不同:进程的创建、销毁和切换的开销都远大于线程。
4.拥有资源不同:每个进程有自己的内存和资源,一个进程中的线程会共享这些内存和资源。5.控制和影响能力不同:子进程无法影响父进程,而子线程可以影响父线程,如果主线程发生异常会影响其所在进程和子线程。
6.CPU利用率不同:进程的CPU利用率较低,因为上下文切换开销较大,而线程的CPU的利用率较高,上下文的切换速度快。
7.操纵者不同:进程的操纵者一般是操作系统,线程的操纵者一般是编程人员。

ArrayList和LinkendList的区别
1、ArrayList的实现是基于数组,LinkedList的实现是基于双向链表。
2、对于随机访问,ArrayList优于LinkedList
3、对于插入和删除操作,LinkedList优于ArrayList
4、LinkedList比ArrayList更占内存,因为LinkedList的节点除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素。

List和set的区别
List可以包含重复元素,而Set包含唯一项。
List是一个有序集合,它维护插入顺序,而Set是一个无序集合,不保留插入顺序。
List接口包含一个遗留类:Vector类,而Set接口没有任何遗留类。
List接口可以允许n个null值,而Set接口只允许一个null值。

HashMap和HashTable的区别
1.线程安全性不同
HashMap是线程不安全的,HashTable是线程安全的,其中的方法是Synchronized,在多线程并发的情况下,可以直接使用HashTable,但是使用HashMap时必须自己增加同步处理。

2.是否提供contains方法
HashMap只有containsValue和containsKey方法;HashTable有contains、containsKey和containsValue三个方法,其中contains和containsValue方法功能相同。
3.key和value是否允许null值
Hashtable中,key和value都不允许出现null值。HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。
4.数组初始化和扩容机制
Hashtable扩容时,将容量变为原来的2倍加1,而HashMap扩容时,将容量变为原来的2倍。

HashMap的底层原理
HashMap 根据键的 hashCode 值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。
HashMap最多只允许一条记录的键为null,允许多条记录的值为 null。
HashMap 非线程安全,即任一时刻可以有多个线程同时写 HashMap,可能会导致数据的不一致。如果需要满足线程安全,可以用 Collections 的 synchronizedMap 方法使 HashMap 具有线程安全的能力,或者使用 ConcurrentHashMap。
JAVA7 实现大方向上,HashMap 里面是一个数组,然后数组中每个元素是一个单向链表。Java8 对 HashMap 进行了一些修改,最大的不同就是利用了红黑树,所以其由 数组+链表+红黑树 组成。当链表中的元素超过了 8 个,数组元素超过64以后,会将链表转换为红黑树。

ConcurrentHashMap的扩容机制
1.7版本
1.1.7版本的ConcurrentHashMap是基于Segment分段实现的
2.每个Segment相对于一个小型的HashMap
3.每个Segment内部会进行扩容,和HashMap的扩容逻辑类似
4.先生成新的数组,然后转移元素到新数组中
5.扩容的判断也是每个Segment内部单独判断的,判断是否超过阈值
1.8版本
1.1.8版本的ConcurrentHashMap不再基于Segment实现
2.当某个线程进行put时,如果发现ConcurrentHashMap正在进行扩容那么该线程一起进行扩容
3.如果某个线程put时,发现没有正在进行扩容,则将key -value添加到ConcurrentHashMap中,然后判断是否超过阈值,超过了则进行扩容
4. ConcurrentHashMap是支持多个线程同时扩容的
5.扩容之前也先生成一个新的数组
6.在转移元素时,先将原数组分组,将每组分给不同的线程来进行元素的转移,每个线程负责一组或多组的元素转移工作

JVM 运行时数据存储区域
堆、栈、方法区、本地方法栈、程序计数器

JVM类加载过程
加载:将字节码所代表的静态存储结构转化为方法区的运行时数据结构。
验证:验证字节码格式,确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。
准备:创建类或者接口的静态字段,并为静态变量设置初始值。
解析:将常量池内的符号引用替换为直接引用。
初始化:执行类构造器方法。

JVM调优
1、 堆大小设置
2、 回收器选择(串行收集器、并行收集器、并发收集器)
吞吐量优先的并行收集器
响应时间优先的并发收集器
3、 辅助信息
JVM提供了大量命令行参数,打印信息,供调试使用
4、 常见配置
堆设置
收集器设置
垃圾回收统计设置
并行收集器设置
并发收集器设置

JVM垃圾回收机制
Minor GC
对新生代进行回收,不会影响到老年代。因为新生代的 Java 对象大多死亡频繁,所以 Minor GC 非常频繁,一般在这里使用速度快、效率高的算法,使垃圾回收能尽快完成。
Full GC
也叫 Major GC,对整个堆进行回收,包括新生代和老年代。由于Full GC需要对整个堆进行回收,所以比Minor GC要慢,因此应该尽可能减少Full GC的次数,导致Full GC的原因包括:老年代被写满、永久代(Perm)被写满和System.gc()被显式调用等。

Spring常用的三种注入方式
1、构造方法注入(实体类)
2、setter注入
3、基于注解的注入:autowire主要有三个属性值:constructor,byName,byType。
主要有四种注解可以注册bean,每种注解可以任意使用,只是语义上有所差异:
@Component:可以用于注册所有bean
@Repository:主要用于注册dao层的bean
@Controller:主要用于注册控制层的bean
@Service:主要用于注册服务层的bean
描述依赖关系主要有两种:
@Resource:java的注解,默认以byName的方式去匹配与属性名相同的bean的id,如果没有找到就会以byType的方式查找,如果byType查找到多个的话,使用@Qualifier注解(spring注解)指定某个具体名称的bean
@Autowired:spring注解,默认是以byType的方式去匹配与属性名相同的bean的id,如果没有找到,就通过byName的方式去查找

Spring中的Bean创建的生命周期
1.推断构造方法
2.实例化
3.填充属性,也就是依赖注入
4. 处理Aware回调
5.初始化前,处理@PostConstruct注解
6.初始化,处理InitializingBean接口
7.初始化后,进行AOP。
Spring BeanDefinition的作用
BeanDefinition是描述bean的一个接口。
AnnotatedBeanDefinition继承了BeanDefiniton并新增了两个方法,getMetadata和getFactoryMethodMetadata。接口用于解析注解的bean

SpringBoot自动装配原理
1、程序入口通过@SpringBootApplication注解修饰的一个类
2、@EnableAutoConfiguration注解
3、@Import(AutoConfigurationImportSelector.class)这个注解就是用于自动导入AutoConfigurationImportSelector这个类
4、通过application.properties.yml配置文件配置的<key,value>键值对属性是通过相关联的某个AutoConfiguration类
5、ServletWebServerFactoryAutoConfiguration类通过@EnableConfigurationProperties这个注解来将配置文件中的属性注入到ServerProperties中
6、这个ServerProperties类的属性注入完成之后,又加载到了ServletWebServerFactoryAutoConfiguration类中,然后在SpringBoot启动时就可以获取到配置的端口号了

Spring Boot中常用注解及其底层实现
1.@SpringBootApplication注解:这个注解标识了一个SpringBoot工程,它实际上是另外三个注解的组合,这三个注解是
a.@SpringBootConfiguration:这个注解实际就是一个@Configuration,表示启动类也是一个配置类
b.@EnableAutoConficuration:向Spring容器中导入了一个Selector,用来加载Clesspath 下SpringFactories中所定义的自动配置类,将这些自动加载为配置Bean
c.@ComponentScan:标识扫描路径,因为默认是没有配置实际扫描路径,所以SpringBoot扫描的路径是启动类所在的当前目录
2.@Bean注解:用来定义Bean,类似于XML中的bean>标签,Spring在启动时,会对加了@Beanm注解的方法进行解析,将方法的名字做为beanName,并通过执行方法得到bean对象
3.@Controller、@Service、@ResponseBody、@Autowired都可以说

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShanHai山海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值