春招面试高频考点 -JAVA后端
文章整理了春招过程遇到的各类题目,题目详解持续整理中
JAVA
-
spring类型为什么要设置为不可变,以及是如何实现的不可变?
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[]; }
String类的值是保存在value数组中的,并且是被private final修饰的
private修饰,表明外部的类是访问不到value的,同时子类也访问不到,当然String类不可能有子类,因为类被final修饰了 final修饰,表明value的引用是不会被改变的,而value只会在String的构造函数中被初始化,而且并没有其他方法可以修改value数组中的值,保证了value的引用和值都不会发生变化 final关键字的作用有如下几种
final修饰类时,表明这个类不能被继承 final修饰方法,表明方法不能被重写 final修饰变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能改变;如果是对象类型的变量,只能保证它的引用不变,但对象的内容是可以改变的 在Java中数组也是对象,数组即使被final修饰,内容还是可以改变的
所以我们说String类是不可变的。
-
Java中代码运行是怎样被编译成运行的代码?
Java 源码编译由以下三个过程组成: 分析和输入到符号表 注解处理 语义分析和生成class文件
-
ArrayList、LindedList有什么区别
ArrayList和LinkedList都实现了List接口,有以下的不同点: 1、ArrayList是基于索引的数据接口,它的底层是数组。它可以以O(1)时间复杂度对元素进行随机访问。与此对应,LinkedList是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是O(n)。 2、相对于ArrayList,LinkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。 3、LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。
-
那我们如何去实现一个插入删除,遍历速度都比较快的数据结构? 红黑树
-
这两个是线程不安全,那我们可以用什么线程安全的list呢
1、用Vector,这种目前已经不怎么用了 2、SynchronizedList java.util.Collections.SynchronizedList它能把所有 List 接口的实现类转换成线程安全的List,比 Vector 有更好的扩展性和兼容性,很可惜,它所有方法都是带同步对象锁的,和 Vector 一样,它不是性能最优的 3、CopyOnWriteArrayList CopyOnWrite(简称:COW):即复制再写入,就是在添加元素的时候,先把原 List 列表复制一份,再添加新的元素。
-
如何调节java程序的内存大小
-Xmx Java Heap最大值,默认值为物理内存的1/4,最佳设值应该视物理内存大小及计算机内其他内存开销而定;
-
hashmap能够保证取出顺序和存入顺序一致吗
hashmap是散列映射,也就是它不会记录数据存储时的顺序,也就无法保证你取出时的顺序,为了解决这个问题,很简单采用LinkedHashMap或者是TreeMap即可
-
hashmap是不是线程安全,有哪些方式实现线程安全
Java HashMap 是非线程安全的。在多线程条件下,容易导致死循环,具体表现为CPU使用率100%。因此多线程环境下保证 HashMap 的线程安全性,主要有如下几种方法:
-
使用 java.util.Hashtable 类,此类是线程安全的。
-
使用 java.util.concurrent.ConcurrentHashMap,此类是线程安全的。
-
使用 java.util.Collections.synchronizedMap() 方法包装 HashMap object,得到线程安全的Map,并在此Map上进行操作。
-
自己在程序的关键方法或者代码段加锁,保证安全性,当然这是严重的不推荐。
-
-
加锁的方式有哪些? synchronized和锁和cas 这几个哪个效率大小比较?
synchronized的效率 早期的jdk(1.6之前)版本synchronized效率很低,早期只有一种锁,就是使用的是重量级锁,依赖于底层操作系统mutex lock实现。jdk1.6之后对synchronized做了优化,引入了偏向锁、自旋锁(也叫轻量级锁),这两种锁的引入是为了解决在没有多线程竞争或者基本没有竞争的情况下使用重量级锁带来的资源开销和性能问题。 CAS的优点:确保内存的读写操作是原子性的; 缺点:虽然能保证原子性操作,但是有ABA问题,循环时间长开销大,在线程严重冲突时会大幅降低程序性能;
-
深拷贝和浅拷贝 ,所有浅拷贝都是指向同一个对象吗?
基本数据类型不是
-
线程之间怎么通信
-
系统级别的OOM是什么含义呢?
-
java的synchronized是怎么用的,底层是怎么实现的?
-
假设现在有个需求,想在主线程里调用10个子线程,但是主线程得等10个子线程执行完再完成剩余的操作?怎么实现?
-
wait,notify是什么?
-
Mevan出现包依赖冲突你怎么处理
-
Java中的TreeMap和HashMap有什么区别?
-
线程池是什么,有哪几种
JVM
-
类加载过程
-
说一下JVM的内存一般划分为哪些?
-
堆是怎么划分的?
-
堆一定是划分为这三个区域吗? 跟垃圾收集器有关
-
常用的垃圾回收器有哪些
-
如何判断对象是不是垃圾
-
发现程序一直在FullGC有什么好的解决办法?
-
如何判断一个对象是大对象呢?
-
Java进程无缘无故挂掉了,你一般会怎么排查?
-
除了Java程序日志还能看哪些日志
我回答可以打印Jvm日志信息
-
项目中数据库你是如何优化的?
分页查询,在数据量比较大的时候是如何优化的?
-
.class文件通过类加载器加载到JVM中哪个位置
-
方法区中有什么东西
-
gc常见回收机制(分代)
-
如果老年代的对象引用了新生代的对象,这种情况怎么判断是否为垃圾
-
垃圾回收机制不分代也可以吗
-
常用JVM调优方法是什么?
数据库
-
索引的物理结构和逻辑结构是怎么样的?
-
页的概念有了解过吗?
-
锁的话有几种类型?
-
如何慢sql排查流程?
-
复合索引中的最左前缀原则
场景题:复合索引ABC,这时候要去查AB,AC,BC 那这个时候那几个用到了索引
AB--用到了两个索引 AC--用到了A的索引
-
举一个MySQL死锁的例子
-
有一个数据量比较大的文件,每一行都是有序的url。想要去重有什么方法?内存放不下
-
SpringMVC和SpringBoot有什么区别
-
SpringBoot的自动加载机制
-
mybatis如何继承到springboot中
-
有用过mybatis的什么插件吗
Redis
-
redis的淘汰策略有哪些?
-
如何使用redis实现LRU缓存(最近最少使用)?如何实现?用什么数据结构?
-
redis有哪些特点?用来存储token这些数据?
-
redis的IO多路复用了解吗
Spring
-
SpringBoot和SpringMVC和Spring有什么区别
-
Spring的两个核心IOC和AOP
-
依赖注入时 出现循环依赖怎么注入
Linux
-
看cpu负载情况
-
磁盘IO命令
-
物理内存和虚拟内存有什么区别
-
发现进程端口占用了你怎么处理
计算机网络
-
TCP和UDP的区别
-
HTTP的状态码
-
cookie和session有什么区别
-
语音视频是怎么通过七层OSI网络协议传输到对方
-
mac地址是在那一层进行封装
拓展题
sso单点登录详细说一下
#Java##面试题目#