1. Servlet 类图
image-20190331150025025
image-20190331150025025
  • service 方法在 servlet 生命周期的中的服务期,默认在 HttpServlet 类中实现,根据 Http 请求方法(GET、POST 等),将请求分发到 doGet、doPost 等方法实现。
  • GenericServlet 抽象类给出了设计 servlet 的一些骨架,定义了 servlet 生命周期还有一些得到名字、配置、初始化参数的方法,其设计的是和应用层协议无关的。
2. super() 和 this()
  • 调用 super() 必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用 super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。
  • super() 和 this() 类似,区别是,super 从子类中调用父类的构造方法,this() 在同一类内调用其它方法。
  • this() 和 super() 不能同时出现在一个构造函数里面。
  • this() 和 supe() 都指向的是对象,所以,均不可以在 static 环境中使用。包括:static 变量,static 方法,static 语句块。
  • 从本质上讲,this 是一个指向本对象的指针,然而 super 是一个 Java 关键字。
3. Jdbc 连接数据库几个步骤
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//声明数据库驱动,数据源的url,用于登录数据库的账户和密码
String driver = "数据库驱动名称"
String url = "数据库连接地址"
String user = "用来连接数据库的用户名"
String pwd = "用来连接数据库的密码"
//1. 加载数据库驱动
Class.forName(driver);
//2. 根据url创建数据库连接对象Connection
Connection con = DriverManage.getConnection(url,user,pwd);
//3. 用数据库连接对象创建Statement对象(或PrepareStatement)
Statement s = con.createStatement();

PrepareStatement ps = con.PrepareStatement(sql);
//4. 做数据库的增删改查工作
ResultSet rs = s.executeQuery();
//关闭结果集对象Resultset,statement对象,connection对象,
rs.close();
s.close();
con.close();
//各个步骤的异常处理
4. Object 对象的几个方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// 创建并返回此对象的一个副本。  
protected native Object clone() throws CloneNotSupportedException;

// 指示某个其他对象是否与此对象“相等”。
boolean equals (Object obj)

// 当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
protected void finalize() throws Throwable { }

// 返回一个对象的运行时类。
public final native Class<?> getClass();

// 返回该对象的哈希码值。
public native int hashCode();

//唤醒在此对象监视器上等待的单个线程。
public final native void notify();

//唤醒在此对象监视器上等待的所有线程。
public final native void notifyAll();

//返回该对象的字符串表示。
public String toString() {}

//导致当前的线程等待,直到其他线程调用此对象的 notify () 方法或 notifyAll () 方法。
public final void wait() throws InterruptedException {
wait(0);
}

//导致当前的线程等待,直到其他线程调用此对象的 notify () 方法或 notifyAll () 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量。
public final native void wait(long timeout) throws InterruptedException;
void wait ( long timeout, int nanos)
5. Spring MVC 的核心控制器 DispatcherServlet
image-20190331224039068
image-20190331224039068
6. forward 和 redirect

forward : 服务器获取跳转页面内容传给用户,用户地址栏不变。

redirect :服务器向用户发送转向的地址,redirect 后地址栏变为新的地址。

7. 特殊补码 -128

[1000 0000]作为补码表示-128不是算出来的, 是规定的,因为-0原码[1000 0000]在用原码规则来表示数是没有意义的,就浪费了这个编码, 所有要让这个编码有意义,就 整出来取反+1这套规则刚好能把-0原码【1000 0000】整到了-127【1000 0001】后面,所以用它来表示-128, 逻辑也正确: -128 = -127 - 1 = 【1000 0001】 - 1 = 【1000 0000】, 然后就把这套规则命名为补码,所以-0原码【1000 0000】在补码系统中表示-128不是推导的,是直接将-0原码【1000 0000】在补码系统中直接规定为补码表示-128。所以 -128 没有原码和补码,只有反码。

8. Class 类
1
2
3
4
5
 // 返回类或接口声明的所有方法,包括public, protected, default (package) 访问和private方法的Method对象,但不包括继承的方法。当然也包括它所实现接口的方法。 
public Method[] getDeclaredMethods()

// 返回类的所有public方法,包括其继承类的公用方法,当然也包括它所实现接口的方法。
public Method[] getMethods()
9. 默认数据类型

整型默认为 int,如果需要long,须加 l 或 L。小数默认为 double,d 或 D 可省略,但如果需要 float,须加 f 或 F,例如 float a = 0.1f

