JAVA基础总结

Java基础
1.Java中的几种基本数据类型是什么,各自占用多少字节?
答案:int : 32bit;float :32bit; short :16bit; char :16bit; byte :8bit; double:64bit

2.springCloud微服务和插件问题?

3.JDK1.7和1.8的hashMap有啥不同?
答案:HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。随着JDK(Java Developmet Kit)版本的更新,JDK1.8对HashMap底层的实现进行了优化,例如引入红黑树的数据结构和扩容的优化等。本文结合JDK1.7和JDK1.8的区别,深入探讨HashMap的结构实现和功能原理。

4.JAVA的各种几何的机制以及区别?

5.本地线程,多线程,以及线程池的问题?
答案:如果你知道Java不支持类的多重继承,但允许你调用多个接口。所以如果你要继承其他类,当然是调用Runnable接口更好了;新建状态(New)---->就绪状态(Runnable)(线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权)----->运行状态(Running)(就绪状态的线程获取了CPU,执行程序代码)-------->阻塞状态(Blocked)(阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:

(一)、等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。

(二)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。

(三)、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态)------>死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。
线程池有什么作用:
1、提高效率 创建好一定数量的线程放在池中,等需要使用的时候就从池中拿一个,这要比需要的时候创建一个线程对象要快的多。

2、方便管理 可以编写线程池管理代码对池中的线程同一进行管理,比如说启动时有该程序创建100个线程,每当有请求的时候,就分配一个线程去工作,如果刚好并发有101个请求,那多出的这一个请求可以排队等候,避免因无休止的创建线程导致系统崩溃。

说说几种常见的线程池及使用场景:
1、newSingleThreadExecutor
创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
2、newFixedThreadPool
创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
3、newCachedThreadPool
创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

4、newScheduledThreadPool
创建一个定长线程池,支持定时及周期性任务执行。

6.SpringBoot与SpringMVC的区别?
Spring 框架就像一个家族,有众多衍生产品例如 boot、security、jpa等等。但他们的基础都是Spring 的 ioc和 aop ioc 提供了依赖注入的容器 aop ,解决了面向横切面的编程,然后在此两者的基础上实现了其他延伸产品的高级功能。Spring MVC是基于 Servlet 的一个 MVC 框架 主要解决 WEB 开发的问题,因为 Spring 的配置非常复杂,各种XML、 JavaConfig、hin处理起来比较繁琐。于是为了简化开发者的使用,从而创造性地推出了Spring boot,约定优于配置,简化了spring的配置流程。
说得更简便一些:Spring 最初利用“工厂模式”(DI)和“代理模式”(AOP)解耦应用组件。大家觉得挺好用,于是按照这种模式搞了一个 MVC框架(一些用Spring 解耦的组件),用开发 web 应用( SpringMVC )。然后有发现每次开发都写很多样板代码,为了简化工作流程,于是开发出了一些“懒人整合包”(starter),这套就是 Spring Boot。

Spring 是一个“引擎”;
Spring MVC 是基于Spring的一个 MVC 框架 ;
Spring Boot 是基于Spring4的条件注册的一套快速开发整合包。

7.VUE框架是否使用过?
答案:渐进式框架 1.项目构建工具(vue-cli)、2.路由(vue-router)、3.状态管理、4.http请求工具。

8.JVM的六种回收器,有啥不同,如CMS和G1的区别?
答案:1 Serial(序列号)收集器; 2 ParNew(新品)收集器; 3Parallel Scavenge(清理并行)收集器;4 Serial Old(旧串行) 和 Parellel (平行) 5、Concurrent Mark Sweep(并发标记扫描)收集器;6G1收集器
CMS:以获取最短回收停顿时间为目标的收集器,基于并发“标记清理”实现
G1:是一款面向服务端应用的垃圾收集器

9.DB优化时有哪几种索引?如何选择?

10.多人抢购一个库存商品该如何处理(分布事务)?
答案:事务的原子性(Atomicity )、一致性( Consistency )、隔离性或独立性( Isolation)和持久性(Durabilily),简称就是ACID
不考虑隔离性会造成:
脏读:是指一个事务读取了另一个事务没有提交的数据
不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不相同。
虚读:是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。

分布式事务:CAP(MySQL从5.5版本开始支持,SQL Server 2005 开始支持,Oracle 7 开始支持。)
一致性(Consistency) : 客户端知道一系列的操作都会同时发生(生效)
可用性(Availability) : 每个操作都必须以可预期的响应结束
分区容错性(Partition tolerance) : 即使出现单个组件无法可用,操作依然可以完成
SAGA:Sagas 事务模型
SagaBuilder saga = SagaBuilder.newSaga(“trip”).activity(“Reserve car”, ReserveCarAdapter.class).compensationActivity(“Cancelcar”,CancelCarAdapter.class).activity(“Bookhotel”,BookHotelAdapter.class) .compensationActivity(“Cancelhotel”,CancelHotelAdapter.class).activity(“Bookflight”,BookFlightAdapter.class).compensationActivity(“Cancelflight”,CancelFlightAdapter.class) .end() .triggerCompensationOnAnyError(); camunda.getRepositoryService().createDeployment() .addModelInstance(saga.getModel()) .deploy();

