TCP协议中的三次握手和四次挥手
SYN(synchronous建立联机)
ACK(acknowledgement 确认)
PSH(push传送)
FIN(finish结束)
第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,等待服务器B确认。
第二次握手:服务器B收到SYN包,必须确认客户A的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,
第三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK(ACK=k+1),此包发送完毕,客户端A和服务器B进入ESTABLISHED状态,完成三次握手。
关闭连接:
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。
和SYN一样,一个FIN将占用一个序号
String、StringBuffer、StringBuilder
String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象;而如果是使用 StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象。
StringBuilder是线程不安全的,速度更快
StringBuffer是线程安全的,速度比StringBuilder慢
线程安全当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。
HashMap是基于哈希表实现的,每一个元素是一个key-value对
h(key) = value,
哈希表:
① hashmap是用链地址法进行处理,多个key 对应于表中的一个索引位置的时候进行链地址处理,hashmap其实就是一个数组+链表的形式。
② 当有多个key的值相同时,hashmap中只保存具有相同key的一个节点,也就是说相同key的节点会进行覆盖。
④节点在找到所在的链后,插入链中是采用的是头插法,也就是新节点都插在链表的头部。
Entry是HashMap的内部类 包含四个值(next,key,value,hash),其中next是一个指向 Entry的指针,key相当于上面节点的值 value对应要保存的值,hash值由key产生,
hashmap中要找到某个元素,需要根据hash值来求得对应数组中的位置,然后在由key来在链表中找Entry的位置。
初始容量和加载因子。
HashTable和HashMap区别
Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。
并发 任一个时刻点上只有一个程序在处理机上运行。
同步 A执行到一定程度时要依靠B的某个结果,于是停下来,示意B运行;B依言执行,再将结果给A;A再继续操作。
在多线程并发的环境下,可以直接使用Hashtable,不需要自己为它的方法实现同步,但使用HashMap时就必须要自己增加同步处理。
Hashtable 线程安全
HashMap中,null可以作为键,
Hashtable中,key和value都不允许出现null值。
哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。
IOC:
①IOC就是控制反转
②控制反转就是由第三方实例化对象
③IOC的好处:可以降低耦合度
AOP思想
①AOP就是面向切面编程
②AOP的思想就是把一个对象按照业务分为主要业务和次要业务,然后再动态的组合
③AOP的好处:降低耦合度,代码重用,分工合作
bean 工厂的概念是 Spring 作为 IOC 容器的基础。IOC 将处理事情的责任从应用程序代码转移到框架。
抽象类和接口的区别?
抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
一个类只能继承一个抽象类,而一个类却可以实现多个接口。
指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;
而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。而引用是一块内存的别名。
vector和数组类似,拥有一段连续的内存空间,并且起始地址不变。
list是由双向链表实现的,因此内存空间是不连续的。只能通过指针访问数据,由于链表的特点,能高效地进行插入和删除。
malloc 只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。申请了内存空间后,必须检查是否分配成功。
AOP的实现:面向切面编程采用横向抽取机制
- 若目标对象实现了接口,则Spring使用JDK的java.lang.reflect.Proxy代理.
- 若目标对象没有实现接口,则Spring使用cglib库生成目标对象的子类.
横切关注点 对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点
Target 目标对象 需要被代理(增强)的对象.
Proxy 代理对象 目标对象被AOP 织入 增强/通知后,产生的对象.
在动态代理 和 CGLIB 的支持下
JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。
MVC设计模式:
什么是MVC (模型 视图 控制器)?
MVC是一个架构模式,它分离了表现与交互。它被分为三个核心部件:模型、视图、控制器。
视图是用户看到并与之交互的界面。
模型表示业务数据,并提供数据给视图。
控制器接受用户的输入并调用模型和视图去完成用户的需求。
MVC有两个大的好处:
分离了关注点。后台代码被移到单独的类文件,我们可以最大限度的重复利用代码。
自动化UI测试成为可能,因为后台代码移到了.NET类。这让我们更容易做单元测试和自动化测试。
你能解释下MVC的完整流程吗?
所有的终端用户请求被发送到控制器。
控制器依赖请求去选择加载哪个模型,并把模型附加到对应的视图。
附加了模型数据的最终视图做为响应发送给终端用户。
hashmap如何解决哈希冲突
链表法和开放地址法。链表法就是将相同hash值的对象组织成一个链表放在hash值对应的槽位;
开放地址法是通过一个探测算法,当某个槽位已经被占据的情况下继续查找下一个可以使用的槽位。按照某种方法继续探测哈希表中的其他存储单元,直到找到空位置为止。
操作系统:
多线程:是指从软件或者硬件上实现多个线程并发执行的技术。
单进程单线程:一个人在一个桌子上吃菜。 单进程多线程:多个人在同一个桌子上一起吃菜。
并发是指一个处理器同时处理多个任务。
并行是指多个处理器或者是多核的处理器同时处理多个不同的任务。
怎么实现并发编程?
多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域:
线程:进程中负责程序执行的执行单元
进程:执行中的程序 一个进程至少包含一个线程
单线程:程序中只存在一个线程,实际上主方法就是一个主线程
多线程:在一个程序中运行多个任务
线程的实现:继承Thread类,在java.lang包中定义, 继承Thread类必须重写run()方法
实现Runnable接口
在Java中创建线程除了继承Thread类之外,还可以通过实现Runnable接口来实现类似的功能。实现Runnable接口必须重写其run方法。
实现Runnable接口:在Java中创建线程除了继承Thread类之外,还可以通过实现Runnable接口来实现类似的功能。实现Runnable接口必须重写其run方法。