zoukankan      html  css  js  c++  java
  • 浪潮面试

    自我介绍

    java与C++的区别 

    对Java的理解

    常见的设计模式有哪些

    1、单例模式(Singleton): 保证一个类仅有一个实例,并提供一个访问它的全局控制点,比如在加载配置文件时, 可使用该模式.

    2、工厂模式(Factory): 定义一个用以创建对象的接口, 让子类决定实例化哪个类.

    3、装饰着模式(Decorator): 动态的给一个对象添加一些额外的职责.

       比如java.io包. BufferedInputStream封装了FileInputStream, 它们都实现了InputStream接口, 但前者实现了readLine方法.

    4、代理模式(Proxy): 为其他对象提供一种代理以控制对这个对象的访问.

      比如在用户登录时, 真正的登录类和代理登录类都实现了Login接口, 不同的是Proxy类的方法中增加了用户是否合法的判断, 只有合法时才去调用真正登录类的login方法. 用户访问 的其实是Proxy的login方法.

    5、观察者模式(Observer): 定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象,在它的状态发生变化时,会通知所有的观察者.

       比如ServletContextListener, 在applcation启动时, 会通知所有这个接口的实现类.

    讲讲单例

     单例模式三要点:         

    (1)、单例类只能有一个实例

    这是最基本的,真正做到整个系统中唯一并不容易,通常还要考虑反射破坏、序列化/反序列化、对象垃圾回收等问题。

    (2)、单例类必须自己创建自己的唯一实例

    通常给实例构造函数protected或private权限。

    (3)、单例类必须给所有其他对象提供这一实例

    通常定义静态方法getInstance()返回。

    优点:

    (1)、提供了对唯一实例的受控访问,避免对资源的多重占用。

    (2)、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例。

    (3)、缩小名空间,避免全局变量污染空间,但比类操作更灵活。

    缺点:

    (1)、由于单例模式中没有抽象层,因此单例类的扩展有很大的困难。

    (2)、 单例类的职责过重,在一定程度上违背了"单一职责原则"。      

    因为单例类既充当了工厂角色,提供了工厂方法,同时又充当了产品角色,包含一些业务方法,将产品的创建和产品的本身的功能融合到一起。所以也不应过多使用单例模式。

    Spring的优点和缺点

    优点

    1.使用Spring的IOC容器,将对象之间的依赖关系交给Spring,降低组件之间的耦合性,让我们更专注于应用逻辑

    2.可以提供众多服务,事务管理,WS等。

    3.AOP的很好支持,方便面向切面编程。

    4.对主流的框架提供了很好的集成支持,如hibernate,Struts2,JPA等

    5.Spring DI机制降低了业务对象替换的复杂性。

    6.Spring属于低侵入,代码污染极低。

    7.Spring的高度可开放性,并不强制依赖于Spring,开发者可以自由选择Spring部分或全部

    缺点

    1.jsp中要写很多代码、控制器过于灵活,缺少一个公用控制器

    2.Spring不支持分布式,这也是EJB仍然在用的原因之一。

    IOC是什么、还有依赖注入

     

    TCP/IP有几层?那些?传输层有哪些协议?,http是基于什么协议的?

    答:

    (1)TCP/IP有4层;

    (2)应用层、传输层、网络层、数据链路层;

    (3)传输层有TCP和UDP协议

    (4)HTTP协议基于TCP协议

    由HTTP客户端发起一个请求,建立一个到服务器指定端口(默认是80端口)的TCP连接。

    HTTP服务器则在那个端口监听客户端发送过来的请求。

    一旦收到请求,服务器(向客户端)发回一个状态行和(响应的)消息,消息的消息体可能是请求的文件、错误消息、或者其它一些信息。 

    HTTP使用TCP而不是UDP的原因在于(打开)一个网页必须传送很多数据,而TCP协议提供传输控制,按顺序组织数据,和错误纠正。

    简单介绍一下http协议和https协议,说一下他们的区别与联系

    HTTPS和HTTP的区别:

    https协议需要到ca申请证书,一般免费证书很少,需要交费。

    http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。

    http和https使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443。

    http的连接很简单,是无状态的。

    HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议 要比http协议安全。

    HTTPS解决的问题:

    一、HTTP和HTTPS的基本概念

    HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。

    HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。

    HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。

    二、HTTP与HTTPS有什么区别?

    HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。

    简单来说,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。

    HTTPS和HTTP的区别主要如下:

    1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。

    2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。

    3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

    4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

    三、HTTPS的工作原理

    我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取,所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议。

    1、客户端发起HTTPS请求

    这个没什么好说的,就是用户在浏览器里输入一个https网址,然后连接到server的443端口。

    2、服务端的配置

    采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请,区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面(startssl就是个不错的选择,有1年的免费服务)。

    这套证书其实就是一对公钥和私钥,如果对公钥和私钥不太理解,可以想象成一把钥匙和一个锁头,只是全世界只有你一个人有这把钥匙,你可以把锁头给别人,别人可以用这个锁把重要的东西锁起来,然后发给你,因为只有你一个人有这把钥匙,所以只有你才能看到被这把锁锁起来的东西。

    3、传送证书

    这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等等。

    4、客户端解析证书

    这部分工作是有客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。

    如果证书没有问题,那么就生成一个随机值,然后用证书对该随机值进行加密,就好像上面说的,把随机值用锁头锁起来,这样除非有钥匙,不然看不到被锁住的内容。

    5、传送加密信息

    这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了。

    6、服务段解密信息

    服务端用私钥解密后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密,所谓对称加密就是,将信息和私钥通过某种算法混合在一起,这样除非知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥,所以只要加密算法够彪悍,私钥够复杂,数据就够安全。

    7、传输加密后的信息

    这部分信息是服务段用私钥加密后的信息,可以在客户端被还原。

    8、客户端解密信息

    客户端用之前生成的私钥解密服务段传过来的信息,于是获取了解密后的内容,整个过程第三方即使监听到了数据,也束手无策。

    六、HTTPS的优点

    正是由于HTTPS非常的安全,攻击者无法从中找到下手的地方,从站长的角度来说,HTTPS的优点有以下2点:

    1、SEO方面

    谷歌曾在2014年8月份调整搜索引擎算法,并称“比起同等HTTP网站,采用HTTPS加密的网站在搜索结果中的排名将会更高”。

    2、安全性

    尽管HTTPS并非绝对安全,掌握根证书的机构、掌握加密算法的组织同样可以进行中间人形式的攻击,但HTTPS仍是现行架构下最安全的解决方案,主要有以下几个好处:

    (1)、使用HTTPS协议可认证用户和服务器,确保数据发送到正确的客户机和服务器;

    (2)、HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全,可防止数据在传输过程中不被窃取、改变,确保数据的完整性。

    (3)、HTTPS是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增加了中间人攻击的成本。

    七、HTTPS的缺点

    虽然说HTTPS有很大的优势,但其相对来说,还是有些不足之处的,具体来说,有以下2点:

    1、SEO方面

    据ACM CoNEXT数据显示,使用HTTPS协议会使页面的加载时间延长近50%,增加10%到20%的耗电,此外,HTTPS协议还会影响缓存,增加数据开销和功耗,甚至已有安全措施也会受到影响也会因此而受到影响。

    而且HTTPS协议的加密范围也比较有限,在黑客攻击、拒绝服务攻击、服务器劫持等方面几乎起不到什么作用。

    最关键的,SSL证书的信用链体系并不安全,特别是在某些国家可以控制CA根证书的情况下,中间人攻击一样可行。

    2、经济方面

    (1)、SSL证书需要钱,功能越强大的证书费用越高,个人网站、小网站没有必要一般不会用。

    (2)、SSL证书通常需要绑定IP,不能在同一IP上绑定多个域名,IPv4资源不可能支撑这个消耗(SSL有扩展可以部分解决这个问题,但是比较麻烦,而且要求浏览器、操作系统支持,Windows XP就不支持这个扩展,考虑到XP的装机量,这个特性几乎没用)。

    (3)、HTTPS连接缓存不如HTTP高效,大流量网站如非必要也不会采用,流量成本太高。

    (4)、HTTPS连接服务器端资源占用高很多,支持访客稍多的网站需要投入更大的成本,如果全部采用HTTPS,基于大部分计算资源闲置的假设的VPS的平均成本会上去。

    (5)、HTTPS协议握手阶段比较费时,对网站的相应速度有负面影响,如非必要,没有理由牺牲用户体验。

    cookies和session的区别?

    (1)Cookie的原理是通过Set-Cookie响应头和Cookie请求头将会话中产生的数据保存在客户端
            Set-Cookie
            Cookie

    客户端请求服务器, 服务器将需要保存的数据通过Set-Cookie响应头发给客户端, 客户端收到后会将数据保存在浏览器的内部       

    当客户端再次请求服务器时, 通过Cookie请求头将上次保存的数据再带给服务器, 服务器通过Cookie头来获取数据, 通过这种方式可以保存会话中产生的数据.       

    Cookie是将需要保存的数据保存在了客户端, 是客户端技术. 每个客户端各自保存各自的数据, 再次访问服务器时会带着自己的数据, 每个客户端持有自己的数据, 因此就不会发生混


    (2)Session是将会话中产生的数据保存在了服务器端, 是服务器端技术

     Session是一个域对象
                setAttribute(String name, Object value);
                getAttribute(String name);
                removeAttribute(String name)
                getAttributeNames()
            
    生命周期:
                    当第一次调用request.getSession()方法时创建Session

                    超时: 如果一个Session超时30分钟(可以在web.xml中来修改, 在根目录下通过<session-config>来配置)未被使用, 则认为Session超时, 销毁session

                    自杀: 当调用session.invalidate()方法的时session立即销毁!!

                    意外身亡: 当服务器非正常关闭时, 随着应用的销毁, session销毁. 当服务器正常关闭, 则未超时的session将会以文件的形式保存在tomcat服务器work目录下, 这个过程叫做

    session的钝化. 当服务器再次启动时, 钝化着的session还可以恢复过来, 这个过程叫做session的活化。
                    
     作用范围: 当前会话范围
                    
     主要功能: 保存当前会话相关的数据

    Session是基于一个JSESSIOINID的Cookie工作的

    (3)Cookie和Session的比较:

    Cookie是将会话中产生的数据保存在客户端, 是客户端的技术   

    Session是将会话中产生的数据保存在服务器端, 是服务器端的技术

    Cookie保存的信息的时间比较长, 但是安全性不高. 可能随着用户的操作, Cookie会被清空, 所以Cookie存储数据的稳定性比较差. 因此Cookie适合存放要保存时间较长, 但安全性要求

    不高的信息

    Session通常保存信息的时间比较有限, 但安全性比较高, 因为是保存在服务器端, 不会随着用户的操作而导致Session意外丢失, 因此session适合存放安全性要求比较高, 但是不需要

    长时间保存的数据.

    session是怎么做区分的?

    springMVC工作机制

     

    1、客户端发出一个http请求给web服务器,web服务器对http请求进行解析,如果匹配DispatcherServlet的请求映射路径(在web.xml中指定),web容器将请求转交给DispatcherServlet.

    2、DipatcherServlet接收到这个请求之后将根据请求的信息(包括URL、Http方法、请求报文头和请求参数Cookie等)以及HandlerMapping的配置找到处理请求的处理器(Handler)。

    3-4、DispatcherServlet根据HandlerMapping找到对应的Handler,将处理权交给Handler(Handler将具体的处理进行封装),再由具体的HandlerAdapter对Handler进行具体的调用。

    5、Handler对数据处理完成以后将返回一个ModelAndView()对象给DispatcherServlet。

    6、Handler返回的ModelAndView()只是一个逻辑视图并不是一个正式的视图,DispatcherSevlet通过ViewResolver将逻辑视图转化为真正的视图View。

    7、Dispatcher通过model解析出ModelAndView()中的参数进行解析最终展现出完整的view并返回给客户端。

    dubbo分布式工作原理,如何提供与消费服务

    简单举例介绍一下Java面向对象的三个特征

     1.封装

    Java中的封装是指一个类把自己内部的实现细节进行隐藏,只暴露对外的接口(setter和getter方法)。封装又分为属性的封装和方法的封装。把属性定义为私有的,它们通过setter和getter方法来对属性的值进行设定和获取。下面我举一个简单的封装例子

     public class Person {
            private int id;
            private String name;
            private Person person;
         
            public int getId() {
                return id;
            }
         
            public String getName() {
                return name;
            }
         
            public Person getPerson() {
                return person;
            }
         
            public void setId(int id) {
                this.id = id;
            }
         
            public void setName(String name) {
                this.name = name;
            }
         
            public void setPerson(Person person) {
                this.person = person;
            }
        }

    在Person类中,定义了三个成员变量,分别为id name person,它们的访问修饰都是private私有的,通过setter和getter方法对这些变量进行设值以及取值。那么这么做有什么好处呢?封装的意义就是增强类的信息隐藏与模块化,提高安全性。封装的主要作用也是对外部隐藏具体的实现细节,增加程序的安全性。
    2.继承

    Java中的继承是指在一个现有类(父类)的基础上在构建一个新类(子类),子类可以拥有父类的成员变量以及成员方法(但是不一定能访问或调用,例如父类中private私有的成员变量以及方法不能访问和调用)。继承的作用就是能提高代码的复用性。子类拥有父类中的一切(拥有不一定能使用),它可以访问和使用父类中的非私有成员变量,以及重写父类中的非私有成员方法。

    父类:

        package cn.csu.ksh;
         
        public class Person {
            private int a=1;//父类私有成员变量
            private int id;
            private String name;
            private int age;
            public int getId() {
                return id;
            }
            public void setId(int id) {
                this.id = id;
            }
            public String getName() {
                return name;
            }
            public void setName(String name) {
                this.name = name;
            }
            public int getAge() {
                return age;
            }
            public void setAge(int age) {
                this.age = age;
            }
            @Override
            public String toString() {
                return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
            }
            public void say() {
                System.out.println("person say..");
            }
            public void run() {
                System.out.println("person run....");
            }
            //父类的私有方法
            private void show() {
                System.out.println("person show...");
            }
        }

    子类:

      public class Student extends Person {  
              
            @Override  
            public void say() {  
                super.say();  
            }  
            @Override  
            public void run() {  
                super.run();  
            }  
            public static void main(String[] args) {  
                Student stu = new Student();  
                //stu.a=1;//子类对象对父类的私有成员变量使用报错!  
                //stu.show();//子类对象调用父类的私有方法,同样报错!  
                stu.say();  
                stu.run();                 
            }  
        }

    继承的好处是实现代码的复用以及扩展,子类通过对父类代码的复用,可以不用再定义父类中已经定义的成员变量,方法上直接对父类的方法进行重写实现了扩展。
    3.多态

    多态就是指多种状态,就是说当一个操作在不同的对象时,会产生不同的结果。

    在Java中,实现多态的方式有两种,一种是编译时的多态,另外一种是运行时多态,编译时的多态是通过方法的重载实现的,而运行时多态是通过方法的重写实现的。

    方法的重载是指在同一个类中,有多个方法名相同的方法,但是这些方法有着不同的参数列表,在编译期我们就可以确定到底调用哪个方法。

    方法的重写,子类重写父类中的方法(包括接口的实现),父类的引用不仅可以指向父类的对象,而且还可以指向子类的对象。当父类的引用指向子类的引用时,只有在运行时才能

    确定调用哪个方法。

    其实在运行时的多态的实现,需要满足三个条件:1.继承(包括接口的实现)2.方法的重写 3.父类的引用指向子类对象

    并且,我们说的多态都是类中方法的多态,属性是没有多态性的。方法的重载我这里就不举例说明了,我说一下运行时的多态。

    简单介绍一下List、Map

     

    一,Conllection:

    Collection接口:

    他有两个子接口,Set和List,

    1,Set(公共特点;无序)

    是一个无序的集合接口,并且元素不可重复,当然,这里的无序是针对放入顺序而言,并不是绝对的无序,他有两个子类,一个是hashSet,还有一个是继承了SortedSet接口的

    TreeSet,这两个set集合有什么特点呢?

    首先,hashSet的底层是hashmap,他有着hashmap中键的特性,那就是,无序,不可重复性,

    其次,treeset实现了sortset接口,sortedset有排序能力,也就意味着treeset也有着排序的能力,他是使用二叉树进行排序的。

    2,list(有序):

    list接口也有两个子类,一个是arraylist,一个是linkedList,

    首先arralist的底层是object[]是一个数组,也就意味着他有着数组的特性,但是和数组相比他比数组灵活,无需设置长度,他是有序的,所以查找块,增删比较慢,

    和arralist其实有一个兄弟叫vector,他和arralist是一样的

    Vector是线程安全的,也就是说是它的方法之间是线程同步的,而arralist线程是异步的也就是说他是不安全的,但是效率高,相比之下,建议使用arralist.,

    linkedlist:

    他底层是以链表的形式进行排序的,两个元素之间就如同链子一样前关联,如果进行增删操作的时候,只需要将某个元素替换然后将后边的关联简单修改就可以完成,所以说建议查

    询用arralist,增删用linkedlist;

    二,map(公共特点特点:以键值对的形式存储,):

    简单来讲常用的map类的集合也有三个,常用的有三个子类实现了mapj接口:map存在的意义就是为了快速查找,通过键的直接找到值,因为键是不可重复的。

    1,hashMap和hashtable:

    两者放在一起比较(底层都是hash表结构):hashmap线程是不安全的允许键值对为null,二hashtable线程是安全的不允许键值对为null,两者的其他属性是一样的,所以两者的使

    用要看具体的情况而定,

    2,treemap(底层是二叉树)

    线程不同步,可用于给Map集合中的键进行排序

    虽然说有些集合是无序的,但是子类个别的也是按照另一种方式进行了排序,只不过不符合我们日常的排序方式。是按照某种规则进行的。

    总结:三者的存在关系:

    Map中元素,可以将key序列、value序列单独抽取出来。
    使用keySet()抽取key序列,将map中的所有keys生成一个Set。
    使用values()抽取value序列,将map中的所有values生成一个Collection。

    为什么一个生成Set,一个生成Collection?那是因为,key总是独一无二的,value允许重复

    什么时候进行异常处理?什么时候捕获什么时候抛出?

    捕获异常:

    通常在运行之前java不报错,但是运行后可能会出现某些未知的错误,但是还不想直接抛出到上一级,

    那么就需要通过”try{}catch“的形式进行异常捕获,之后根据不同的异常情况来进行相应的处理。

    传递异常:

    通常用在多级方法调用上,最终想将异常返回到最上层进行处理的时候,那么就把异常向上抛出,知道调用的方法处,进行异常捕获。

    异常抛出:

    运行时异常会被Java虚拟机自动抛出!

    提早抛出:

    有些比较明确的异常需要提前抛出,这样我们可以通过控制台打印的异常信息快速定位到出错的代码块,同时也可以避免不必要的对象构造或者资源调用。

    如下分别在调用两个方法的时候fileName参数都传递为null,显然采用代码二的方式更有利排查错误。

    延迟捕获:让异常捕获处理放在最外层进行处理,这样才能根据不同的情况进行不同的处理。

    异常分类

    Throwable是所有异常的根,java.lang.Throwable

    Error:错误,Java.lang.Error

    Exception:异常,java.lang.Exception

    运行时异常:

    都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。

    运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。

    非运行时异常 (编译异常):

    是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。

    如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。

    ClassCastException(类转换异常)

    IndexOutOfBoundsException(数组越界异常)

    NullPointerException(空指针异常)

    ArrayStoreException(数据存储异常,操作数组时类型不一致)

    BufferOverflowException(还有IO操作的,缓冲溢出异常)

    简单介绍一下JVM及JVM的堆栈实现

    1.前言。   

    其实jvm能优化的空间不多,最主要的是使用的共享内存不要超过默认的2g或者自己调的参数。但了解一下还是有点意思的,建议面试时还是要看,别学笔者裸奔。

    2.区别。  

    网上说是有5点区别。但笔者认为只有两点主要区别。

     

    堆--用new建立,垃圾自动回收负责回收 

    1、堆是一个"运行时"数据区,类实例化的对象就是从堆上去分配空间的; 

    2、在堆上分配空间是通过"new"等指令建立的;

    3、Java针对堆的操作和C++的区别就是,Java不需要在空间不用的时候来显式的释放; 

    4、Java的堆是由Java的垃圾回收机制来负责处理的,堆是动态分配内存大小,垃圾收集器可以自动回收不再使用的内存空间。 

    5、但缺点是,因为在运行时动态分配内存,所以内存的存取速度较慢。 

    1、栈中主要存放一些基本类型的变量(int, short, long, byte, float, double, boolean, char)和对象句柄; 

    2、栈的存取速度比堆要快; 

    3、栈数据可以共享; 

    4、栈的数据大小与生存期必须是确定的,缺乏灵活性。  

    笔者认为就两点:
    (1)堆主要放new的对象,而栈放基本类型和句柄,句柄指向的是堆。
    (2)垃圾回收的时候回收的是堆,栈比较难回收,一般不回收(这个才是问你的原因,呵呵)。

    3.总结。

    就速度而言,都是内存操作,其实并没有很大区别。

    举例简单介绍一下单例模式

     https://blog.csdn.net/album_gyd/article/details/81369154

    简单介绍一下你以前做过的项目,简单介绍一下负载均衡

    举例介绍一下Java的面向对象,别说概念,举个例子谈谈

    类是面向对象中的一个很重要的概念,因为类是很多个具有相同属性和行为特征的对象所抽象出来的,对象是类的一个实例。

    然后,围绕类的三个特征来说了:封装、继承和多态。

    1、封装:面向对象语言的精髓       

    把一些属性和方法封装起来,形成一个类;

    类的属性一般私有;

    类的方法:该公开的公开,该私有的私有;方法,封装了实现的过程,接口是参数和返回值;

    举例:

      1)get/set 方法;对某一个属性只提供get不提供set方法,就是只读的,在类的外部不能修改;

      2)提供统一的参数检查,在set上给与检查,判断合法性和安全性;将属性都私有,并且提供set/get 方法,做成了通用的组件,叫JavaBean;

    2. 继承:面向对象的主要功能

    继承是一种构建新类的方式,他是基于已有的类的定义为基础,构建新的类,已有的类称为父类,新构建的类称为子类,子类能调用父类的非private修饰的成员,

    同时还可以自己添加一些新的成员,扩充父类,甚至重写父类已有的方法,更其表现符合子类的特征。让子类的表现更独特,更专业。  

    3.多态

    从一定角度来看,封装和继承几乎都是为多态而准备的。这是我们最后一个概念,也是最重要的知识点。

    多态是同一个行为具有多个不同表现形式或形态的能力。多态性是对象多种表现形式的体现

    类中多个方法的重载叫多态,父子类中方法的覆盖也叫多态。

    因此多态有两种体现:一个是方法的重装,一个是方法的覆盖。

    多态有方法的多态和对象的多态(一个对象多种形态)。

    简单介绍一下session和cookie,他们的生命周期是什么?Cookie是否可以跨浏览器

    一、cookie机制和session机制的区别

    具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。

    同时我们也看到,由于才服务器端保持状态的方案在客户端也需要保存一个标识,所以session

    机制可能需要借助于cookie机制来达到保存标识的目的,但实际上还有其他选择

    二、会话cookie和持久cookie的区别

    如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览会话期的cookie被称为会话cookie

    会话cookie一般不保存在硬盘上而是保存在内存里。

      如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。

      存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存的cookie,不同的浏览器有不同的处理方式。

    三、如何利用实现自动登录

    当用户在某个网站注册后,就会收到一个惟一用户IDcookie。客户后来重新连接时,

    这个用户ID会自动返回,服务器对它进行检查,确定它是否为注册用户且选择了自动登录,从而使用户务需给出明确的用户名和密码,就可以访问服务器上的资源。

    四、如何根据用户的爱好定制站点

    网站可以使用cookie记录用户的意愿。对于简单的设置,网站可以直接将页面的设置存储在cookie中完成定制。然而对于更复杂的定制,网站只需仅将一个惟一的标识符发送给用户,由服务器端的数据库存储每个标识符对应的页面设置。

    五、cookie的发送

    1.创建Cookie对象

    2.设置最大时效

    3.Cookie放入到HTTP响应报头

    如果你创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie:存储在浏览器的内存中,用户退出浏览器之后被删除。如果你希望浏览器将该cookie存储在磁盘上,则

    需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie

    发送cookie需要使用HttpServletResponseaddCookie方法,将cookie插入到一个Set-Cookie HTTP请求报头中。由于这个方法并不修改任何之前指定的Set-Cookie报头,而是创建新的报头,因此我们将这个方法称为是addCookie,而非setCookie。同样要记住响应报头必须在任何文档内容发送到客户端之前设置。

    六、cookie的读取

    1.调用request.getCookie

    要获取有浏览器发送来的cookie,需要调用HttpServletRequestgetCookies方法,这个调用返回Cookie对象的数组,对应由HTTP请求中Cookie报头输入的值。

    2.对数组进行循环,调用每个cookiegetName方法,直到找到感兴趣的cookie为止

     cookie与你的主机()相关,而非你的servletJSP页面。因而,尽管你的servlet可能只发送了单个cookie,你也可能会得到许多不相关的cookie

    例如: 

    String cookieName = “userID”;
    
         Cookie cookies[] = request.getCookies();
    
         if (cookies!=null){
    
             for(int i=0;i<cookies.length;i++){
    
             Cookie cookie = cookies[i];
    
             if (cookieName.equals(cookie.getName())){
    
                 doSomethingWith(cookie.getValue());
    
             }
        }
    }    

    七、如何使用cookie检测初访者

    A.调用HttpServletRequest.getCookies()获取Cookie数组

    B.在循环中检索指定名字的cookie是否存在以及对应的值是否正确

    C.如果是则退出循环并设置区别标识

    D.根据区别标识判断用户是否为初访者从而进行不同的操作

    八、使用cookie检测初访者的常见错误

    不能仅仅因为cookie数组中不存在在特定的数据项就认为用户是个初访者。如果cookie数组为null,客户可能是一个初访者,也可能是由于用户将cookie删除或禁用造成的结果。

    但是,如果数组非null,也不过是显示客户曾经到过你的网站或域,并不能说明他们曾经访问过你的servlet。其它servletJSP页面以及非Java Web应用都可以设置cookie,依据路径的设置,其中的任何cookie都有可能返回给用户的浏览器。

    正确的做法是判断cookie数组是否为空且是否存在指定的Cookie对象且值正确。

    九、使用cookie属性的注意问题

      属性是从服务器发送到浏览器的报头的一部分;但它们不属于由浏览器返回给服务器的报头。 

      因此除了名称和值之外,cookie属性只适用于从服务器输出到客户端的cookie;服务器端来自于浏览器的cookie并没有设置这些属性。 

      因而不要期望通过request.getCookies得到的cookie中可以使用这个属性。这意味着,你不能仅仅通过设置cookie的最大时效,发出它,在随后的输入数组中查找适当的cookie,读取它的值,修改它并将它存回Cookie,从而实现不断改变的cookie值。

    十、如何使用cookie记录各个用户的访问计数

    1.获取cookie数组中专门用于统计用户访问次数的cookie的值

    2.将值转换成int

    3.将值加1并用原来的名称重新创建一个Cookie对象

    4.重新设置最大时效

    5.将新的cookie输出

    十一、session在不同环境下的不同含义

    session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话是从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session

    然而当session一词与网络协议相关联时,它又往往隐含了“面向连接”和/或“保持状态”这样两个含义。

      sessionWeb开发环境下的语义又有了新的扩展,它的含义是指一类用来在客户端与服务器端之间保持状态的解决方案。有时候Session也用来指这种解决方案的存储结构。

    十二、session的机制

      session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。

    但程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否包含了一个session标识-称为session id,如果已经包含一个session id则说明以前已经为此客户创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个,这种情况可能出现在服务端已经删除了该用户对应的session对象,但用户人为地在请求的URL后面附加上一个JSESSION的参数)

    如果客户请求不包含session id,则为此客户创建一个session并且生成一个与此session相关联的session id,这个session id将在本次响应中返回给客户端保存。

    十三、保存session id的几种方式

    A.保存session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。

    B.由于cookie可以被人为的禁止,必须有其它的机制以便在cookie被禁止时仍然能够把session id传递回服务器,经常采用的一种技术叫做URL重写,就是把session id附加在URL路径的后面,附加的方式也有两种,一种是作为URL路径的附加信息,另一种是作为查询字符串附加在URL后面。网络在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id

    C.另一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。

    十四、session什么时候被创建

    一个常见的错误是以为session在有客户端访问时就被创建,然而事实是直到某server端程序(Servlet)调用HttpServletRequest.getSession(true)这样的语句时才会被创建。

    十五、session何时被删除

    session在下列情况下被删除:

    A.程序调用HttpSession.invalidate()

    B.距离上一次收到客户端发送的session id时间间隔超过了session的最大有效时间

    C.服务器进程被停止

    再次注意关闭浏览器只会使存储在客户端浏览器内存中的session cookie失效,不会使服务器端的session对象失效。

    十六、URL重写有什么缺点

       对所有的URL使用URL重写,包括超链接,formaction,和重定向的URL。每个引用你的站点的URL,以及那些返回给用户的URL(即使通过间接手段,比如服务器重定向中的Location字段)都要添加额外的信息。

       这意味着在你的站点上不能有任何静态的HTML页面(至少静态页面中不能有任何链接到站点动态页面的链接)。因此,每个页面都必须使用servletJSP动态生成。即使所有的页面都动态生成,如果用户离开了会话并通过书签或链接再次回来,会话的信息都会丢失,因为存储下来的链接含有错误的标识信息-该URL后面的SESSION ID已经过期了。  

    十七、使用隐藏的表单域有什么缺点

         仅当每个页面都是有表单提交而动态生成时,才能使用这种方法。单击常规的<A HREF..>超文本链接并不产生表单提交,因此隐藏的表单域不能支持通常的会话跟踪,只能用于一系列特定的操作中,比如在线商店的结账过程

    十八、会话跟踪的基本步骤

    1.访问与当前请求相关的会话对象

    2.查找与会话相关的信息

    3.存储会话信息

    4.废弃会话数据

    十九、getSession()/getSession(true)getSession(false)的区别

    getSession()/getSession(true):当session存在时返回该session,否则新建一个session并返回该对象

    getSession(false):当session存在时返回该session,否则不会新建session,返回null

    二十、如何将信息于会话关联起来

      setAttribute会替换任何之前设定的值;如果想要在不提供任何代替的情况下移除某个值,则应使用removeAttribute。这个方法会触发所有实现了HttpSessionBindingListener接口的值的valueUnbound

    方法。

    二十一、会话属性的类型有什么限制吗

    通常会话属性的类型只要是Object就可以了。除了null或基本类型,如int,double,boolean

    如果要使用基本类型的值作为属性,必须将其转换为相应的封装类对象

    二十二、如何废弃会话数据

    A.只移除自己编写的servlet创建的数据:

        调用removeAttribute(key)将指定键关联的值废弃

    B.删除整个会话(在当前Web应用中)

        调用invalidate,将整个会话废弃掉。这样做会丢失该用户的所有会话数据,而非仅仅由我们

    servletJSP页面创建的会话数据

    C.将用户从系统中注销并删除所有属于他(或她)的会话

        调用logOut,将客户从Web服务器中注销,同时废弃所有与该用户相关联的会话(每个Web应用至多一个)。这个操作有可能影响到服务器上多个不同的Web应用

    二十三、使用isNew来判断用户是否为新旧用户的错误做法

    public boolean isNew()方法如果会话尚未和客户程序(浏览器)发生任何联系,则这个方法返回true,这一般是因为会话是新建的,不是由输入的客户请求所引起的。

    但如果isNew返回false,只不过是说明他之前曾经访问该Web应用,并不代表他们曾访问过我们的servletJSP页面。

    因为session是与用户相关的,在用户之前访问的每一个页面都有可能创建了会话。因此isNewfalse只能说用户之前访问过该Web应用,session可以是当前页面创建,也可能是由用户之前访问过的页面创建的。

    正确的做法是判断某个session中是否存在某个特定的key且其value是否正确

    二十四、Cookie的过期和Session的超时有什么区别

    会话的超时由服务器来维护,它不同于Cookie的失效日期。首先,会话一般基于驻留内存的cookie

    不是持续性的cookie,因而也就没有截至日期。即使截取到JSESSIONID cookie,并为它设定一个失效日期发送出去。浏览器会话和服务器会话也会截然不同。

    二十五、session cookie和session对象的生命周期是一样的吗

    当用户关闭了浏览器虽然session cookie已经消失,但session对象仍然保存在服务器端

    二十六、是否只要关闭浏览器,session就消失了

    程序一般都是在用户做log off的时候发个指令去删除session,然而浏览器从来不会主动在关闭之前通知服务器它将要被关闭,因此服务器根本不会有机会知道浏览器已经关闭。服务器会一直保留这个会话对象直到它处于非活动状态超过设定的间隔为止。

    之所以会有这种错误的认识,是因为大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个session id就消失了,再次连接到服务器时也就无法找到原来的session

    如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求报头,把原来的session id发送到服务器,则再次打开浏览器仍然能够找到原来的session

    恰恰是由于关闭浏览器不会导致session被删除,迫使服务器为session设置了一个失效时间,当距离客户上一次使用session的时间超过了这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空间。

      由此我们可以得出如下结论:

      关闭浏览器,只会是浏览器端内存里的session cookie消失,但不会使保存在服务器端的session对象消失,同样也不会使已经保存到硬盘上的持久化cookie消失。

    二十七、打开两个浏览器窗口访问应用程序会使用同一个session还是不同的session

    通常session cookie是不能跨窗口使用的,当你新开了一个浏览器窗口进入相同页面时,系统会赋予你一个新的session id,这样我们信息共享的目的就达不到了。

    此时我们可以先把session id保存在persistent cookie(通过设置session的最大有效时间),然后在新窗口中读出来,就可以得到上一个窗口的session id了,这样通过session cookiepersistent cookie的结合我们就可以实现了跨窗口的会话跟踪。

    二十八、如何使用会话显示每个客户的访问次数

    由于客户的访问次数是一个整型的变量,但session的属性类型中不能使用intdoubleboolean等基本类型的变量,所以我们要用到这些基本类型的封装类型对象作为session对象中属性的值

      但像Integer是一种不可修改(Immutable)的数据结构:构建后就不能更改。这意味着每个请求都必须创建新的Integer对象,之后使用setAttribute来代替之前存在的老的属性的值。例如:

    HttpSession session = request.getSession();
    
    SomeImmutalbeClass value = (SomeImmutableClass)session.getAttribute(“SomeIdentifier”);
    
    if (value= =null){
    
         value = new SomeImmutableClass(…); // 新创建一个不可更改对象
    
    }else{
    
         value = new SomeImmutableClass(calculatedFrom(value)); // 对value重新计算后创建新的对象
    
    }
    
    session.setAttribute(“someIdentifier”,value); // 使用新创建的对象覆盖原来的老的对象

    二十九、如何使用会话累计用户的数据

    使用可变的数据结构,比如数组、ListMap或含有可写字段的应用程序专有的数据结构。通过这种方式,除非首次分配对象,否则不需要调用setAttribute。例如

    HttpSession session = request.getSession();
    
    SomeMutableClass value = (SomeMutableClass)session.getAttribute(“someIdentifier”);
    
    if(value = = null){
    
         value = new SomeMutableClass(…);
    
         session.setAttribute(“someIdentifier”,value);
    
    }else{
    
         value.updateInternalAttribute(…);      // 如果已经存在该对象则更新其属性而不需重新设置属性
    
    }

    三十、不可更改对象和可更改对象在会话数据更新时的不同处理

    不可更改对象因为一旦创建之后就不能更改,所以每次要修改会话中属性的值的时候,都需要

    调用setAttribute(someIdentifier,newValue)来代替原有的属性的值,否则属性的值不会被更新

    可更改对象因为其自身一般提供了修改自身属性的方法,所以每次要修改会话中属性的值的时

    候,只要调用该可更改对象的相关修改自身属性的方法就可以了。这意味着我们就不需要调

    setAttribute方法了

     

    面试过程:

    考官说要不先做一下自我介绍吧,由于紧张然后把学校里自我简绍的磨练给忘了只是简短的做了姓名年龄毕业学校的回答,完全忘了把特长兴趣爱好介绍了,回来后才发现自己脑子当时干嘛了
    第二,考官问你对公司了解多少呢,一定要记得面试前下点功夫,然后如果实在不知道就实事求是就可以,考官一般都挺好的,他在你不知道情况下会简短的把公司概况说一下的,然后回问你对自己专业以及未来发现方向,三到五年的规划什么的,一定要面试前把规划计划好
    再就是你的简历问题,一定要实事求是,他们会从你简历里挑你很擅长的东西查看你的掌握情况以及真实度从而侧面看你人品
    还提了很多专业知识的问题
    最后会问你对薪资,以及自己对公司有什么要求呀,你还有什么问题呀之类,但问的一定不要问太多,一个两个代表性的就够了。

  • 相关阅读:
    一个有关FWT&FMT的东西
    【XSY2762】插线板 分块
    【XSY1905】【XSY2761】新访问计划 二分 树型DP
    【XSY2760】nonintersect 计算几何
    【XSY2787】Mythological VII 贪心
    【XSY2786】Mythological VI 数学
    【XSY2785】模型
    【BZOJ4126】【BZOJ3516】【BZOJ3157】国王奇遇记 线性插值
    【XSY2751】Mythological IV 线性插值
    【XSY2750】Mythological V 2-sat
  • 原文地址:https://www.cnblogs.com/chuijingjing/p/9969683.html
Copyright © 2011-2022 走看看