11.如何处理高并发就是处理请求量大于本地线程数时不出错?
12.Spring事务,各种框架的事务,如何实现的?
答案:ACID 除此之外还有Spring事务的传播性
事务的传播特性:
事务传播行为就是多个事务方法调用时,如何定义方法间事务的传播。Spring定义了7种传播行为:
(1)propagation_requierd:如果当前没有事务,就新建一个事务,如果已存在一个事务中,加入到这个事务中,这是Spring默认的选择。
(2)propagation_supports:支持当前事务,如果没有当前事务,就以非事务方法执行。
(3)propagation_mandatory:使用当前事务,如果没有当前事务,就抛出异常。
(4)propagation_required_new:新建事务,如果当前存在事务,把当前事务挂起。
(5)propagation_not_supported:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
(6)propagation_never:以非事务方式执行操作,如果当前事务存在则抛出异常。
(7)propagation_nested:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与propagation_required类似的操作。
事务几种实现方式
(1)编程式事务管理对基于 POJO 的应用来说是唯一选择。我们需要在代码中调用beginTransaction()、commit()、rollback()等事务管理相关的方法,这就是编程式事务管理。
(2)基于 TransactionProxyFactoryBean的声明式事务管理
(3)基于 @Transactional 的声明式事务管理
(4)基于Aspectj AOP配置事务

13.String类能被继承吗,为什么?
答案:不可以,因为String类有final修饰符,而final修饰的类是不能被继承的,实现细节不允许改变
14.String,Stringbuffer,StringBuilder的区别。
答案:1 String也是Immutable类的典型实现,被声明为final class,除了hash这个属性其它属性都声明为final,因为它的不可变性,所以例如拼接字符串时候会产生很多无用的中间对象,如果频繁的进行这样的操作对性能有所影响。
2 StringBuffer就是为了解决大量拼接字符串时产生很多中间对象问题而提供的一个类,提供append和add方法,可以将字符串添加到已有序列的末尾或指定位置,它的本质是一个线程安全的可修改的字符序列,把所有修改数据的方法都加上了synchronized。但是保证了线程安全是需要性能的代价的
3 在很多情况下我们的字符串拼接操作不需要线程安全,这时候StringBuilder登场了,StringBuilder是JDK1.5发布的,它和StringBuffer本质上没什么区别,就是去掉了保证线程安全的那部分,减少了开销。
StringBuffer 和 StringBuilder 二者都继承了 AbstractStringBuilder ,底层都是利用可修改的char数组(JDK 9 以后是 byte数组)。

15.ArrayList和LinkedList有什么区别。
答案:1.ArrayList是实现了基于动态数组的数据结构(这个数组的起始容量是10新容量有公式),LinkedList基于链表的数据结构(有很大的空间开销)。 (LinkedList是双向链表,有next也有previous)
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为ArrayList可以用二分查找法快速查找但是LinkedList要移动指针查找。 (array在时间复杂度上更有优势)
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。 (link空间复杂度上更有优势)这个数组的起始容量是10新容量=(旧容量*3)/2+1

16.讲讲类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,当new的时候,他们的执行顺序。
答案:类加载器实例化时进行的操作步骤(加载–>连接->初始化)
父类静态变量、 父类静态代码块、子类静态变量、 子类静态代码块、 父类非静态变量(父类实例成员变量)、 父类构造函数、父类构造函数、 子类非静态变量(子类实例成员变量)、 子类构造函数。
17.用过哪些Map类,都有什么区别,HashMap是线程安全的吗,并发下使用的Map是什么,他们内部原理分别是什么,比如存储方式,hashcode,扩容,默认容量等。
答案:
HashMap: 使用位桶和链表实现(最近的jdk1.8改用红黑树存储而非链表),它是线程不安全的Map,方法上都没有synchronize关键字修饰
HashTable:是线程安全的一个map实现类,它实现线程安全的方法是在各个方法上添加了synchronize关键字。但是现在已经不再推荐使用HashTable了,因为现在有了ConcurrentHashMap这个专门用于多线程场景下的map实现类,其大大优化了多线程下的性能。
ConcurrentHashMap:一个ConcurrentHashMap是由多个HashTable组成,所以它允许获取不用段锁的线程同时持有该资源,segment有多少个,理论上就可以同时有多少个线程来持有它这个资源。其默认的segment是一个数组,默认长度为16。也就是说理论商可以提高16倍的性能。jdk1.8中则对ConcurrentHashMap又再次进行了大的修改,取消了segment段锁字段,采用了CAS+Synchronize技术来保障线程安全。如果链表中存储的Entry超过了8个则就会自动转换链表为红黑树,提高查询效率。
TreeMap: TreeMap也是一个很常用的map实现类,因为他具有一个很大的特点就是会对Key进行排序,使用了TreeMap存储键值对,再使用iterator进行输出时,会发现其默认采用key由小到大的顺序输出键值对,如果想要按照其他的方式来排序,需要重写也就是override 它的compartor接口。
LinkedHashMap:LinkedHashMap它的特点主要在于linked,带有这个字眼的就表示底层用的是链表来进行的存储。相对于其他的无序的map实现类,还有像TreeMap这样的排序类,linkedHashMap最大的特点在于有序,但是它的有序主要体现在先进先出FIFIO上。没错,LinkedHashMap主要依靠双向链表和hash表来实现的。
weakHashMap:weakHashMap它是一个“弱键”,它的Key值和Value都可以是null,而且其Map中如果这个Key值指向的对象没被使用,此时触发了GC,该对象就会被回收掉的。其原理主要是使用的WeakReference和ReferenceQueue实现的,其key就是weakReference,而ReferenceQueue中保存了被回收的 Key-Value。
如果当其中一个Key-Value不再使用被回收时,就将其加入ReferenceQueue队列中。当下次再次调用该WeakHashMap时,就会去更新该map,比如ReferenceQueue中的key-value,将其中包含的key-value全部删除掉。这就是所谓的“自动删除”。

18.JAVA8的ConcurrentHashMap为什么放弃了分段锁,有什么问题吗,如果你来设计,你如何设计。
答案:1加入多个分段锁浪费内存空间。2生产环境中, map 在放入时竞争同一个锁的概率非常小,分段锁反而会造成更新等操作的长时间等待。3为了提高 GC 的效率

19.抽象类和接口的区别,类可以继承多个类么,接口可以继承多个接口么,类可以实现多个接口么。

20.IO模型有哪些,讲讲你理解的nio ,他和bio,aio的区别是啥,谈谈reactor模型。

21.反射的原理,反射创建类实例的三种方式是什么。
答案:1实际在告诉我们任何一个类都有一个隐含的静态成员变量class Class class1 = Foo.class;
2已经知道该类的对象通过getClass方法 Class class2 = foo1.getClass();
3第三种表达方式 class3 = Class.forName(“com.imooc.reflect.Foo”);

22.反射中,Class.forName和ClassLoader区别 。
答案:前者Class.forName(className,true,classloader); 第2个boolean参数表示类是否需要初始化, Class.forName(className)默认是需要初始化。
一旦初始化,就会触发目标对象的 static块代码执行,static参数也会被再次初始化。
后者:ClassLoader.loadClass(className)第2个 boolean参数,表示目标对象是否进行链接,false表示不进行链接,由上面介绍可以,
不进行链接意味着不进行包括初始化等一些列步骤,那么静态块和静态对象就不会得到执行

23.写出三种单例模式实现 。
答案 饿汉式单例(优点:没有加锁,执行效率会提高 缺点:类加载时就初始化,浪费内存)
懒汉式单例(优点:第一次调用才初始化,避免内存浪费。
缺点:必须加锁synchronized 才能保证单例,(如果两个线程同时调用getInstance方法,会chuxia)但加锁会影响效率。)
登记式模式(内部类只有在外部类被调用才加载,产生SINGLETON实例;又不用加锁。此模式有上述两个模式的优点,屏蔽了它们的缺点,是最好的单例模式。)

24.请结合OO设计理念,谈谈访问修饰符public、private、protected、default在应用设计中的作用。
public–都可访问(公有)
private–类内可访问(私有)
protected–包内和子类可访问(保护)
不写(default)–包内可访问 (默认)

25.数组和链表数据结构描述,各自的时间复杂度。
答案:由于数字可以使用二分查找法(快速查找法)而链表却没有快速查找法,所以在时间复杂度上占劣势(arrayList与LinkList的区别)

26.请列出5个运行时异常。
答案:
ClassCastException(类转换异常)
IndexOutOfBoundsException(数组越界)
NullPointerException(空指针)
ArrayStoreException(数据存储异常,操作数组时类型不一致)
还有IO操作的BufferOverflowException异常

27.什么是序列化,怎么序列化,为什么序列化,反序列化会遇到什么问题,如何解决。
答案:序列化是一种用来处理对象流的机制 ,所谓对象流就是将对象的内容进行流化。
序列化是为了解决在对对象流进行读写操作时所引发的问题。
序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流;
28.java8的新特性。
JVM知识
29.什么情况下会发生栈内存溢出。
答案:栈是线程私有的,他的生命周期与线程相同,每个方法在执行的时候都会创建一个栈帧,用来存储局部变量表,操作数栈,动态链接,方法出口灯信息。局部变量表又包含基本数据类型,对象引用类型(局部变量表编译器完成,运行期间不会变化)
所以我们可以理解为栈溢出就是方法执行是创建的栈帧超过了栈的深度。那么最有可能的就是方法递归调用产生这种结果。
30.JVM内存为什么要分成新生代,老年代,持久代。新生代中为什么要分为Eden和Survivor。
31.什么是运行时异常?
答案:运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常
32.JVM中一次完整的GC流程是怎样的,对象如何晋升到老年代,说说你知道的几种主要的JVM参数?
33.你知道哪几种垃圾收集器,各自的优缺点,重点讲下cms和G1,包括原理,流程,优缺点。
34.垃圾回收算法的实现原理。
35.当出现了内存溢出,你怎么排错。
36.讲讲JAVA的反射机制。
37.你们线上应用的JVM参数有哪些。
-XX:CMSInitiatingPermOccupancyFraction:当永久区占用率达到这一百分比时,启动CMS回收
-XX:CMSInitiatingOccupancyFraction:设置CMS收集器在老年代空间被使用多少后触发
-XX:+CMSClassUnloadingEnabled:允许对类元数据进行回收
-XX:CMSFullGCsBeforeCompaction:设定进行多少次CMS垃圾回收后,进行一次内存压缩
-XX:NewRatio:新生代和老年代的比
-XX:ParallelCMSThreads:设定CMS的线程数量
-XX:ParallelGCThreads:设置用于垃圾回收的线程数
-XX:SurvivorRatio:设置eden区大小和survivior区大小的比例
-XX:+UseParNewGC:在新生代使用并行收集器
-XX:+UseParallelGC :新生代使用并行回收收集器
-XX:+UseParallelOldGC:老年代使用并行回收收集器
-XX:+UseSerialGC:在新生代和老年代使用串行收集器
-XX:+UseConcMarkSweepGC:新生代使用并行收集器,老年代使用CMS+串行收集器
-XX:+UseCMSCompactAtFullCollection:设置CMS收集器在完成垃圾收集后是否要进行一次内存碎片的整理
-XX:UseCMSInitiatingOccupancyOnly:表示只在到达阀值的时候,才进行CMS回收
-Xms:设置堆的最小空间大小。
-Xmx:设置堆的最大空间大小。
-XX:NewSize设置新生代最小空间大小。
-XX:MaxNewSize设置新生代最大空间大小。
-XX:PermSize设置永久代最小空间大小。
-XX:MaxPermSize设置永久代最大空间大小。
-Xss:设置每个线程的堆栈大小
-XX:NewRatio设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
38.JVM的运行顺序
答案:类加载器:Class字节码文件加载到内存
执行引擎:解析字节码指令,得到执行结果
运行时数据区

