基本功 =》同样的流程 别人的解释*=》基础二
-
面向对象的特征
四个基本特征:抽象,继承, 封装, 多态
抽象: 就好比用程序描述一个人,肯定得抽象的通过(身高,体重,年龄 , 胖瘦)这些属性去体现出来
继承:extends , 则拥有父类的方法,且可以覆盖和调用父类参数
封装:通常get set 实体类方法 抽象性函式接口的实现细节部份包装、隐藏起来的方法 优点:良好的封装能够减少耦合 、类内部的结构可以自由修改、可以对成员变量进行更精确的控制、隐藏信息,实现细节 <还有一种技术:lombok > 这种方式使得对象类更简洁, 但是可读性和维护性没那么好
多态: 貌似封装,继承 都是为了更好的展现多态,就像多个方法创建该对象,但能同时相应实现你要的功能信息,在或者 根据发送对象的不同而采用多种不同的行为方式,好处:降低耦合度 -
final, finally, finalize 的区别
final: 修饰符关键字,一个类被final定义了,则不能被子类(extends 继承)了,所以类不能abstract(abstract 抽象类修饰符,且和接口相似,接口interface (子类implements 实现) 。子类如果实现抽象父类的方法,则子类可以不为抽象类,反之必须设为抽象子类,且都不能被实例化)一个类参数被它定义了, 子类只能使用功不能修改其值,并且必须赋上初始值、
finally: 不管有没有异常被抛出、捕获,finally块都会执行,一般进行一些关闭流,连接等
finalize: 通常没用的对象,gc回收机制会自动回收,这方法用于处理特殊占用内存的对象等,不能自动回收,并且这个方法不会判断该对象是否已经执行完成,存在一定代价 -
int 和 Integer 有什么区别
integer 是int的包装类,且称引用类型,int 是java的基本数据类型【装箱-拆箱 数据类型转换】(byte、short、int、long、float、double、char、boolean)
整型 【byte、short、int、long】
byte的取值范围为-128~127,占用1个字节(-2的7次方到2的7次方-1)
short的取值范围为-32768~32767,占用2个字节(-2的15次方到2的15次方-1)
int的取值范围为(-2147483648~2147483647),占用4个字节
long的取值范围为(-922337203…~9223372),占用8个字节
浮点型
float 3.402823e+38 ~ 1.401298e-45 占用4个字节
double 1.797693e+308~ 4.9000000e-324 占用8个字节
char型(文本型 用于存放字符的数据类型,占用2个字节)
boolean型: true false -
重载和重写的区别
重载:同一个类里面创建相同方法名,参数个数-类型-返回类型可以不同
重写: 一般指子类通过【继承类-实现接口】重写父类方法,访问级别不能低于父类(public private-子类不可访问 privated-子类可访问 ) -
抽象类:abstract抽象符-extends继承,因为抽象类中含有无具体实现的方法-不能被实例化,一般作为子类的超类,模板那种形式
接口: interface 行为的抽象 子类实现 implements 且对父类方法进行拓展, 重写
区别: 1 接口无静态代码块以及静态方法 ,2 抽象类有 继承只能继承一个,接口可以实现多个,抽象类是对一种事物属性的抽象,即对类抽象,而接口是对行为的抽象
静态方法 说明:
public class Test {
static {
System.out.println("静态块");
}
{
System.out.println("构造块,在类中定义");
}
public Test() {
System.out.println("无参构造方法执行");
}
public Test(String str) {
System.out.println("有参构造方法执行"+str);
}
public static void main(String[] args) {
new Test();
// new Test("111");
}
}
静态块
构造块,在类中定义
无参构造方法执行
-
说说反射的用途及实现
反射对我们提供了很多方便之处,提高方法方法响应时间,简化代码,通过反射可以得到实例对象,可以获取到对应类的所有方法及对应方法的参数, 不同请求可以迅速匹配方法,根据参数自动选择跳转
运用实例:Spring框架用到,在或者接口(一个方法入口通过参数对比 ,跳转到不同的方法) -
说说自定义注解的场景及实现
ORM: 对象关系映射 通过对象和数据库之间映射的元数据,持久化到关系数据库中
注解的好处: 简化代码,使用方便,节省配-减少配置文件的大小,编译就能查看是否正确-提高效率, 缺点: 易读性差,耦合度高,修改必须重新编译
分为:元注解:@Retention、@Inherited、@Documented、 @Target 和 自定义注解
实现: 待 -
HTTP 请求的 GET 与 POST 方式的区别
Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是资源描述符:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。- Get 以?分割URL和传输数据 – POST把提交的数据则放置在是HTTP包的包体中。
- Get参数限制泛指Url长度 – Post 对大小没限制
- Post 的安全性比Get好 (1) Get参数可见 (2) 你的敏感信息可能会被缓存 (3) Get可能会造成Cross-site request forgery攻击(中文名称:跨站请求伪造)
也就说假如用户登录A网站,更新了一个后台数据,同时点击了B网站链接,B网站就能获取到A网站带过去的用户cookie信息, 在B网站中就能CSRF攻击代码访问网站A。
-
session 与 cookie 区别
为什么有cookie存在: 首先它是解决浏览器会话跟踪,浏览器保存信息及处理用户浏览信息(用户浏览推荐等功能实现) (1、 同一个网站 犹如A用户 第一次在购物车添了个商品,B用户访问也填了个商品, A在添加的时候网站无法判断该放到谁购物车里)
创建方式:HTTP的响应头中加上一行特殊的指示以提示, JavaScript或者VBScript也可以生成cookie 获取方式:request.getCookies();==》 得到cookies数组
单个cookie保存的数据一般不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
浏览器按照指示生成相应的cookie
Session: 是一种服务端的机制,服务器使用一种类似散列表的结构来保存信息、服务器首先检查这个客户端里的请求里是否已包含了一个session标识–sessionID 有就不创建, 没有则会创建一个新的sessionid , 并且会带回客户端,sessionid 保存方式(Cookie,URL重写,隐藏表单提交),最方便的还是cookie,其他两种方式都各有弊端
区别:- Cookie数据存客户的浏览器(本地),session数据放在服务器上
- Cookie不如session安全 本地能分析获取
- session中保存的是对象,cookie中保存的是字符串
- session不能区分路径,同一个用户在访问一个网站期间 虽然cookie可以设置同一路径,但不同浏览器访问可能不大好
- session 占用服务器资源 ,cookie占本地内存 貌似一般有限制 大小个数
session 和Cookie 的关系:简单来说,当第一次request server时,server产生JSESSIONID对应的值1,通过http header set-cookie,传递给browser,browser检测到http response header 里带set-cookie,那么browser就会create一个cookie,key=JSESSIONID,value=值1,而后的每次请求,browser都会把cookie里的键值对放到http request header里,传递给server。
当在server端调用http.getSession()方法时,server会先从http request header里解析出来JSESSIONID的值,再从一个Map容器里去找有没有value,如果没有,就会产生一个HttpSessioon对象,放到这个Map容器里,同时设置一个最大生存时间。HttpSession你也可以把它想象成是一个Map,可以getAttribute(),可以setAttribute()。
springMvc - Session = getRequest().getSession() = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest()
Session.setAttributes(“user”,user);
-
分布式Session的几种实现方式- 详1=详2=详3
第一种:粘性session
第二种:服务器session复制
第三种:session共享机制
第四种:session持久化到数据库
第五种terracotta实现session复制
广泛:第三种 缓存(memcached、redis)机制 第五中可研究 详见-详1
思想流程: 集群中的某一台机器上获取到sessionid 然后在处理 (根据key去redis或memcache中存取值,并缓存到本机内存 === 使某台获取到用户第一次访问,标识以后当前用户操作都到这台机器上边) -
JDBC 流程
第一步:加载Driver类,注册数据库驱动;
第二步:通过DriverManager,使用url,用户名和密码建立连接(Connection);
第三步:通过Connection,使用sql语句打开Statement对象;
第四步:执行语句,将结果返回resultSet;
第五步:对结果resultSet进行处理;
第六步:倒叙释放资源resultSet-》preparedStatement-》connection。
//第一步:加载Driver类,注册数据库驱动
Class.forName(JDBC_DRIVER);
//第二步:通过DriverManager,使用url,用户名和密码建立连接(Connection)
connection = DriverManager.getConnection(JDBC_URL, JDBC_USERNAME, JDBC_PASSWORD);
//第三步:通过Connection,使用sql语句打开Statement对象;
preparedStatement = connection.prepareStatement("select * from student where age =?");
//传入参数,之所以这样是为了防止sql注入
preparedStatement.setInt(1, 18);
//第四步:执行语句,将结果返回resultSet
resultSet = preparedStatement.executeQuery();
//第五步:对结果进行处理
-
MVC 设计思想
解释:MVC英文即Model-View-Controller,即把一个应用的输入、处理、输出流程按照Model、View、Controller的方式进行分离,这样一个应用被分成三个层——模型层、视图层、控制层。 三层架构
视图(View)代表用户交互界面,对于Web应用来说,可以概括为HTML界面,但有可能为XHTML、XML和Applet
模型(Model):根据业务设计字段,用于实体对象的数据 保存(持续化)
控制(Controller):模型和视图之间的纽带, 可以理解为从用户接收请求, 将模型与视图匹配在一起,经过打磨后 共同完成用户的请求。 请求–》处理 --》 转发响应信息,跳转对应页面优点:MVC设计模式结构清晰,可以方便开发人员分工协作,提高开发效率,增强程序的可维护性和拓展性,而且还利用Controller将Model与View分离,降低它们之间的耦合度 《会增加代码量、相应地也会增加软件开发的成本》
-
equals 与 == 的区别
== 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。
equals用来比较的是两个对象的内容是否相等 -
泛型详解
泛型是一种参数化类型的机制。它可以使得代码适用于各种类型,从而编写更加通用的代码,例如集合框架。
泛型是一种编译时类型确认机制。它提供了编译期的类型安全,确保在泛型类型(通常为泛型集合)上只能使用正确类型的对象,避免了在运行时出现ClassCastException。
泛型有三种使用方式,分别为:泛型类、泛型接口、泛型方法
public class Test2<T> {
public static <T >T show(T one){//这是正确的
return null;
}
}
-
Java中的四种引用及其应用场景是什么?
1. 强引用: 通常我们使用new操作符创建一个对象时所返回的引用即为强引用
2. 软引用: 若一个对象只能通过软引用到达,那么这个对象在内存不足时会被回收,可用于图片缓存中,内存不足时系统会自动回收不再使用的Bitmap
3. 弱引用: 若一个对象只能通过弱引用到达,那么它就会被回收(即使内存充足),同样可用于图片缓存中,这时候只要Bitmap不再使用就会被回收
4. 虚引用: 虚引用是Java中最“弱”的引用,通过它甚至无法获取被引用的对象,它存在的唯一作用就是当它指向的对象回收时,它本身会被加入到引用队列中,这样我们可以知道它指向的对象何时被销毁。 -
object中定义了哪些方法?
clone() : 想要产生一个新对象p2与原来对象p1具有相同的内容 最理想的方法就是调用clone方法,而不需要去先new出一个对象出来,
equals() : 判断两个值是否相等
hashCode() : java.util.Hashtable 提供的哈希表 hashCode是用来在散列存储结构中确定对象的存储地址的
toString() : 强制转换为字符串
notify() : 唤醒线程锁
notifyAll() : 唤醒所有线程锁
wait() : 霸占车道睡觉, 后面的线程都过不去(sleep 睡眠) 靠边停车 等别人过了之后在过
finalize() : 处理一些gc无法进行垃圾回收的时候调用该方法强制回收
getClass() : 用到了java反射机制, 利用这个方法就可以获得一个实例的类型类 - 而class()方法是一个类的方法。 另外getClass()是在运行时才确定的,而class()方法是在编译时就确定了。 -
对于“try-catch-finally”,若try语句块中包含“return”语句,finally语句块会执行吗?
会执行。只有两种情况finally块中的语句不会被执行: -
调用了System.exit()方法;2. JVM“崩溃”了。
***集合***
-
List、Set、Map的区别——跳转博客比较详细
-
list和set是实现了collection接口 ,Map则不是
-
List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉
-
Set和List对比:
Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。
List:底层就是数组,是可变长度数组,查找元素效率高,插入删除元素效率低,因为会引起其他元素下标改变 -
线程安全集合类与非线程安全集合类
LinkedList、ArrayList、HashSet是非线程安全的,Vector是线程安全的;
HashMap是非线程安全的,HashTable是线程安全的;
StringBuilder是非线程安全的,StringBuffer是线程安全的 . -
Arraylist 与 LinkedList 区别
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 (LinkedList是双向链表,有next也有previous)
2.对于随机访问get和set,ArrayList觉得优于LinkedList(更具下标查找),因为LinkedList要移动指针(查找是分两半查找,先判断index是在链表的哪一半,然后再去对应区域查找)。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
总结:——效率验证博客
1.对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。对ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配;而对LinkedList而言,这个开销是统一的,分配一个内部Entry对象。
2.在ArrayList的中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的。
3.LinkedList不支持高效的随机元素访问。
4.ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间
LinkedList 涉及二分查找:也就假如 在100个数中查找20 (0-49 50 51-100 20<50 于是 又分 0-24 25 26-50 20<25 在继续 于是不断对比 下标查询之下的高效查询 不知道理解对不) -
ArrayList 与 Vector 区别
1) Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好。
2) 当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样,ArrayList就有利于节约内存空间。 -
HashMap 和 Hashtable 的区别——源码解析
-
HashMap和Hashtable不仅作者不同,而且连父类也是不一样的。HashMap是继承自AbstractMap类,而HashTable是继承自Dictionary类。不过它们都实现了同时实现了map、Cloneable(可复制)、Serializable(可序列化)这三个接口
-
Hashtable比HashMap多提供了elments() 和contains() 两个方法。
-
HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。
-
Hashtable是线程安全的,它的每个方法中都加入了Synchronize方法。在多线程并发的环境下,可以直接使用Hashtable,不需要自己为它的方法实现同步
HashMap不是线程安全的,在多线程并发的环境下,可能会产生死锁等问题。具体的原因在下一篇文章中会详细进行分析。使用HashMap时就必须要自己增加同步处理,
-
遍历方式的内部实现上不同
Hashtable、HashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。 -
Hashtable默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。HashMap默认的初始化大小为16。之后每次扩充,容量变为原来的2倍。
-
HashSet 和 HashMap 区别
A.toCharArray(); 可以把字符串分割成char数组。 -
HashSet实现了Set接口,它不允许集合中出现重复元素
-
HashMap实现了Map接口,Map接口对键值对进行映射。Map中不允许出现重复的键(Key)。Map接口有两个基本的实现TreeMap和HashMap。TreeMap保存了对象的排列次序,而HashMap不能
-
HashMap 和 ConcurrentHashMap 的区别 ——详解
- ConcurrentHashMap是线程安全的,肯定不可能是每个方法加synchronized,那样就变成了HashTable。concurrentHishMap 引入了“分段锁” 的机制,具体可以理解为把一个大的Map拆分成N个小的HashTable,根据key.hashCode()来决定把key放到哪个HashTable中
- HashMap 是非线程安全的,HashTable 是线程安全的,ConcurrentHashMap 也是线程安全的 , 执行速度会比HashTable 快, 他的保存方式 是采用hash算法表的方式计算(hashCode() 方法介绍)存储的,会生成对应的hash key, 同样的三个线程 在HashTable 会同事堵塞在同一个地方,在 ConcurrentHashMap 通过算出不同hash key 所以不会都堵塞在一块
HashMap 的工作原理及代码实现
HashMap的主干是一个Entry数组。Entry是HashMap的基本组成单元
ConcurrentHashMap 的工作原理及代码实现
http/https浏览器请求
1. 浏览器输入网址到页面展示流程分析
首先是底层的网络,因为web就是建立在Internet之上,web的基本协议是HTTP协议,它跑在TCP(TCP是互联网中的传输层协议,提供可靠的链接服务,采用三次握手确认一个连接)上的协议之上,而TCP协议又需要IP协议的支持,IP协议又要由底层链路来支撑,所以我们可以从高到第看到这样一个协议栈 http->tcp->ip->连路层协议
www.google.com.hk,域名也是分为三部分,www是主机名,com.hk算是顶级域名,除了com还有cn,net等。域名后面是端口号默认为80,通常被省略,这是服务器端服务器软件侦听的端口,也是TCP里面一个端口号的值
浏览器中输入网址后,你使用的电脑会发出一个DNS(Domain Name System 域名系统,应用层的协议,其提供域名到IP地址间的解析服)请求(将域名转化为IP地址的请求)
`·······
2. [HTTP/HTTPS 的区别](https://www.cnblogs.com/wqhwe/p/5407468.html)
1. HTTP: 全称是HyperText Transfer Protocol(超文本传输协议),是用于传输诸如HTML的超媒体文档的应用层协议。它被设计用于Web浏览器和Web服务器之间的通信,但它也可以用于其他目的
2. HTTPS :是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL
3. SSL: SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议
HTTPS和HTTP的区别主要如下:
1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
线程
- 创建线程的方式及实现
1、继承Thread类创建线程类
(1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。
(2)创建Thread子类的实例,即创建了线程对象。
(3)调用线程对象的start()方法来启动该线程。
package com.thread;
public class FirstThreadTest extends Thread{
int i = 0;
//重写run方法,run方法的方法体就是现场执行体
public void run()
{
for(;i<100;i++){
System.out.println(getName()+" "+i);
}
}
public static void main(String[] args)
{
for(int i = 0;i< 100;i++)
{
System.out.println(Thread.currentThread().getName()+" : "+i);
if(i==20)
{
new FirstThreadTest().start();
new FirstThreadTest().start();
}
}
}
}
上述代码中Thread.currentThread()方法返回当前正在执行的线程对象。GetName()方法返回调用该方法的线程的名字。
2、通过Runnable接口创建线程类
(1)定义runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。
(2)创建 Runnable实现类的实例,并以此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。
(3)调用线程对象的start()方法来启动该线程。
package com.thread;
public class RunnableThreadTest implements Runnable
{
private int i;
public void run()
{
for(i = 0;i <100;i++)
{
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
public static void main(String[] args)
{
for(int i = 0;i < 100;i++)
{
System.out.println(Thread.currentThread().getName()+" "+i);
if(i==20)
{
RunnableThreadTest rtt = new RunnableThreadTest();
new Thread(rtt,"新线程1").start();
new Thread(rtt,"新线程2").start();
}
}
}
}
线程的执行流程很简单,当执行代码start()时,就会执行对象中重写的void run();方法,该方法执行完成后,线程就消亡了。
3、通过Callable和Future创建线程
(1)创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并且有返回值。
public interface Callable
{
V call() throws Exception;
}
二、创建线程的三种方式的对比
1、采用实现Runnable、Callable接口的方式创建多线程时,
优势是:
线程类只是实现了Runnable接口或Callable接口,还可以继承其他类。
在这种方式下,多个线程可以共享同一个target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU、代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。
劣势是:
编程稍微复杂,如果要访问当前线程,则必须使用Thread.currentThread()方法。
2、使用继承Thread类的方式创建多线程时,
优势是:
编写简单,如果需要访问当前线程,则无需使用Thread.currentThread()方法,直接使用this即可获得当前线程。
劣势是:
线程类已经继承了Thread类,所以不能再继承其他父类。
3、Runnable和Callable的区别
(1) Callable规定(重写)的方法是call(),Runnable规定(重写)的方法是run()。
(2) Callable的任务执行后可返回值,而Runnable的任务是不能返回值的。
(3) call方法可以抛出异常,run方法不可以。
(4) 运行Callable任务可以拿到一个Future对象,表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。通过Future对象可以了解任务执行情况,可取消任务的执行,还可获取执行结果。
sleep() 、join()、yield()有什么区别
说说 CountDownLatch 原理
说说 CyclicBarrier 原理
说说 Semaphore 原理
说说 Exchanger 原理
说说 CountDownLatch 与 CyclicBarrier 区别
ThreadLocal 原理分析
讲讲线程池的实现原理
线程池的几种方式
线程的生命周期
锁机制
说说线程安全问题
volatile 实现原理
synchronize 实现原理
synchronized 与 lock 的区别
CAS 乐观锁
ABA 问题
乐观锁的业务场景及实现方式
核心篇
数据存储
MySQL 索引使用的注意事项
说说反模式设计
说说分库与分表设计
分库与分表带来的分布式困境与应对之策
说说 SQL 优化之道
MySQL 遇到的死锁问题
存储引擎的 InnoDB 与 MyISAM
数据库索引的原理
为什么要用 B-tree
聚集索引与非聚集索引的区别
limit 20000 加载很慢怎么解决
选择合适的分布式主键方案
选择合适的数据存储方案
ObjectId 规则
聊聊 MongoDB 使用场景
倒排索引
聊聊 ElasticSearch 使用场景
缓存使用
Redis 有哪些类型
Redis 内部结构
聊聊 Redis 使用场景
Redis 持久化机制
Redis 如何实现持久化
Redis 集群方案与实现
Redis 为什么是单线程的
缓存奔溃
缓存降级
使用缓存的合理性问题
消息队列
消息队列的使用场景
消息的重发补偿解决思路
消息的幂等性解决思路
消息的堆积解决思路
自己如何实现消息队列
如何保证消息的有序性
框架篇
Spring
BeanFactory 和 ApplicationContext 有什么区别
Spring Bean 的生命周期
Spring IOC 如何实现
说说 Spring AOP
Spring AOP 实现原理
动态代理(cglib 与 JDK)
Spring 事务实现方式
Spring 事务底层原理
如何自定义注解实现功能
Spring MVC 运行流程
Spring MVC 启动流程
Spring 的单例实现原理
Spring 框架中用到了哪些设计模式
Spring 其他产品(Srping Boot、Spring Cloud、Spring Secuirity、Spring Data、Spring AMQP 等)
Spring boot
Netty
为什么选择 Netty
说说业务中,Netty 的使用场景
原生的 NIO 在 JDK 1.7 版本存在 epoll bug
什么是TCP 粘包/拆包
TCP粘包/拆包的解决办法
Netty 线程模型
说说 Netty 的零拷贝
Netty 内部执行流程
Netty 重连实现
工具篇
-
maven
目前maven管理工具用的还是比较多的,官网下载安装,配置环境变量,开发工具配置好就行(maven最好不要用默认C盘的仓库地址,自己去配置)- 多个项目可以用同一个仓库里的jar, 直接调用就行,节约了空间项目不那么臃肿,
- 下载jar也不用到处去百度下载, 写上版本号直接就可以下载
- Maven会自动将你要加入到项目中的jar包导入,不仅导入,而且还会将该jar包所依赖的jar包都自动导入进来
好处: 样式统一
http://search.maven.org
复制到项目pom.xml文件
-
idear
优点: 1. 首先是他足够的小,安装包只有50多M 2. 支持插件 而且下载很方便 而且很多插件用起来特别方便 3. 对maven 的支持很好 4. 构架简洁,让工作区间尽可能的最大化 5. 快捷键也很强大 还不太熟待续。。。。<-- _ <–
微服务篇
微服务
前后端分离是如何做的
微服务哪些框架
你怎么理解 RPC 框架
说说 RPC 的实现原理
说说 Dubbo 的实现原理
你怎么理解 RESTful
说说如何设计一个良好的 API
如何理解 RESTful API 的幂等性
如何保证接口的幂等性
说说 CAP 定理、 BASE 理论
怎么考虑数据一致性问题
说说最终一致性的实现方案
你怎么看待微服务
微服务与 SOA 的区别
如何拆分服务
微服务如何进行数据库管理
如何应对微服务的链式调用异常
对于快速追踪与定位问题
微服务的安全
分布式
谈谈业务中使用分布式的场景
Session 分布式方案
分布式锁的场景
分布是锁的实现方案
分布式事务
集群与负载均衡的算法与实现
说说分库与分表设计
分库与分表带来的分布式困境与应对之策
安全问题
安全要素与 STRIDE 威胁
防范常见的 Web 攻击
服务端通信安全攻防
HTTPS 原理剖析
HTTPS 降级攻击
授权与认证
基于角色的访问控制
基于数据的访问控制
性能优化
性能指标有哪些
如何发现性能瓶颈
性能调优的常见手段
说说你在项目中如何进行性能调优
工程篇
需求分析
你如何对需求原型进行理解和拆分
说说你对功能性需求的理解
说说你对非功能性需求的理解
你针对产品提出哪些交互和改进意见
你如何理解用户痛点
设计能力
说说你在项目中使用过的 UML 图
你如何考虑组件化
你如何考虑服务化
你如何进行领域建模
你如何划分领域边界
说说你项目中的领域建模
说说概要设计
设计模式
你项目中有使用哪些设计模式
说说常用开源框架中设计模式使用分析
说说你对设计原则的理解
23种设计模式的设计理念
设计模式之间的异同,例如策略模式与状态模式的区别
设计模式之间的结合,例如策略模式+简单工厂模式的实践
设计模式的性能,例如单例模式哪种性能更好。
业务工程
你系统中的前后端分离是如何做的
说说你的开发流程
你和团队是如何沟通的
你如何进行代码评审
说说你对技术与业务的理解
说说你在项目中经常遇到的 Exception
说说你在项目中遇到感觉最难Bug,怎么解决的
说说你在项目中遇到印象最深困难,怎么解决的
你觉得你们项目还有哪些不足的地方
你是否遇到过 CPU 100% ,如何排查与解决
你是否遇到过 内存 OOM ,如何排查与解决
说说你对敏捷开发的实践
说说你对开发运维的实践
介绍下工作中的一个对自己最有价值的项目,以及在这个过程中的角色
软实力
说说你的亮点
说说你最近在看什么书
说说你觉得最有意义的技术书籍
工作之余做什么事情
说说个人发展方向方面的思考
说说你认为的服务端开发工程师应该具备哪些能力
说说你认为的架构师是什么样的,架构师主要做什么
说说你所理解的技术专家
结构来自:https://blog.csdn.net/it_manman/article/details/79402064