目录
■ tomcat容器是如何创建servlet类实例?用到了什么原理?
■ char的编码
Java中的char是Unicode编码。
Unicode编码占两个字节,就是16位,足够存储一个汉字。
■ ASCII编码
1. 标准ASCII 只使用了7个bit,扩展的ASCII使用了8个bit
2. ASCII码包含一些特殊空字符,所以不能打印
3. 中文一般是GBK2312
■ join
这里需要理解的就是该线程是指的主线程等待子线程的终止。也就是在子线程调用了join()方法后面的代码,只有等到子线程结束了才能执行。
■ 什么是正则表达式的贪婪与非贪婪匹配
如:String str="abcaxc";
贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配。结果就是匹配到:abcaxc(ab.*c)。
非贪婪匹配:就是匹配到结果就好,就少的匹配字符。结果就是匹配到:abc(ab*c)。
案例:
private static Pattern pattern1 = Pattern.compile("ab.*c");
private static Pattern pattern2 = Pattern.compile("ab*c");
public static void main(String[] args) {
String str = "abcaxc";
Matcher matcher1 = pattern1.matcher(str);
Matcher matcher2 = pattern2.matcher(str);
if (matcher1.find()) {
// abcaxc
System.out.println(matcher1.group(0));
}
if (matcher2.find()) {
// abc
System.out.println(matcher2.group(0));
}
}
编程中如何区分两种模式
默认是贪婪模式;在量词后面直接加上一个问号?就是非贪婪模式。ab*?c
量词:{m,n}:m到n个
*:任意多个
+:一个到多个
?:0或一个
. 表示除\n之外的任意字符
* 表示匹配0-无穷
+ 表示匹配1-无穷
(?=Expression) 顺序环视,(?=\\()就是匹配左括号,\\表示转义
■ 正则表达式
\d 匹配一个数字字符。等价于[0-9]。grep要加上-P,perl正则支持
\D 匹配一个非数字字符。等价于[^0-9]。grep要加上-P,perl正则支持
■ Properties类
Properties继承自HashTable, Properties中的 store()方法把一个Properties对象的内容以一种可读的形式保存到一个文件中。load()方法正好相反,用来读取文件,并设定Properties对象来包含keys和values。
class Properties extends Hashtable<Object,Object>
Properties类用来方便的读写配置文件,支持key-value形式和xml形式的配置文件,以key-value为例,Properties的load方法直接将文件读取到内存中并且以map形式来保存,用 getProperty("key")方法来取得对应的vaule值。
■ Socket编程
服务器端:ServerSocket提供的实例
ServerSocket server = new ServerSocket(端口号)
客户端:Socket提供的实例
Socket client = new Socket(IP地址,端口号)
■ Scoket通信
■ 线程调度算法是平台独立的
线程调度分为协同式调度和抢占式调度,Java使用的是抢占式调度,也就是每个线程将由操作系统来分配执行时间,线程的切换不由线程本身来决定(协同式调度)。这就是平台独立的原因。
■ Servlet线程安全问题
由于Servlet是单例的,当多个用户访问Servlet的时候,服务器会为每个用户创建一个线程。当多个用户并发访问Servlet共享资源的时候就会出现线程安全问题。
原则:
如果一个变量需要多个用户共享,则应当在访问该变量的时候,加同步机制synchronized (对象){}
如果一个变量不需要共享,则直接在 doGet() 或者 doPost()定义,这样不会存在线程安全问题
■ tomcat容器是如何创建servlet类实例?用到了什么原理?
当容器启动时,会读取在webapps目录下所有的web应用中的web.xml文件,然后对 xml文件进行解析,并读取servlet注册信息。然后,将每个应用中注册的servlet类都进行加载,并通过反射的方式实例化。(有时候也是在第一次请求时实例化)
在servlet注册时加上 <load-on-startup>1</load-on-startup>,如果为正数,则在一开始就实例化,如果不写或为负数,则第一次请求实例化。
■ Object类默认方法
getClass(), hashCode(), equals(), clone(), toString(), notify(), notifyAll(), wait(), finalize()
■ 线程间通信
Condition是在java 1.5中才出现的,它用来替代传统的Object的wait()、notify()实现线程间的协作,相比使用Object的wait()、notify(),使用Condition的await()、signal()这种方式实现线程间协作更加安全和高效。因此通常来说比较推荐使用Condition。
使用Contdition和Lock代替Object和Synchronized。
1. Contdition和Lock模板
lock.lock();
try{
// wait 条件:一般都是使用while
while(meet the condition){
condition.await();
}
// 满足条件进行一系列操作
... your operation
otherCondition.signal()// otherCondition.signalAll()
}catch(){
}finally{
lock.unlock();
}
2. Object和Synchronized
synchronized (lock){
while (meet the condition){
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 满足条件进行一系列操作
... your operation
lock.notify();
}
■ 保留字、关键字和直接量
goto、const既是保留字也是关键字
3个特殊直接量(常量):true、false、null。