开源框架知识
39.tomcat如何调优,涉及哪些参数 。
40.讲讲Spring加载流程。
答案:ClassPathXmlApplicationContext实现beanFactory接口,是一个具体的实例化工厂。服务器启动时,解析xml配置文件,将对应文件中每个bean的id作为key,属性封装到beandefinition(是个对象)作为value,封装到一个ConCurrentHashMap容器A中。
同时,还有一个ConCurrentHashMap容器B存储bean的实例化对象,默认是空。当有一个请求时,首先去B中,查找。如果B容器没有,则访问A容器,如果是单例,则创建之后,仍要保存到B中,下次可以使用。如果是非单例的,则直接创建,并不在B中保存副本。
41.Spring AOP 和IOC的实现原理。
答案:IOC是指容器控制程序对象之间的关系,而不是我们传统实现中,由程序代码直接操作。控制权由应用代码转到外部容器,控制权的转移是所谓反转对于Spring而言,就是由Spring来控制对象的生命周期和对象之间的关系;IOC还有另外一个名字–“依赖注入”,从名字上理解,所谓依赖注入,即组件之间的依赖关系由容器在运行期决定,即由容器动态的将某种依赖关系注入到组件中去。
在Spring的工作方式中,所有类都会在Spring容器中登记,告诉Spring这是个什么东西,你需要什么东西,然后Spring会在系统运行到适当的时候,把你需要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由Spring来控制,也就是说控制对象生命周期的不再是引用它的对象,而是Spring,对于某个具体的对象而言,以前是它控制其他对象,现在是所有的对象都被Spring控制,所以这叫控制反转。
依赖注入的思想是通过反射机制实现的,在实例化一个类时,它通过反射调用类中set方法将事先保存在HashMap中的类属性注入到类中,总而言之,在传统的对象创建方式中,通常由调用者来创建被调用者的实例,而在Spring中创建被调用者的工作由Spring来完成,然后注入调用者,即所谓的依赖注入or控制反转。注入方式有两种:依赖注入和设置注入;IOC的优点:降低了组件之间的耦合,降低了业务对象之间替换的复杂性,使之能够灵活的管理对象。
AOP
1、AOP面向切面编程是基于IOC,是对OOP的有益补充。
2、AOP利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响对个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。所谓“方面”,简单的就是说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,比如日志记录,便于减少系统的重复代码,降低模块的耦合度,并有利于未来的可操作性和可维护性。
3、AOP代表的是一个横向的关系,将“对象”比作一个空心的圆柱体,其中封装的是对象的属性和行为;则面向方面编程的方法,就是将这个圆柱体以切面形式剖开,选择性的提供业务逻辑。而剖开的切面,也就是所谓的“方面”了,然后它又以巧夺天工的妙手将这些剖开的切面复原,不留痕迹,但完成了效果。
4、实现AOP的技术,主要分为两大类:一类是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象的执行;而是采用静态植入的方式,引入特定的语法创建“方面”,从而使得编辑器可以在编制期间植入有关“方面”的代码。
5、Spring实现AOP:JDK动态代理和CGLIB代理 JDK动态代理:其代理对象必须是某个接口的实现,它是通过在运行期间创建一个接口的实现类来完成对目标对象的代理;其核心的两个类是InvocationHandler和Proxy。 CGLIB代理:实现原理类似于JDK动态代理,只是它在运行期间生成的代理对象是针对目标类扩展的子类。CGLIB是高效的代码生成包,底层是依靠ASM(开源的java字节码编辑类库)操作字节码实现的,性能比JDK强;需要引入包asm.jar和cglib.jar。 使用AspectJ注入式切面和@AspectJ注解驱动的切面实际上底层也是通过动态代理实现的。
6、 AOP使用场景:
Authentication 权限检查
Caching 缓存
Context passing 内容传递
Error handling 错误处理
Lazy loading 延迟加载
Debugging 调试
logging, tracing, profiling and monitoring 日志记录,跟踪,优化,校准
Performance optimization 性能优化,效率检查
Persistence 持久化
Resource pooling 资源池
Synchronization 同步
Transactions 事务管理
另外Filter的实现和struts2的拦截器的实现都是AOP思想的体现。讲讲Spring事务的传播属性。
42.Spring如何管理事务的。
答案: Spring事务管理主要包括3个接口,Spring事务主要由以下三个共同完成的:
PlatformTransactionManager:事务管理器(commit rollback getTransaction)
TransacitonDefinition:事务定义信息(getIsolationLevel getPropagationBehavior getTimeout isReadOnly)
TransationStatus:事务具体运行状态(hasSavepoint() isNewTransaction() )
43.Spring怎么配置事务(具体说出一些关键的xml 元素)。
答案:配置事务的方法有两种:1)、基于XML的事务配置。2)、基于注解方式的事务配置。
铺垫:1)、spring的事务管理是通过Aop的方式来实现。2)、声明式事务是spring对事务管理的最常用的方式,因为这种方式对代码的影响最小,因此也就符合非侵入式的轻量级的容器的概念;
44.说说你对Spring的理解,非单例注入的原理?它的生命周期?循环注入的原理,aop的实现原理,说说aop中的几个术语,它们是怎么相互工作的。
45.springboot启动机制。
46.spring的controller是单例还是多例,怎么保证并发的安全
多线程
47.使用synchronized修饰静态方法和非静态方法有什么区别
48.延迟队列的实现方式,delayQueue和时间轮算法的异同。
TCP与HTTP
49.HTTPS的加密方式是什么,讲讲整个加密解密流程。
50.HTTP的长连接是什么意思。
51.Http和https的三次握手有什么区别。
52.什么是分块传送。
53.Session和cookie的区别。
架构设计与分布式
54.如何使用redis和zookeeper实现分布式锁?有什么区别优缺点,会有什么问题,分别适用什么场景。(延伸:如果知道redlock,讲讲他的算法实现,争议在哪里)

55.分布式事务的原理,优缺点,如何使用分布式事务,2pc 3pc 的区别,解决了哪些问题,还有哪些问题没解决,如何解决,你自己项目里涉及到分布式事务是怎么处理的。
56.Dubbo的原理,有看过源码么,数据怎么流转的,怎么实现集群,负载均衡,服务注册
57.一次RPC请求的流程是什么。
58.如何实现负载均衡,有哪些算法可以实现。
59.Zookeeper的用途,选举的原理是什么。
60.Zookeeper watch机制原理。
数据库知识
61.Mybatis的底层实现原理。
62.MySQL性能优化之索引优化
答案:Mysql索引主要有两种结构:B-Tree索引和Hash索引.
选择索引时1越小的数据类型通常更好2简单的数据类型更好3尽量避免NULL
63.后台系统怎么防止请求重复提交。
64.数据库隔离级别有哪些,各自的含义是什么,MYSQL默认的隔离级别是是什么。
65.什么是幻读。
66.MYSQL有哪些存储引擎,各自优缺点。
答案:处理事务安全表的引擎(InnoDB )和处理非事务安全表的引擎
InnoDB,MyISAM,Memory,Merge,Archive,Federate,CSV,BLACKHOLE等。可以使用SHOW ENGINES
MEMORY存储引擎为查询和引用其他表数据提供快速访问
67.高并发下,如何做到安全的修改同一行数据。
68.SQL优化的一般步骤是什么,怎么看执行计划,如何理解其中各个字段的含义。
69.某个表有近千万数据,CRUD比较慢,如何优化。
消息队列
70.用过哪些MQ,和其他mq比较有什么优缺点,MQ的连接是线程安全的吗,你们公司的MQ服务架构怎样的。
答案:kafka
71.MQ系统的数据如何保证不丢失。
72.rabbitmq如何实现集群高可用。
73.kafka吞吐量高的原因。
答案:Kafka的设计目标是高吞吐量,它比其它消息系统快的原因体现在以下几方面:
1、Kafka操作的是序列文件I / O(序列文件的特征是按顺序写,按顺序读),为保证顺序,Kafka强制点对点的按顺序传递消息,这意味着,一个consumer在消息流(或分区)中只有一个位置。
2、Kafka不保存消息的状态,即消息是否被“消费”。一般的消息系统需要保存消息的状态,并且还需要以随机访问的形式更新消息的状态。而Kafka 的做法是保存Consumer在Topic分区中的位置offset,在offset之前的消息是已被“消费”的,在offset之后则为未“消费”的,并且offset是可以任意移动的,这样就消除了大部分的随机IO。
3、Kafka支持点对点的批量消息传递。
4、Kafka的消息存储在OS pagecache(页缓存,page cache的大小为一页,通常为4K,在Linux读写文件时,它用于缓存文件的逻辑内容,从而加快对磁盘上映像和数据的访问)
74.kafka 和其他消息队列的区别,kafka 主从同步怎么实现。
75.利用mq怎么实现最终一致性。
76.使用kafka有没有遇到什么问题,怎么解决的。
77.MQ有可能发生重复消费,如何避免,如何做到幂等。
78.MQ的消息延迟了怎么处理,消息可以设置过期时间么,过期了你们一般怎么处理。
答案:定时消息:Producer 将消息发送到 MQ 服务端,但并不期望这条消息立马投递,而是推迟到在当前时间点之后的某一个时间投递到 Consumer 进行消费,该消息即定时消息。
延迟消息:Producer 将消息发送到 MQ 服务端,但并不期望这条消息立马投递,而是延迟一定时间后才投递到 Consumer 进行消费,该消息即延时消息。

79.常见的缓存策略有哪些,如何做到缓存(比如redis)与DB里的数据一致性,你们项目中用到了什么缓存系统,如何设计的。
缓存
80.什么是redis?Redis 在 Java Web 中的应用?
答案:缓存数据库,和数据库别无二致,只是存在于内存中(一般电脑8G),并提供了一定的持久化
Redis 在 Java Web 主要有两个应用场景:
存储 缓存 用的数据;(只是使用 Redis 存储一些常用和主要的数据,比如用户登录的信息等。)
需要高速读/写的场合使用它快速读/写;
业务数据常用吗?命中率如何?如果命中率很低,就没有必要写入缓存;
该业务数据是读操作多,还是写操作多?如果写操作多,频繁需要写入数据库,也没有必要使用缓存;
业务数据大小如何?如果要存储几百兆字节的文件,会给缓存带来很大的压力,这样也没有必要;

81.redis的list结构相关的操作。
答案:List数据结构是链表结构,这意味这无论数据量多大,头尾操作数据还是很快的,list的容量是2的32次方减1个元素,即4294967295个元素数量。
82.Redis的数据结构都有哪些。
答案: 支持丰富数据类型,支持string,list,set,sorted set,hash
83.Redis的使用要注意什么,讲讲持久化方式,内存设置,集群的应用和优劣势,淘汰策略等。
答案:支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
84.当前redis集群有哪些玩法,各自优缺点,场景。
85.Redis的选举算法和流程是怎样的。
86.Redis的线程模型是什么。
87.elasticsearch了解多少,说说你们公司es的集群架构,索引数据大小,分片有多少,以及一些调优手段 。elasticsearch的倒排索引是什么。
答案:如实结合自己的实践场景回答即可。
比如:ES集群架构13个节点,索引根据通道不同共20+索引,根据日期,每日递增20+,索引:10分片,每日递增1亿+数据,每个通道每天索引大小控制:150GB之内。
88.elasticsearch是如何实现master选举的。
答案:Elasticsearch的选主是ZenDiscovery模块负责的,主要包含Ping(节点之间通过这个RPC来发现彼此)和Unicast(单播模块包含一个主机列表以控制哪些节点需要ping通)这两部分;
对所有可以成为master的节点(node.master: true)根据nodeId字典排序,每次选举每个节点都把自己所知道节点排一次序,然后选出第一个(第0位)节点,暂且认为它是master节点。
如果对某个节点的投票数达到一定的值(可以成为master节点数n/2+1)并且该节点自己也选举自己,那这个节点就是master。否则重新选举一直到满足上述条件。
补充:master节点的职责主要包括集群、节点和索引的管理,不负责文档级别的管理;data节点可以关闭http功能。
1)只有候选主节点(master:true)的节点才能成为主节点。
2)最小主节点数(min_master_nodes)的目的是防止脑裂。
这个我看了各种网上分析的版本和源码分析的书籍,云里雾里。
核对了一下代码,核心入口为findMaster,选择主节点成功返回对应Master,否则返回null。选举流程大致描述如下:

第一步:确认候选主节点数达标,elasticsearch.yml设置的值discovery.zen.minimum_master_nodes;
第二步:比较:先判定是否具备master资格,具备候选主节点资格的优先返回;若两节点都为候选主节点,则id小的值会主节点。注意这里的id为string类型。
89.详细描述一下Elasticsearch索引文档的过程。
答案:  约定:Shard用于表示Lucene索引;Index指elasticsearch的索引,由一个或多个主分片Shard和副本Shard组成
通过使用 index API ,文档可以被索引 —— 存储和使文档可被搜索 。 但是首先,我们要确定文档的位置。一个文档的 _index 、 _type 和 _id 唯一标识一个文档。 我们可以提供自定义的_id值,或者让index API自动生成。
90.详细描述一下Elasticsearch搜索的过程。、
答案:1 Query阶段可以知道,一个搜索会遍历这个索引下的所有分片,每个分片都会执行一次搜索,并返回相同数量的文档ID。比如搜索条件要查询5条数据,有5个分片,则最终会查询25条数据,排序后取前面5条数据
2 查询和计算权重得分在Lucene完成,聚合是在ES中实现的
3 搜索会遍历所有的分片,所以分片的数量影响着搜索的性能,而分片的数量也决定了ES能承载的最大数据量。所以在具体的应用中,需要在二者之间选择平衡
4 计算文档权重得分,每搜索一次,都会根据搜索条件重新计算一次,对搜索性能影响很大

SpringCloud+SpringBoot相关
91.什么是Spring Cloud?
答案:是基于Spring Boot的Spring集成应用程序,提供与外部系统的集成。Spring cloud Task,一个生命周期短暂的微服务框架,用于快速构建执行有限数据处理的应用程序。
92.使用Spring Cloud有什么优势?
答案:1与分布式系统相关的复杂性-这种开销包括网络问题,延迟开销,带宽问题,安全问题。
2服务发现-服务发现工具管理群集中的流程和服务如何查找和互相交谈。它涉及一个服务目录,在该目录中注册服务,然后能够查找并连接到该目录中的服务。
3冗余-分布式系统中的冗余问题。
4负载平衡 --负载平衡改善跨多个计算资源的工作负荷,诸如计算机,计算机集群,网络链路,中央处理单元,或磁盘驱动器的分布。
5性能-问题 由于各种运营开销导致的性能问题。
6部署复杂性-Devops技能的要求。
93.服务注册和发现是什么意思?Spring Cloud如何实现?
答案: 服务在发布时 指定对应的服务名(服务名包括了IP地址和端口) 将服务注册到注册中心(eureka或者zookeeper)这一过程时springcloud自动实现 只需要在main方法添加@EnableDisscoveryClient 同一个服务修改端口就可以启动多个实例
调用方法:传递服务名称通过注册中心获取所有的可用实例,通过负载均衡策略调用(ribbon和feign)对应的服务
94.mybatis批量保存的两种方式
答案: 1.使用mybatis foreach标签(allowMutiQueries=true的) 2 mybatis ExecutorType.BATCH

