Java高级

1、简述面向对象的理解,并举例说出你的理解。

  https://blog.csdn.net/guoshujie1/article/details/89603256

2、写出单例模式。

public class Singleton {
    private volatile static Singleton instance; //声明成 volatile
    private Singleton (){}

    public static Singleton getSingleton() {
        if (instance == null) {                         
            synchronized (Singleton.class) {
                if (instance == null) {       
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
   
}

3、写出一种11位手机号的正则表达式
/^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\d{8}$/
/^[1][3,4,5,7,8][0-9]{9}$/


4、实现字符串多个空格转换一个空格
public class test {

public static void main(String[] args) {
    String w= "";

    String str="hello            song";

    Pattern p = Pattern.compile("\\s+");

    Matcher m = p.matcher(str);

    w= m.replaceAll(" ");

    System.out.println(w);
    }
}

结果:hello song

 

5、字符串常用方法,substring(),split()。

  

public static void main(String[] args) {
    String a="sanksl:sfa:sn";
    String[] b= a.split(":");
    String j=a.substring(2, 4);
    String i2=a.substring(3);
    System.out.println("String j=a.substring(2, 4);"+j);//nk   取[2,4)
    System.out.println("String i2=a.substring(3);"+i2);//取[3,结尾]   ksl:sfa:sn

}

6、start()和run()区别。

  

run方法是Runnable接口中定义的,start方法是Thread类定义的。 所有实现Runnable的接口的类都需要重写run方法,run方法是线程默认要执行的方法,有底层源码可知是绑定操作系统的,也是线程执行的入口。 start方法是Thread类的默认执行入口,Thread又是实现Runnable接口的。要使线程Thread启动起来,需要通过start方法,表示线程可执行状态,调用start方法后,则表示Thread开始执行,此时run变成了Thread的默认要执行普通方法。 2)通过start()方法,直接调用run()方法可以达到多线程的目的 通常,系统通过调用线程类的start()方法来启动一个线程,此时该线程处于就绪状态,而非运行状态,这也就意味着这个线程可以被JVM来调度执行。在调度过程中,JVM会通过调用线程类的run()方法来完成试机的操作,当run()方法结束之后,此线程就会终止。 如果直接调用线程类的run()方法,它就会被当做一个普通的函数调用,程序中任然只有主线程这一个线程。也就是说,star()方法可以异步地调用run()方法,但是直接调用run()方法确实同步的,因此也就不能达到多线程的目的。 run()和start()的区别可以用一句话概括:单独调用run()方法,是同步执行;通过start()调用run(),是异步执行。

8、Webservice介绍。

  https://www.cnblogs.com/qlqwjy/p/7553929.html

 

9、说出Servlet生命周期,Servlet和CGI区别。

  

Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。

与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。

Select  生命周期

实例化

Init 初始化

Doget dopost

销毁

servlet处于服务器进程中,它通过多线程方式运行一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。 

 

10、sleep和wait的区别。

  

对于sleep()方法,我们首先要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。

sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。

在调用sleep()方法的过程中,线程不会释放对象锁。

而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备

从使用角度看,sleep是Thread线程类的方法,而wait是Object顶级类的方法。

sleep可以在任何地方使用,而wait只能在同步方法或者同步块中使用。

CPU及资源锁释放

sleep,wait调用后都会暂停当前线程并让出cpu的执行时间,但不同的是sleep不会释放当前持有的对象的锁资源,到时间后会继续执行,而wait会放弃所有锁并需要notify/notifyAll后重新获取到对象锁资源后才能继续执行。

sleep和wait的区别:
1、sleep是Thread的静态方法,wait是Object的方法,任何对象实例都能调用。
2、sleep不会释放锁,它也不需要占用锁。wait会释放锁,但调用它的前提是当前线程占有锁(即代码要在synchronized中)。
3、它们都可以被interrupted方法中断。

具体来说:

Thread.Sleep(1000) 意思是在未来的1000毫秒内本线程不参与CPU竞争,1000毫秒过去之后,这时候也许另外一个线程正在使用CPU,那么这时候操作系统是不会重新分配CPU的,直到那个线程挂起或结束,即使这个时候恰巧轮到操作系统进行CPU 分配,那么当前线程也不一定就是总优先级最高的那个,CPU还是可能被其他线程抢占去。另外值得一提的是Thread.Sleep(0)的作用,就是触发操作系统立刻重新进行一次CPU竞争,竞争的结果也许是当前线程仍然获得CPU控制权,也许会换成别的线程获得CPU控制权。

wait(1000)表示将锁释放1000毫秒,到时间后如果锁没有被其他线程占用,则再次得到锁,然后wait方法结束,执行后面的代码,如果锁被其他线程占用,则等待其他线程释放锁。注意,设置了超时时间的wait方法一旦过了超时时间,并不需要其他线程执行notify也能自动解除阻塞,但是如果没设置超时时间的wait方法必须等待其他线程执行notify。

 

11、什么是反射,如何实现。

  https://www.cnblogs.com/caolei1108/p/6208025.html

 

12、检查字符串回文,实现英文中单词个数和单词次数统计

public int countWords(String str) {  
 
    String abb = "She   had been shopping,"
 
                + " this, "
 
                + "你好呀. "
 
                + "urry   to,";
 
        Pattern expression = Pattern.compile("[a-zA-Z]+");//定义正则表达式匹配
 
        String string1 = abb.toString().toLowerCase();//转换成小写
 
        Matcher matcher = expression.matcher(string1);
 
        //定义string1的匹配器
 
        HashMap myTreeMap = new HashMap();//创建树映射 存放键/值对
 
        int articleWords  = 0;//文章中单词总数
 
      while (matcher.find()) {//是否匹配单词
 
                      articleWords ++;//单词数加1
 
        }
 
    return articleWords;
}

 

 

 13、tcp/ip协议三次握手。

 

三次握手:

        概念:指在发送数据的准备阶段,服务器和客户端之间需要三次交互

        第一次握手:建立连接时,客户端向服务器发送一个SYN包,并进入SYN_SENT状态,等待服务器确认

        第二次握手:当服务器收到客户端的请求后,此时要给客户端给一个确认信息ACK,同时发送SYN包,此时服务器进入 SYN_RECV状态

        第三次握手:客户端收到服务器发的ACK+SYN包后,向服务器发送ACK,发送完毕之后,客户端和服务器进入 ESTABLISHED(TCP连接成功)状态,完成三次握手

四次挥手:

        概念:所谓四次挥手就是说关闭TCP连接的过程,当断开一个TCP连接时,需要客户端和服务器共发送四个包确认

        第一次挥手:客户端发送一个FIN,用来关闭客户端到服务器的数据传输,客户端进入FIN_WAIT_1状态

        第二次挥手:服务器收到FIN后,发送一个ACK给客户端,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序 号),服务器进入CLOSE_WAIT状态

        第三次挥手:服务器发送一个FIN,用来关闭服务器到客户端的数据传输,服务器进入LAST_ACK状态

        第四次挥手:客户端收到FIN后,客户端进入TIME_WAIT状态,接着发送一个AKC给服务器,确认序号为收到序号+1,服务器进入CLOSED状态,完成四次挥手

常见的问题:

        1、为什么连接需要三次,关闭的时候需要四次?

        当服务器收到客户端的连接请求后,可以直接发送SYN+ACK报文,其中ACK是确认应答,SYN报文是用来同步的。但  是在关闭连接的时候,当服务器收到FIN的时候,很可能并不会立刻关闭SOCKET,所以只能先回个ACK来应答,只有等服务器把所有报文都发完了才能发送FIN,因此不能一起发送,所有需要四步。

        2、为什么断开链接的时候客户端设置的定时器时间等待要2MSL(两个通信报文的最大时间)?

        当客户端最终告诉服务器断开确认的时候,他不知道自己的发出的指令是否准确的一次性被服务器接收。 

        3、为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

        虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。 

14、http协议几种请求方式,区别。

  

HTTP协议简介
超文本传输协议(HTTP)的设计目的是保证客户机与服务器之间的通信。HTTP 的工作方式是客户机与服务器之间的请求-应答协议。web 浏览器可能是客户端,而计算机上的网络应用程序也可能作为服务器端。例如:客户端(浏览器)向服务器提交 HTTP 请求;服务器向客户端返回响应。响应包含关于请求的状态信息以及可能被请求的内容。

HTTP协议的8种请求类型
1、OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法。也可利用向Web服务器发送'*'的请求来测试服务器的功能性。 
2、HEAD:向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。 
3、GET:向特定的资源发出请求。 
4、POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的创建和/或已有资源的修改。 
5、PUT:向指定资源位置上传其最新内容。 
6、DELETE:请求服务器删除Request-URI所标识的资源。 
7、TRACE:回显服务器收到的请求,主要用于测试或诊断。 

8、CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。

POST与GET的区别
在客户机和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST。

GET - 从指定的资源请求数据。
POST - 向指定的资源提交要被处理的数据
GET 方法

请注意,查询字符串(名称/值对)是在 GET 请求的 URL 中发送的:/test/demo_form.asp?name1=value1&name2=value2

GET 请求方法的特点:

GET 请求可被缓存
GET 请求保留在浏览器历史记录中
GET 请求可被收藏为书签
GET 请求不应在处理敏感数据时使用
GET 请求有长度限制
GET 请求只应当用于取回数据
POST 方法

查询字符串(名称/值对)是在 POST 请求的 HTTP 消息主体中发送的:

POST /test/demo_form.asp HTTP/1.1
Host: w3schools.com
name1=value1&name2=value2
 POST 请求方法的特点:

POST 请求不会被缓存
POST 请求不会保留在浏览器历史记录中
POST 不能被收藏为书签
POST 请求对数据长度没有要求


比较 GET 与 POST

 

18、简述form表单提交post方法与get方法在字符编码、http协议方面的区别。

  https://www.cnblogs.com/yforward/p/7149544.html

 

19、一个http请求从开始到结束都经历了哪些过程,简写流程图。

  https://blog.csdn.net/jiabin_xu/article/details/80878320

 







posted @ 2020-07-14 10:20  chdchd  阅读(242)  评论(0编辑  收藏  举报