zoukankan      html  css  js  c++  java
  • 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







  • 相关阅读:
    thinkphp SAE
    thinkphp rpc
    thinkphp REST
    thinkphp 图形处理
    thinkphp 验证码
    thinkphp 文件上传
    thinkphp 数据分页
    thinkphp 多语言支持
    thinkphp cookie支持
    thinkphp session支持
  • 原文地址:https://www.cnblogs.com/chdchd/p/13294951.html
Copyright © 2011-2022 走看看