因为职业发展的考虑和其它一些综合因素,我于上个月19号提出了离职申请,然后这个月的19号我也是顺利交接完毕并且正式离职了。接下来就是好好复习和总结,为找到一个更合适的工作做准备。
今天是离职后的第一个工作日。 以下是复习内容:
一、Servlet
早期的Web应用主要是静态页面,用户可以直接通过HTTP协议访问。
随着Web应用变得复杂,更多的应用需要动态生成页面,有的还需要从数据库获取数据并经过运算才返回结果。
这时候我们迫切需要编写一个实现HTTP协议的服务器端软件,来为我们提供实现扩展功能的接口。
最初这样的扩展机制叫做CGI(Common Gateway Interface)
1994年Rasmus Lerdorf发明PHP
1996年微软推出ASP
1997年Sun推出Servlet作为Java阵营的CGI解决方案
1998年Sun推出JSP用来对抗ASP
Servlet依赖容器运行,常用的容器是Tomcat(后面会专门复习Tomcat)。
Servlet是单实例多线程,每个请求在一个独立的线程中运行。
1. Servlet接口
编写一个Servlet需要实现javax.servlet.Servlet接口
该接口定义了5个方法:
public void init(ServletConfig config) throws ServletException //初始化Servlet对象,只调用一次
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException
public void destroy()
public ServletConfig getServletConfig()
public String getServletInfo()
2. ServletRequest和ServletResponse
3. ServletConfig
一个Servlet只有一个ServletConfig对象。
4. GenericServlet
implements Servlet, ServletConfig, Serializable
注意这个抽象类中的service方法是一个抽象方法。
5. HttpServlet
extends GenericServlet
注意这个抽象类有两个service方法,其中一个是重写了父类的抽象方法service,参数是ServletRequest和ServletResponse, 该方法会将其转化成HttpServletRequest和HttpServletResponse, 然后用新的对象为参数去调用自己的service方法。
自己的service方法起到一个分发的作用,会判断请求类型,分别调用doGet或者doPost或者其它请求类型的对应方法。如果是不能识别的请求类别,会返回501错误。
我们在编写自己的Servlet时会继承HttpServlet类,并重写它的doGet和doPost方法。
二、TCP/IP协议族(Internet协议族)
一个协议族,比如TCP/IP,是一组不同层次上的多个协议的组合。
TCP/IP通常被认为是一个四层协议系统,如下:
应用层 Telnet、FTP、HTTP等
运输层 TCP和UDP
网络层 IP、ICMP和IGMP
链路层 设备驱动程序及接口卡
1. 交换机Switch和路由器Router的区别(浅显点的)
(1)路由器根据IP地址寻址,交换机根据MAC地址寻址。
(2)路由器可以把一个IP分配给很多个主机使用,这些主机对外只表现出
一个IP。交换机可以把很多主机连起来,这些主机对外各有各的IP。
(3)路由器提供防火墙的服务,具有虚拟拨号上网功能,交换机不具备这些功能。
(4)交换机构成局域网,路由器构成广域网。(这句话正确性有待确认)
2. 以太网和令牌环网的区别
以太网的核心技术是随机争用介质访问控制方法,即带有冲突检测的载波侦听多路
访问方法(CSMA/CD),源于无线分组交换网。使用的是IEEE802.3
令牌环网的结构是组成一个环形,环形的一圈是主机,主机中存在一个令牌,由一号
机向下传,每个主机只有在自已有令牌时才能向主线路中发数据。使用的是IEEE802.5
3. 端口号
TCP和UDP采用16bit的端口号来识别应用程序。
知名端口号介于1~255之间:FTP是21,Telnet是23,TFTP是69,HTTP是80,HTTPS是443
256~1023之间的端口号通常都是由Unix系统占用。
1024~5000为临时端口号。
三、JVM之GC
程序计数器、虚拟机栈和本地方法栈三个区域属于线程独有,随线程而生,随线程而灭。
垃圾回收器关注的是堆和方法区的内存。
1. 可达性分析算法
Java中可作为GC Roots的对象:
(1)虚拟机栈(栈帧中的本地变量表)中引用的对象
(2)方法区中类静态属性引用的对象
(3)方法区中常量引用的对象
(4) 本地方法栈中JNI(也就是Native方法)引用的对象
2. 垃圾收集算法
标记-清除、复制算法、标记-整理、分代收集
3. HotSpot的算法实现
准确式GC,当系统停顿下来(STOP THE WORLD),通过一组称为OopMap的数据结构直接得知哪些地方存放着对象引用。
主动式中断,GC给需要中断的线程设置轮询标志,线程发现标志为真时自己中断挂起。
4. CMS收集器
CMS(Concurrent Mark Sweep)采用标记清除算法,优点是并发收集、低停顿。
整个过程分四个步骤:
CMS initial mark //Stop The World, 标记GC Roots关联到的对象,速度很快
CMS concurrent mark //GC Roots Tracing,时间长
CMS mark //Stop The World, 修正上一步过程中新产生的需要标记的对象
CMS concurrent sweep //时间长
缺点:
CMS收集器对CPU资源非常敏感
CMS收集器无法处理浮动垃圾
标记清除算法产生大量空间碎片
5. G1收集器
2004年Sun实验室发表第一篇G1论文,把内存化整为零的思想。
特点:并行与并发;分代收集;空间整合(整体看是标记整理算法,局部也就是两个Region之间看是基于复制算法);可预测的停顿。
步骤:初始标记;并发标记;最终标记;筛选回收。
四、Java基础
1. switch语句
case标签可以的类型:char、byte、short或int,从jdk1.7开始还可以是字符串字面量。
2. 数组
(1)数组的默认初始化:数字是0,boolean是false,对象是null
(2)数组一旦创建不可以改变大小,如果运行中经常需要扩展,应该使用array list
(3)简化地创建并初始化:int[] smallPrimes = {1,2,3},创建匿名数组new int[] {1,2,3}
(4)直接将一个数组变量拷贝给另一个,两个变量将引用同一个数组。如果需要深拷贝,使用Arrays:int[] a = Arrays.copyOf(b, b.length),这种方式常被用来扩充数组。
(5)Java数组与C++数组在堆栈上有很大不同,但基本与分配在堆上的数组指针一样。
(6)使用Arrays中的sort()对数组进行排序,该方法采用了快速排序法。