95.如何设置隔离级别
1.READ_UNCOMMITED 读取未提交, 它引发所有的隔离问题
2.READ_COMMITTED 读已提交, 阻止脏读,可能发生不可重复读与虚读.
3.REPEATABLE_READ 重复读 阻止脏读,不可重复读 可能发生虚读
4.SERIALIZABLE 串行化 解决所有问题 不允许两个事务,同时操作一个目标数据。(效率低下
ORACLE 默认的是事务隔离级别 READ_COMMITTED
MYSQL 默认的事务隔离级别 REPEATABLE_READ
96.Hibernate提供了三种管理session的方式:
答案:1.Session对象的生命周期与本地线程绑定(ThreadLocal)
2.Session对象的生命周期与JTA事务绑定(分布式事务管理)
3.Hibernate委托程序来管理Session的生命周期
97.Spring事务管理
答案:1aop:config定义一个事务2注解式管理事务
事务的方法或者类上添加@Transactional
1)、事务的传播性:@Transactional(propagation=Propagation.REQUIRED)
(REQUIRED , SURPPORTED ,NOT_SURPPORTED,MANDATORY,NEVER,REQUIRED_NEW,NESTED)
(2)、事务的超时性:@Transactional(timeout=30) //默认是30秒
(3)、事务的隔离级别:@Transactional(isolation = Isolation.READ_UNCOMMITTED)
(4)、回滚:
指定单一异常类:@Transactional(rollbackFor=RuntimeException.class)
指定多个异常类:@Transactional(rollbackFor={RuntimeException.class, Exception.class})
(5)、只读:@Transactional(readOnly=tru
传播级别:
1)、REQUIRED
如果当前方法已经在事务中,那么就以父事务执行,不需要新建事务;如果当前方法不在事务中,那么就为当前方法新建事务。回滚情况:父子方法中任何地方出现问题,都会全部回滚。
2)、SURPPORTED
如果当前方法已经在事务中,那么就以当前事务执行;如果当前方法不再事务中,那么就以非事务方式运行。如果运行在事务中,那么只要出现异常都会回滚。
3)、NOT_SURPPORTED
如果当前方法已经在事务中,那么就挂起当前事务,以非事务方式运行,方法执行完毕后,恢复事务;如果当前方法不再事务中,那么就以非事务方式执行。
4)、MANDATORY
强制以事务方式执行,如果当前方法不在事务中,那么会抛出异常。
5)、NEVER
与MANDATORY相反,强制以非事务方式执行,如果当前方法在事务中,那么会抛出异常。
6)、REQUIRED_NEW
与REQUIRED不同的是,无论该方法当前是不是在事务中,都会为自己新建一个事务。如果当前已经在事务中,那么会挂起父事务,为自己新建一个事务。父事务不影响它子事务的提交和回滚。
7)、NESTED
嵌套事务。理解Nested的关键是savepoint。他与PROPAGATION_REQUIRES_NEW的区别是,PROPAGATION_REQUIRES_NEW另起一个事务,将会与他的父事务相互独立,而Nested的事务和他的父事务是相依的,他的提交是要等和他的父事务一块提交的。也就是说,如果父事务最后回滚,他也要回滚的。而Nested事务的好处是他有一个savepoint。
98.加密算法全集
答案:对称的(DES,3DES,AES) 非对称的(RSA DSA ECC) 哈希算法(MD5 SHA)
99.1OC](这里写自定义目录标题)

欢迎使用Markdown编辑器

你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

新的改变

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

  1. 全新的界面设计 ,将会带来全新的写作体验;
  2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
  3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
  4. 全新的 KaTeX数学公式 语法;
  5. 增加了支持甘特图的mermaid语法1 功能;
  6. 增加了 多屏幕编辑 Markdown文章功能;
  7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
  8. 增加了 检查列表 功能。

功能快捷键

撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G
查找:Ctrl/Command + F
替换:Ctrl/Command + G

合理的创建标题,有助于目录的生成

直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

如何改变文本的样式

强调文本 强调文本

加粗文本 加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210 运算结果是 1024.

插入链接与图片

链接: link.

图片: Alt

带尺寸的图片: Alt

居中的图片: Alt

居中并且带尺寸的图片: Alt

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block
var foo = 'bar';

生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

项目Value
电脑$1600
手机$12
导管$1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列第二列第三列
第一列文本居中第二列文本居右第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPEASCIIHTML
Single backticks'Isn't this fun?'‘Isn’t this fun?’
Quotes"Isn't this fun?"“Isn’t this fun?”
Dashes-- is en-dash, --- is em-dash– is en-dash, — is em-dash

创建一个自定义列表

Markdown
Text-to- HTML conversion tool
Authors
John
Luke

如何创建一个注脚

一个具有注脚的文本。2

注释也是必不可少的

Markdown将文本转换为 HTML

KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n1)!nN 是通过欧拉积分

Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=0tz1etdt.

你可以找到更多关于的信息 LaTeX 数学表达式here.

新的甘特图功能,丰富你的文章

Mon 06 Mon 13 Mon 20 已完成 进行中 计划一 计划二 现有任务 Adding GANTT diagram functionality to mermaid
  • 关于 甘特图 语法,参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:

张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

这将产生一个流程图。:

链接
长方形
圆角长方形
菱形
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

Created with Raphaël 2.2.0 开始 我的操作 确认? 结束 yes no
  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。


  1. mermaid语法说明 ↩︎

  2. 注脚的解释 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值