10. 类的几种关系
  • 泛化关系(generalization) : 泛化关系 和 实现关系 表示两个对象之间可以用 is - a 来表示。例如 奔驰是一辆车。
  • 实现关系(realize) :实现一个抽象的类,实现具体的行为。利于 车 是个抽象的东西,奔驰就是一个具体的实现。
  • 聚合关系(aggregation) : 表示整体由部门构成的语义;利于一个部门由多个员工组成。但不是强依赖的,部门不存在了,员工也是存在的。
  • 组合关系(composition) has - a : 组合中整体和部分是强依赖的。比如公司 与 部门。
  • 依赖关系(dependency) use - a : 依赖关系是在运行过程中起作用的。在最终代码中,依赖关系体现为类构造方法及类方法的传入参数,箭头的指向为调用关系;依赖关系除了临时知道对方外,还是“使用”对方的方法和属性;
  • 关联关系(association) : 它是一种静态关系,通常与运行状态无关,一般由常识等因素决定的;它一般用来定义对象之间静态的、天然的结构。比如,乘车人和车票就是一种关联关系;学生和学校就是一种关联关系。在代码中通常体现为成员变量。
11. java 的鲁棒性

鲁棒性(Robust,即健壮性),Java在编译和运行程序时,都要对可能出现的问题进行检查,以消除错误的产生。它提供自动垃圾收集来进行内存管理,防止程序员在管理内存时容易产生 的错误。通过集成的面向对象的例外处理机制,在编译时,Java揭示出可能出现但未被处理的例外,帮助程序员正确地进行选择以防止系统的崩溃。另外, Java在编译时还可捕获类型声明中的许多常见错误,防止动态运行时不匹配问题的出现。

12. java 的多态调用

普通方法,运用的是动态单分配,是根据new的类型确定对象,从而确定调用的方法;

静态方法,运用的是静态多分派,即根据静态类型确定对象,因此不是根据 new 的类型确定调用的方法。

13. JVM 内存配置参数
1
-Xmx10240m -Xms10240m -Xmn5120m -XXSurvivorRatio=3

-Xmx:最大堆大小 -Xms:初始堆大小 -Xmn:年轻代大小

-XXSurvivorRatio:年轻代中Eden区与Survivor区的大小比值

年轻代5120m, Eden:Survivor=3,Survivor区大小=1024m(Survivor区有两个,即将年轻代分为5份,每个Survivor区占一份),总大小为2048m。

-Xms初始堆大小即最小内存值为10240m

14. URL 统一资源定位符,能够对因特网的资源进行定位

URL 一般有四部分组成: <协议>://<主机>:<端口>/<路径> 现在最常用的<协议>为http协议。<主机>是指主机在因特网上的域名。http协议的默认<端口>为80(可以省略)。<路径> 是指要活的的文件的路径。

15. 类的种类
  • 外部类,有两种修饰符,public 或 为空,只能有一个为 public 修饰的类,且类名称与文件名要相同。也可以没有 public 修饰的类。
  • 内部类有四种
    • 成员内部类:可以理解为外部类的成员属性,具有 基本的 protected/public/private/空 四种修饰方式。
    • 局部内部类:为方法内或作用域内。
    • 静态内部类:和成员内部类类似,只是只能访问外部类的静态属性。静态内部类才可以创建静态方法。
    • 匿名内部类:匿名内部类不能加访问修饰符,常用的 new Thread 就是匿名内部类。
16. JAVA 反射机制提供了那些功能
  • 普通的 java 对象是通过new关键字把对应类的字节码文件加载到内存,然后创建该对象的。

  • 反射是通过一个名为Class的特殊类,用Class.forName(“className”) ; 得到类的字节码对象,然后用newInstance()方法在虚拟机内部构造这个对象(针对无参构造函数)。 也就是说反射机制让我们可以先拿到java类对应的字节码对象,然后动态的进行任何可能的操作。

    • 在运行时判断任意一个对象所属的类

    • 在运行时构造任意一个类的对象

    • 在运行时判断任意一个类所具有的成员变量和方法

    • 在运行时调用任意一个对象的方法

    • 这些都是反射的功能。 使用反射的主要作用是方便程序的扩展。

17. 锁的种类

http://ifeve.com/java_lock_see1/

