刚进公司,速成学习的技术,迫于开发项目,体现价值。很多人,或许和我一样,对很多地方的原理不能清晰了解。记录下来,方便继续模块化学习和复习。
—————— 不能只停留在会用,要多清晰原理 ——————
Java基础
1、List 和 Set 的区别?
list是有序的,数据也是可以重复的;
set是无序的,数据是不会重复的。
2、HashSet 是如何保证不重复的?
当向set集合add时候,首先先会判断hashCode是不是相同,
如果hashCode相同,在通过equal方法比较值,只有有不相同的就存。
4、HashMap 的原理
hashMap其实是通过数组和链表来实现存储的。
存储时,通过hashCode hash计算出其在数组中对应的下标,同时比对key,如果key值不同,直接将key-value存到链表中;
如果key相同,则覆盖原始的值。
获取时,直接找到hash值对应的下标,在进一步判断key是否相同,从而找到对应值。
6、final finally finalize
final:定义静态变量的关键字。
finally:捕获异常处理的关键字,不管有无异常都会执行。
finalize:垃圾回收的关键字。是在垃圾收集器清楚对象之前调用。
7、强引用 、软引用、 弱引用、虚引用
强引用:就算jvm内存溢出也不会被回收。
软引用:当内存不足的时候,会被回收。
弱引用:一旦被扫描发现,就会被回收。
虚引用:必须和引用队列使用。
8、Java反射
只有在运行的时候,才知道要用到的类是什么,才知道其完整结构并调用。
在编码的时候更加灵活,代码可以在运行的时候被装配,无需组件源码间的链接,降低了代码的耦合性。
但是,增加了内存消耗,降低了性能。
9、Arrays.sort 实现原理和 Collection 实现原理
都是排序,找到已经排好序数据的子序列,然后对剩余部分排序,然后合并起来。
List<String> strings = Arrays.asList("6", "1", "3", "1","2");
Collections.sort(strings);
String[] strArr = "6,1,3,1,2".split(",");
Arrays.sort(strArr);
10、LinkedHashMap的应用
12、异常分类以及处理机制
异常分为:不可解处理异常(Error)和可以处理异常(Exception);
Exception分为运行时异常和非运行时异常。
捕获(try/catch)和直接抛出异常(throw)。
13、常见的连接池。
druid、c3p0、DBCP
14、nginx的操作基本命令
查看Nginx的版本号:nginx -V
启动Nginx:sudo nginx
快速停止或关闭Nginx:sudo nginx -s stop
正常停止或关闭Nginx:sudo nginx -s quit
配置文件修改重装载命令:sudo nginx -s reload
15、重写和重载
方法同名,但是参数有不同的是重载。
16、常见的两种动态代理方式。
默认是的jdk代理,然后还有cgLib代理。
17、cookie和session的区别。
无论客户端浏览器做怎么样的设置,session都应该能正常工作。客户端可以选择禁用 cookie,
但是, session 仍然是能够工作的,因为客户端无法禁用服务端的 session。
18、HashMap 和 Hashtable 的区别
1.hashMap去掉了HashTable 的contains方法,但是加上了containsValue()和containsKey()方法。
2.hashTable同步的,而HashMap是非同步的,效率上逼hashTable要高。
3.hashMap允许空键值,而hashTable不允许。
19、Spring 框架中用到了哪些设计模式
单例模式—在spring配置文件中定义的bean默认为单例模式。
工厂模式—BeanFactory用来创建对象的实例。
Java 并发
1、synchronized 的实现原理以及锁优化?
2、volatile 的实现原理?
3、Java 的信号灯?
4、synchronized 在静态方法和普通方法的区别?
5、怎么实现所有线程在等待某个事件的发生才会去执行?
6、CAS?CAS 有什么缺陷,如何解决?
7、synchronized 和 lock 有什么区别?
8、Hashtable 是怎么加锁的 ?
9、HashMap 的并发问题?
10、ConcurrenHashMap 介绍?1.8 中为什么要用红黑树?
11、AQS
12、如何检测死锁?怎么预防死锁?
13、Java 内存模型?
14、如何保证多线程下 i++ 结果正确?
15、线程池的种类,区别和使用场景?
16、分析线程池的实现原理和线程的调度过程?
17、线程池如何调优,最大数目如何确认?
18、ThreadLocal原理,用的时候需要注意什么?
19、CountDownLatch 和 CyclicBarrier 的用法,以及相互之间的差别?
20、LockSupport工具
21、Condition接口及其实现原理
22、Fork/Join框架的理解
23、分段锁的原理,锁力度减小的思考
24、八种阻塞队列以及各个阻塞队列的特性
Spring
1、BeanFactory 和 FactoryBean?
BeanFactory是工厂类,用于管理Bean的一个工厂;是IOC容器的核心接口。
作用是:实例化、定位、配置应用程序中的对象及建立各对象之间的关系。
但对FactoryBean而言,这个Bean不是简单的Bean,而是一个能生产或者修饰对象生成的工厂Bean,
它的实现与设计模式中的工厂模式和修饰器模式类似。
2、Spring IOC 的理解,其初始化过程?
IOC容器是具有依赖注入功能的容器,其核心类是BeanFactory。
IOC容器初始化、装配及管理的对象是Bean;
IOC通过配置元数据实例化Bean、管理Bean之间的依赖关系。
1.准备配置文件,元数据,也就是Bean的注入配置。
2.容器对元数据进行解析和装配。
解析用到的是BeanReader读取、解析;
实例化、配置和组装Bean,是BeanDefinition。
3.实例化IOC容器,即客户端的实例化,及Bean的调用。
3、BeanFactory 和 ApplicationContext?
BeanFactory实现了IOC容器的最基本功能;
而Spring的content包下ApplicationContent类继承了BeanFactory接口,
对BeanFactory接口扩展,提供了更多企业级的支持,AOP的集成。
===beanfactory顾名思义,它的核心概念就是bean工厂,用作于bean生命周期的管理,
而applicationcontext这个概念就比较丰富了,单看名字(应用上下文)就能看出它包含的范围更广,
它继承自bean factory但不仅仅是继承自这一个接口,还有继承了其他的接口,所以它不仅仅有
bean factory相关概念,更是一个应用系统的上下文,其设计初衷应该是一个包罗万象的对外暴露的一个综合的API)
4、Spring Bean 的生命周期,如何被管理的?
5、Spring Bean 的加载过程是怎样的?
6、如果要你实现Spring AOP,请问怎么实现?
默认使用JDK的动态代理方式。
也可以强制使用CGLIB的动态代理方式。
7、如果要你实现Spring IOC,你会注意哪些问题?
控制反转、依赖注入
8、Spring 是如何管理事务的,事务管理机制?
1.通过xml配置文件配置;
2.通过注解@Transactional实现。
9、Spring 的不同事务传播行为有哪些,干什么用的?
10、Spring 中用到了那些设计模式?
单例模式—在spring配置文件中定义的bean默认为单例模式。
工厂模式—BeanFactory用来创建对象的实例。
适配器—spring aop。
观察者– spring 时间驱动模型。
11、Spring MVC 的工作原理?
人机 > Controller(控制器) > 对应Model(模型) > view(视图) > 人机
12、Spring 循环注入的原理?
13、Spring AOP的理解,各个术语,他们是怎么相互工作的?
14、Spring 如何保证 Controller 并发的安全?
分布式相关
1、Dubbo的底层实现原理和机制
2、描述一个服务从发布到被消费的详细过程
3、分布式系统怎么做服务治理
4、接口的幂等性的概念
5、消息中间件如何解决消息丢失问题
6、Dubbo的服务请求失败怎么处理
7、重连机制会不会造成错误
8、对分布式事务的理解
9、如何实现负载均衡,有哪些算法可以实现?
10、Zookeeper的用途,选举的原理是什么?
11、数据的垂直拆分水平拆分。
12、zookeeper原理和适用场景
13、zookeeper watch机制
14、redis/zk节点宕机如何处理
15、分布式集群下如何做到唯一序列号
16、如何做一个分布式锁
17、用过哪些MQ,怎么用的,和其他mq比较有什么优缺点,MQ的连接是线程安全的吗
18、MQ系统的数据如何保证不丢失
19、列举出你能想到的数据库分库分表策略;分库分表后,如何解决全表查询的问题
20、zookeeper的选举策略
21、全局ID
数据库
1、mysql分页有什么优化
2、悲观锁、乐观锁
3、组合索引,最左原则
4、mysql 的表锁、行锁
5、mysql 性能优化
1.建表时,使用合适的字段属性,设置合适的字段大小。
2.尽量使用关联查询,代替父子查询。
3.建立索引。
4.创建视图。
5.优化sql脚本。(分析sql的执行分析,避免全表扫描)
6、mysql的索引分类:B+,hash;什么情况用什么索引
7、事务的特性和隔离级别
缓存
1、Redis用过哪些数据数据,以及Redis底层怎么实现
2、Redis缓存穿透,缓存雪崩
3、如何使用Redis来实现分布式锁
4、Redis的并发竞争问题如何解决
5、Redis持久化的几种方式,优缺点是什么,怎么实现的
6、Redis的缓存失效策略
7、Redis集群,高可用,原理
8、Redis缓存分片
9、Redis的数据淘汰策略
10、Redis支持事务吗?
redis作为一个高效的分布式数据库,是支持事务的。
multi标识事务的开始,exec标识事务的结束。
其中,multi下的业务操作是在exec后,依次执行。
JVM
1、详细jvm内存模型
类装载器 :启动类装载器、用户自定义类装载器。
执行引擎:即时编译。自适应优化。
运行时数据区:
方法区、堆 (线程共享)
java栈、Pc寄存器和本地方法栈 (线程私有)
2、讲讲什么情况下回出现内存溢出,内存泄漏?
内存溢出:比如一个对象长度为int的,你存了一个long型的,就会内存溢出。
内存泄露:申请了的内存无法释放,长此以往,项目就会宕掉了。
3、说说Java线程栈
4、JVM 年轻代到年老代的晋升过程的判断条件是什么呢?
5、JVM 出现 fullGC 很频繁,怎么去线上排查问题?
6、类加载为什么要使用双亲委派模式,有没有什么场景是打破了这个模式?
7、类的实例化顺序
加载>验证>准备>解析>初始化>使用>卸载
8、JVM垃圾回收机制,何时触发MinorGC等操作
9、JVM 中一次完整的 GC 流程(从 ygc 到 fgc)是怎样的
10、各种回收器,各自优缺点,重点CMS、G1
11、各种回收算法
标记回收
计数回收
复制回收
12、OOM错误,stackoverflow错误,permgen space错误
设计模式:
基本原则5种创建型、7种结构型、11种行为型
:
单一职责、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特法则、合成聚合(复用)原则。
- 单例模式
public class SingleObject {
//新建一个单例对象
private static SingleObject instance = new SingleObject();
//private的构造方法,不会被初始化
private SingleObject() {};
//对象的get方法
public static SingleObject getInstance() {
return instance;
}
public void showMessage() {
System.out.println("这是一个单例模式");
}
}
- 工厂模式
工厂方法模式的典型例子,自行车分为山地自行车和公路自行车等,
当需要买自行车时,我们直接去自行车厂里告诉厂长我们需要的自行车即可。
- 抽象工厂模式
抽象工厂模式主要解决接口选择的问题,典型例子是手机和电脑问题,假设抽象产品1是手机,
具体产品是Android手机和iOS手机,抽象产品2是电脑,具体产品是Windows电脑和Mac电脑,
抽象工厂是同时生产手机和电脑的公司,具体工厂是联想公司和苹果公司。
抽象工厂的优点是当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点是产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象工厂里加代码,又要在具体工厂里加代码。
4.建造者模式
计算机的组装,计算机是个复杂的对象,它是有很多零件组装而成,显示器、操作系统,鼠标等,
通过创建Builder接口来控制零件的组装过程,这样当组件发生变化时,虽然经过同样的构建过程,但是
最后得到的结果不同。
-
观察者模式
-
动态代理模式
-
适配器模式
-
模板模式
-
策略模式
补充备注:
一、堆和栈的区别
1、栈中存放的是基本类型变量和对象的引用变量,局部变量在栈内存
2、堆内存放的是new创建的对象和数组,成员变量在堆内存
二、Java创建对象的四种方式:
1、调用new语句创建对象,最常见的一种
2、运用反射创建对象,调用java.lang.Class 或者 java.lang.reflect.Constructor 类的newInstance()实例方法
3、调用对象的clone()方法
4、 运用序列化手段,调用java.io.ObjectInputStream 对象的 readObject()方法.
三、java的Object对象中提供了那些方法?
最常见的.toString();
类加载/反射--- .getClass()方法;
hashMap --- .hashCode()和.equals()
线程 --- .wait()、.notify、.Allnotfity()
垃圾回收 --- finally()
四、抽象类和接口的区别
抽象类是对根的抽象。
接口是对行为动作的抽象。
网友评论