Java面试中常被问的知识点

1.常用的框架

主要有Spring,SpringBoot,MyBatis, SpringCloud,SpringMVC,Shiro

2.spring常用的注解

和bean相关:@Autowired,@Component,@Repository,@Service, @Controller,@RestController, @Scope,@Configuration
和请求相关:@GetMapping,@PostMapping,@PathVariable,@RequestParam,@RequestBody
和参数校验相关:@NotEmpty,@NotBlank,@Null,@NotNull,@Min,@Max

3.和数据库交互的方式

利用java的JDBC
利用mybtais连接
利用dbcp,c3p0,druid数据库连接池

4.常用集合

List:元素按进入的先后顺序保存,可重复
ArrayList底层数据结构是数组, 查询快,增删慢,线程不安全,效率高,可以存储重复元素。
LinkedList底层数据结构是链表, 查询慢,增删快,线程不安全,效率高,可以存储重复元素。
vector底层数据结构是数组, 查询快,增删慢,线程安全,效率低,可以存储重复元素。
Set:元素无序,不可重复
HashSet底层数据结构是哈希表,元素无序且唯一,线程不安全,效率高,可以存储null元素
LinkedHashSet底层数据结构是链表+哈希表,链表保证元素的顺序与存储顺序一致,哈希表保证元素的唯一性
是线程不安全的,效率高。
TreeSet底层数据结构是二叉树,元素是唯一的且排好序的,不允许存null值
Map:存储键值对集合,key不能重复,vake可以重复
HashMap是基于哈希表实现,线程不安全,键值对无序,key值允许为空, 但只能有一个,性能好
HashTable也是基于哈希表实现,线程安全,键值对无序,不允许空值,性能差。
TreeMap是基于红黑树实现的,key是有序的,可分为自然排序和自定义排序,是线程不安全的。

5.多线程

1.进程是程序的一次执行过程,是系统运行程序的基本单位。在java中启动main函数时,就是启动了JVM进程。
线程是比进程更小的执行单位,一个进程在执行的过程中可以产生多个进程,多个线程共享进程的堆内存和方
法区,每个线程有自己的程序计数器,虚拟机栈,本地方法栈,线程的之前切换的代价要比进程切换低。

3.线程启动的方式:
1.实现Thread类
2.实现Runnable接口。
3.实现callable接口。
3.通过线程池启动线程。

4.线程的状态
NEW, Runable(包括Ready,Running),TimedWaiting,Waiting,Blocked,Teminated

5.线程的方法
sleep:当前线程睡眠,进入阻塞状态,让给别的线程执行,执行sleep方法的时候不会释放锁。
wait:是当前线程阻塞,前提是必须获得锁,执行wait方法的时候会释放当前的锁。
yield:当前线程进入就绪状态,让出一下CPU,
join:线程T1,T2,T1运行的过程中,调用T2的join方法,T1线程进入阻塞状态,这个时候CPU会先把T2线程执行完,
然后再去执行T1线程。
notify:唤醒一个等待的线程,如果有多个,只会唤醒一个
notifyAll:唤醒所有等待的线程。

6.synchronized
1.被synchronized修饰的方法,或被包裹的代码块,锁住的都是方法所属的对象本身。
所以同一给类中的 synchronized方法,只能被一个线程调用。
2.synchronized方法是可重入的,而且是必须是可重入的, 因为同一个线程在子类的synchronized方法中是可以调用父类的synchronized方法的,
是不会被锁住的。
3.synchronized的升级过程
hotspot底层实现是当一个线程访问某个对象,获得这把锁的时候,hotsport默认是
不会加锁的,只会在这个对象上记录这个线程的ID,这时候使用的是偏向锁。
如果下一次还是这个线程来访问的话,就不用获取锁,而是直接可以执行了。所以
效率是非常高的。但是如果有别的线程来争用这把锁的时候,这时候就会从偏向锁升
级为自旋锁,两个线程,一个线程占用这把锁,另一个线程不断循环去占用这把锁的,
当这个线程循环次数超过10次之后,这个时候这把锁就会升级成重量级锁了。

7.volatile
1. 主要作用就是是一个变量在多个线程之前可见。
2.volatile当修饰引用数据类型(包括数组)只能保证引用本身的可见性,不能保证部分字段的可见性
8.线程池
ThreadPoolExecutor
ForkJoinPool
适合分解汇总的任务
用很少的线程可以执行很多的任务(子任务)ThreadPoolExecutor做不到的先执行子任务
适合CPU密集型
ThreadPoolExecutor的七个参数
corePoolSize
MaxPoolSize
keepAliveTime
TimeUnit
BlockingQueue 任务队列
ThreadFactory 线程工厂
RejectStrategy 拒绝策略 (Abort,Discard,DiscardOldest,callerRuns)
线程池的拒绝策略
Abort:抛异常
Discard:扔掉,不抛异常
DiscardOldest:扔掉排队时间最久的
callerRuns:调用者处理任务

5.IO

1.BIO
属于同步阻塞IO模型,在同步阻塞IO模型中,应用程序发起read调用后,会一直阻塞,
直到数据从内核空间拷贝到用户空间
2. NIO
属于同步非阻塞IO模型,在同步非阻塞IO模型中,应用程序可以一直发起read调用,
但是数据从内核空间拷贝到用户空间的过程依然是阻塞的。
3.AIO
属于异步IO模型,是基于事件和回掉机制实现的,就是应用程序在操作之后,直接返回,不会阻塞在哪,
当后台处理完成后,操作系统,会通知相应的线程进行后续的操作。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值