18. 正则表达式
元字符 描述
\ 将下一个字符标记符、或一个向后引用、或一个八进制转义符。例如,“\n”匹配\n。“\n”匹配换行符。序列“\”匹配“\”而“(”则匹配“(”。即相当于多种编程语言中都有的“转义字符”的概念。
^ 匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“\n”或“\r”之后的位置。
$ 匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前的位置。
* 匹配前面的子表达式任意次。例如,zo能匹配“z”,也能匹配“zo”以及“zoo”。等价于o{0,}
+ 匹配前面的子表达式一次或多次(大于等于1次)。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。
? 匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“do”或“does”中的“do”。?等价于{0,1}。
{n} n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o。
{n,} n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。
{n,m} m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”将匹配“fooooood”中的前三个o为一组,后三个o为一组。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。
? 当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo”,“o+”将尽可能多的匹配“o”,得到结果[“oooo”],而“o+?”将尽可能少的匹配“o”,得到结果 [‘o’, ‘o’, ‘o’, ‘o’]
.点 匹配除“\r\n”之外的任何单个字符。要匹配包括“\r\n”在内的任何字符,请使用像“[\s\S]”的模式。
(pattern) 匹配pattern并获取这一匹配。所获取的匹配可以从产生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中则使用$0…$9属性。要匹配圆括号字符,请使用“(”或“)”。
(?:pattern) 非获取匹配,匹配pattern但不获取匹配结果,不进行存储供以后使用。这在使用或字符“(\ )”来组合一个模式的各个部分时很有用。例如“industr(?:y\ ies)”就是一个比“industry\ industries”更简略的表达式。
(?=pattern) 非获取匹配,正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。例如,“Windows(?=95\ 98\ NT\ 2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?!pattern) 非获取匹配,正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。例如“Windows(?!95\ 98\ NT\ 2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。
(?<=pattern) 非获取匹配,反向肯定预查,与正向肯定预查类似,只是方向相反。例如,“(?<=95\ 98\ NT\ 2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。
(?<!pattern) 非获取匹配,反向否定预查,与正向否定预查类似,只是方向相反。例如“(?<!95\ 98\ NT\ 2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。这个地方不正确,有问题此处用或任意一项都不能超过2位,如“(?<!95\ 98\ NT\ 20)Windows正确,“(?<!95\ 980\ NT\ 20)Windows 报错,若是单独使用则无限制,如(?<!2000)Windows 正确匹配
x\ y 匹配x或y。例如,“z\ food”能匹配“z”或“food”(此处请谨慎)。“[zf]ood”则匹配“zood”或“food”。
[xyz] 字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”。
[^xyz] 负值字符集合。匹配未包含的任意字符。例如,“[^abc]”可以匹配“plain”中的“plin”。
[a-z] 字符范围。匹配指定范围内的任意字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符。注意:只有连字符在字符组内部时,并且出现在两个字符之间时,才能表示字符的范围; 如果出字符组的开头,则只能表示连字符本身.
[^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范围内的任意字符。
\b 匹配一个单词边界,也就是指单词和空格间的位置(即正则表达式的“匹配”有两种概念,一种是匹配字符,一种是匹配位置,这里的\b就是匹配位置的)。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。
\B 匹配非单词边界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。
\cx 匹配由x指明的控制字符。例如,\cM匹配一个Control-M或回车符。x的值必须为A-Z或a-z之一。否则,将c视为一个原义的“c”字符。
\d 匹配一个数字字符。等价于[0-9]。grep 要加上-P,perl正则支持
\D 匹配一个非数字字符。等价于[^0-9]。grep要加上-P,perl正则支持
\f 匹配一个换页符。等价于\x0c和\cL。
\n 匹配一个换行符。等价于\x0a和\cJ。
\r 匹配一个回车符。等价于\x0d和\cM。
\s 匹配任何不可见字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。
\S 匹配任何可见字符。等价于[^ \f\n\r\t\v]。
\t 匹配一个制表符。等价于\x09和\cI。
\v 匹配一个垂直制表符。等价于\x0b和\cK。
\w 匹配包括下划线的任何单词字符。类似但不等价于“[A-Za-z0-9_]”,这里的”单词”字符使用Unicode字符集。
\W 匹配任何非单词字符。等价于$“[^A-Za-z0-9_]”$。
19. Socket 和 ServerSocket

// 创建Socket 客户端对象

Socket s = new Socket(“host”, “port”);

// 创建 ServerSocket 服务器端对象

ServerSocket ss = new ServerSocket(“port”);

// 监听服务器连接

s = ss.accept;