目录

■ char的编码

■ ASCII编码

■ join

■ 什么是正则表达式的贪婪与非贪婪匹配

■ 正则表达式

■ Properties类

■ Socket编程

■ Scoket通信

■ 线程调度算法是平台独立的

■ Servelt线程安全问题

■ tomcat容器是如何创建servlet类实例?用到了什么原理?

■ Object类默认方法

■ 线程间通信

■ 保留字、关键字和直接量

■ 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专项练习题知识点整理(二)

 

■ 线程调度算法是平台独立的

        线程调度分为协同式调度和抢占式调度,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()

牛客 - Java专项练习题知识点整理(二)

 

■ 线程间通信

        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

相关文章: