-
JavaSE
泛型
- 什么是泛型
- 什么是泛型擦除
- 介绍一下泛型常用的通配符
- TEKV?
- == 与 equals()的区别
- == 对于基本类型和引用类型的作用效果
- 对于基本类型比较的是
- 对于饮用类型比较的是
- equals() 作用效果
- 判断两个对象是否相等,存在于object类中
- equals() 方法的两种情况
- 类覆盖了equals()方法
- 按照覆盖方法定义的规则判断
- 类没有覆盖
- 按照object类中对引用地址进行判断 等价于 ==
- 类覆盖了equals()方法
- String类的equals()方法
- 是经过重写的,object类中的equals比较的是地址,string中的equals比较的是值
- == 对于基本类型和引用类型的作用效果
- hashcode()与equals()
- hashcode()的作用
- 减少比较的成本,提高比较的效率
- 为什么要有hashcode
- 以hashSet的源码中的putval方法举例
- hashset 中存放对象,且不允许有重复,在进行元素添加的时候,首先比对对象的的hashcode,
- 以hashSet的源码中的putval方法举例
- 为什么重写equals()时必须重写hashcode()方法
- 两个相等对象的hashcode也必须是相等的,如果equals方法判断两个对象相等,那么他闷的hashcode也必须相等
- 如果重写equals但是没有重写hashcode会导致equals判断相等,但是hashcode值不同
- hashcode()的作用
- 基本数据类型
- int,long,short,char,boolean,float,double,byte
- 包装类型的常量池技术
- 哪些有缓存,哪些无缓存,有缓存的包装类型的数据范围
- integer 有缓存,character有缓存
- 哪些有缓存,哪些无缓存,有缓存的包装类型的数据范围
- 自动装箱与拆箱指什么,原理是什么?
- 装箱
- 基本类型使用包装类型包装起来
- 拆箱
- 包装类型转换为基本类型
- 分别调用的方法
- 装箱其实调用的就是 包装类.valueOf()方法
- 拆箱则是 包装类型.xxxValue()方法
- 频繁拆装箱会造成什么?
- 会造成不必要的性能损耗
- 装箱
- JavaOOP
- 成员变量与局部变量的区别有哪些
- 从语法形式上来看
- 从变量在内存中的存储方式来看
- 村变量在内存中的生存时间上来看
- 从变量是否有默认值来看
- 创建一个对象用什么运算符,对象实体与对象引用有什么不同?
- 对象的相等 与 指向他们的引用相等,二者有什么不同
- 以个类的构造方法的作用是什么
- 如果一个类没有声明构造方法,那该程序是否可以正常执行?为什么?
- 构造方法的特点?是否可以被重写 override
- 成员变量与局部变量的区别有哪些
- 面向对象三大特性
- 封装
- 继承
- 继承相关 子类与父类的关系,访问限制
- 多态
- 静态绑定与动态绑定指的是什么
- 向下转型与向上转型指的是什么,分别是什么使用背景
- 向上转型的实现原理是什么
- 多态实现的三个条件是什么
- String ,StringBuffer,StringBuilder 的区别是什么,String为什么是不可变
- String 底层是一个char[] 数组,同时被private final 进行了修饰
- 线程安全行方面
- stringbuffer 安全 单效率相对较低
- stringbuilder 不安全 但是效率更高
- 性能方面
- 三者使用场景总结
- 操作少量数据 使用string
- 单线程操作字符缓冲区下操作大量数据 stringbuilder
- 多县城操作自负缓冲区下操作大量数据 stringbuffer
- Object类常见方法总结
- 深拷贝和浅拷贝区别了解么,什么是引用拷贝
- 浅拷贝
- 会在堆上创建一个新的对象,引用栈中愿对象地址,如果对象内部属性有引用类型,会直接复制 内部属性的引用地址。
- 深拷贝
- 完全复制整个对象,如果内部有引用类型属性,则一并复制,而非单纯复制引用地址
- 浅拷贝
- 反射
- 反射的作用
- 通过反射获取类的方式有哪4种
- 全类名 - 知晓类全路径的情况下
- 对象getClass() - 拥有对象实例的情况下
- 类.Class - 知道具体类的情况下
- 类加载起loadClass 全路径获取 - 同 知晓类全路径的情况下
- 反射相关api
- 获取 成员属性
- 获取 成员方法
- 获取 构造方法
- 调用 成员方法
- 暴力获取,setAccessable true
- 异常
- I/O流
- 序列化
- 反序列化
- java 序列化中如果有些字段不想进行序列化怎么办
- java 中的 io流分为几种?
- 按照流的流向划分
- 按照操作单元划分
- 按照流的角色划分
- 既然有了字节流,为什么还要有字符流
- 问题本质想问:不管是文件读写还是网络发送接收,信息的最小存储单元都是字节,那为什么 I/O 流操作要分为字节流操作和字符流操作呢?
- 代理详解 javaguide 未学习,后补完
-
Java 集合框架基础&面试要点
List,Set,Querue,Map 四者区别
- 如何选用集合
- 为什么要使用集合?
- Collection 子接口 LIst
- ArrayList 和 Vector 的区别
- ArrayList 和 LinkedList 的区别
- 底层数据结构
- 线程安全,
- 插入删除是否受元素位置影响
- 是否支持快速随机访问
- 内存占用空间
- 双向链表 双向循环链表
- ArrayList 的扩容机制
- Collection 自接口 set
- comparable 和 comparator的区别
- Comparator 定制排序
- 重写compareTo方法实现定制排序
- comparable 和 comparator的区别
- 无序性和不可重复性的含义是什么
- 比较HashSet LinkedHashSet 和 TreeSet三者异同
- 线程是否安全
- 底层数据结构方面
- 应用场景
- Collection子接口之 Queue
- Queue 与 Deque 的区别
- Map接口
- hashmap和hashtable的区别
- 线程安全方面
- 效率方面
- null key & null value 方面
- 初始容量和 每次 扩充容量大小方面
- 底层数据结构
- hashMap和hashSet区别
- 实现接口方面
- 存储对象方面
- 添加元素方面
- hashMap 和 TreeMap区别
- hashSet 如何检查重复
- hashmap和hashtable的区别
- HashMap的底层实现
- hashMap的长度为什么是2的幂次方
- hashMap 有哪几种遍历方式
currentHashmap 和hashtable的区别
集合判空
- 集合转Map
- 集合遍历
- 集合去重复
- 集合转数组‘
-
Java arrayList 源码 及 扩容机制分析
Java 并发常见知识点
- 什么是线程
- 什么是进程
- 什么是上下文切换
- 如何预防和避免线程死锁
- 实现多线程的方法(4种
- callable
- a:创建Callable接口的实现类 ,并实现Call方法
b:创建Callable实现类的实现,使用FutureTask类包装Callable对象,该FutureTask对象封装了Callable对象的Call方法的返回值
c:使用FutureTask对象作为Thread对象的target创建并启动线程
d:调用FutureTask对象的get()来获取子线程执行结束的返回值
- a:创建Callable接口的实现类 ,并实现Call方法
- 线程池
- executors
- callable
- Thread 和 runnable的区别
- 线程状态都有哪几种,其中阻塞状态有哪三种
- 等待阻塞
- 同步阻塞
- 其他阻塞
- 线程调度
- 线程优先级
- 线程睡眠
- 线程等待
- 线程让步
- 线程加入
- 线程唤醒
- 线程数据传递
- 构造方法传递
- 函数回调传递
- 如何取得多线程运行的返回值?
- callable 接口 和 future接口的区别?
- (1)Callable规定的方法是call(),而Runnable规定的方法是run().
- (2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值的。
- (3)call()方法可抛出异常,而run()方法是不能抛出异常的。
- (4)运行Callable任务可拿到一个Future对象, Future表示异步计算的结果。
- 它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。
- 通过Future对象可了解任务执行情况,可取消任务的执行,还可获取任务执行的结果。
- Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。
- 简述线程与进程的关系,区别,优缺点?
- jvm角度,理解堆栈,方法区
- 程序计数器为什么是私有的?
- 虚拟机栈和本地方法栈为什么是私有的?
- 一句话简单了解堆和方法区
- 并发并行的区别
- 并发: 同一时间段,多个任务都在执行 (单位时间内不一定同时执行);
- 并行: 单位时间内,多个任务同时执行。
- 为什么使用多线程
- 多线程可能会带来什么问题
- oom,死锁,线程不安全等等,超买超卖
- 线程生命周期和状态
- 说说sleep()方法和wait() 方法区别与共同点
- 区别
- sleep方法没有释放锁,wait方法是释放锁的
- wait() 通常被用来线程之间的交互/通信,sleep() 常用来暂停执行
- wait() 方法调用之后,线程不会自动苏醒,需要别的线程调用同一个对象上的notify() 或者notifyAll()方法,sleep方法执行完成之后,线程会自动苏醒。或者使用wait()的重载方法 wait(long timeout),超时之后线程会自动苏醒
- 共同点
- 两者都可以用来暂停线程执行
- 区别
- 为什么调用start() 方法会执行run() 方法,为什么不直接调用run方法?
- start方法会启动一个线程进入就绪状态,分配到cpu时间片就可以开始运行,start()会执行线程的准备工作,自动执行run方法的内容
- 直接执行run() 方法会把run()方法当成一个main线程下的普通方法去执行
- 说说对synchronized 关键字的理解
- 说说自己是怎么使用synchronized关键字的
- 修饰实力方法
- 修饰静态方法
- 修饰代码块
- 构造方法是否可以使用synchornized进行修饰?
- synchronized 关键字的底层原理
- jvm
jdk1.6之后的synchornized关键字进行了哪些层面的优化,可详细介绍一下么?
volatile 关键字
CPU 缓存模型
- 为什么要弄一个cpu告诉缓存呢
说说synchronized 关键字和 volatile 关键字的区别
- 二者关系是互补
- volatile 本质是告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主内存中读取,
- synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞
- volatile仅能使用在变量级别,synchronized则可以使用在变量,方法,和类级别的
- volatile仅能实现变量的修改可见性,不能保证原子性,而synchronized可以保证变量的修改可见性和原子性
- volatile不会造成线程的阻塞,synchronized可能会造成线程的阻塞
- volatile标记的变量不会被编译器优化,synchronized标记的变量可以被编译器优化
ThreadLocal
ThreadLocal内存泄漏问题
- 强引用,弱引用的区别
为什么ThreadLocal的key是若饮用,如果是强引用会又什么问题
为什么使用了synchronize,lock 还要再使用 分布式锁
线程池
为什么要用线程池
- 实现runnable接口和callable接口的区别
线程池对象方法 ,execute() 方法和 submit() 方法的区别是什么?
如何创建线程池
构造方法实现
通过Executor框架的工具类 Execuotrs 来进行实现
OSI 与 tcp/ip 各层结构与功能,都有那些协议
- osi 七层都有哪七层
- TCP/IP 四层协议都有那四层
- 五层协议指什么
- TCP 三次握手和四次挥手
- TCP/UDP 协议区别
- 浏览器中输入 url地址 到 现实页面的过程
- HTTP 长链接,短链接
- HTTP 不是保存状态的协议,如何保存用户状态
- cookie 被禁用的情况怎么办
- cookie的作用是什么,和session又什么区别
- URI 和 URL 的区别是什么
HTTP 和HTTPS 的区别
redis除了做缓存还能做什么
- 分布式锁
- 限流
- 消息队列
- 复杂业务场景
- 数据类型
- String
- list
- hash
- set
- soted set
- bitmap
- Redis 给缓存数据设置过期时间有什么用
- 过期除了有助于缓解内存的消耗,还有其他的作用嘛
- Redis 的持久化机制了解么
- rdb
- aof
- Redis 事务 跟 平常理解的关系型数据库的事务有什么区别�?
- 缓存穿透 怎么解决 ?
- 缓存击穿 怎么解决?
- 缓存雪崩 怎么解决?
- 如何保证缓存和数据库数据的一致性
- Redis的分布式锁 redisson
- 看门狗的原理
分布式锁
等价类
- 边界值
- 空值
- 越权
- 操作关键性数据的接口
- 并发,测试超买,超卖,超领,整体思维为时序图时间暂停思路。 目的为测试高并发下对于重要数据资源有没有加锁,有没有bug。
-
简单JVM要点
jvm内存模型
- 就是jvm内部构造,堆,栈,方法区,分别用来做什么
- 并发变成之下,哪些部分是共享,哪些为线程私有
强饮用,若饮用,需饮用,软引用都是什么意思,有什么区别,为什么要这么区分
spring的事务管理方式
- 编程式事务管理
- 声明式事务管理
- 本质是什么?
- spring事务传播级别
一、Propagation (事务的传播属性)
Propagation :key属性确定代理应该给哪个方法增加事务行为。这样的属性最重要的部份是传播行为。有以下选项可供使用:
PROPAGATION_REQUIRED —支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS —支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY—支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW —新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED —以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER —以非事务方式执行,如果当前存在事务,则抛出异常
事务隔离级别
什么是springBoot
- Springboot有那些优点
- 核心竹节是哪个? 主要是有哪几个注解组成的?
- SpringBootConfiguration 组合了@Configuration 注解
- EnableAutoConfigguration 打开自动配置功能,也可以关闭某个自动配置的选项 exclude
- CompontScan
- 什么是JavaConfig
- SpringBoot 自动配置原理是什么
- @EnableAutoConfiguration 给容器导入META-INF/spring.factories 里定义的自动配置类。
- Springboot 配置加载的顺序是怎样的?
- properties文件
- yaml文件
- 系统环境变量
- 命令行参数
- Spring Boot 中的 starter 到底是什么 ?
- 微服务中如何实现session共享
- 在微服务中,一个完整的项目被拆分成多个不相同的独立的服务,各个服务独立部署在不同的服务器上,各自的 session 被从物理空间上隔离开了,但是经常,我们需要在不同微服务之间共享 session ,常见的方案就是 Spring Session + Redis 来实现 session 共享。将所有微服务的 session 统一保存在 Redis 上,当各个微服务对 session 有相关的读写操作时,都去操作 Redis 上的 session 。这样就实现了 session 共享,Spring Session 基于 Spring 中的代理过滤器实现,使得 session 的同步操作对开发人员而言是透明的,非常简便。
- 说说spring里面用了哪些设计模式
- 单例模式
- 工厂模式
- 代理模式
- 模板方法模式
- IOC AOP的理解
- IOC
- BeanFactory ApplicationContext 两种ioc容器,来进行对Bean的管理
- AOP
- 面向切面编程
- Spring主要提供了 Aspect 切面、JoinPoint 连接点、PointCut 切入点、Advice 增强等实现方式。
- IOC
- BeanFactory 和 FactoryBean 有什么区别
- BeanFactory 是bean的工厂,applicationContext的爸爸,ioc容器的核心,负责生产和管理bean对象
- FactoryBean 是 Bean,可以通过实现 FactoryBean 接口定制实例化 Bean 的逻辑,通过代理一个Bean对象,对方法前后做一些操作。