java面试总结

    xiaoxiao2022-07-12  138

    一、request和session的区别?

    request是通过用户提交的表单,查询字符串、cookie获得信息。request占用资源比较少,安全性也比较高,可是相对来说,缺乏持续性。

    session是服务端用来保存一些数据,session相对来说对资源的消耗对大点,安全性相对来说也会稍微低点,可是他能实现回话跟踪技术。

    生命周期也不一样,request只在数据提交,提交以后即释放,。session则是浏览器关闭释放。

    二、客户端调用EJB对象的几个基本步骤。

    设置JNDI服务工厂以及JNDI服务地址系统属性,查找Home接口,从Home接口调用create方法创建Remote接口,通过Remote接口调用其业务方法。

    三、jsp的内置对象以及作用

    1、request 触发调用的请求 2、response对请求的应答 3、session 为请求的客户创建的session对象

    4、application 从servlet配置对象获得的servlet上下文 5、out 向输出流写入内容的对象

    6、pageContext 本JSP的页面上下文 7、page实现处理本页当前请求的类的实例

    8、config本jsp的servletConfig 9、exception 表示JSP页面运行时产生的异常

    四、工厂模式

    抽象工厂模式提供一个借口,用于创建相关或者依赖对象的家族,而不需要指定具体的实现类。

    抽象工厂模式允许客户使用抽象接口来创建一组相关的产品,客户类和工厂类分开,客户需要任何产品的时候,只需要向工厂请求即可。

    客户无需修改就可以获得新产品,这样一来,客户就从具体产品中解藕

    五、电商业务流畅

    查看产品--》咨询客服--》确定下单--》预付定金(支付宝系统除外)--》对外发货--》确定收货--》售后服务

    六、主从复制的原理

    1、master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志文件)

    2、slave将master的binary log events拷贝到它的中继日志(relay log)

    3、slave重做中继日志中的事件,将更改应用到自己的数据上。

    七、什么是spring框架,为什么要使用spring框架?

    spring是一个开源轻量级javaSE/javaEE开发应用框架,其目的使用于简化企业级应用程序开发。

    为什么要使用?

    1、降低组件之间的耦合度,实现各层之间的解藕

    2、可以使用容器提供的总舵服务 如:--事务管理服务 --JMS --spring core核心服务   --持久化服务 --其他

    3、提供了单例模式支持,开发人员不需要自己编写实现代码

    4、提供AOP技术。实现如:权限拦截,运行监控等功能

    5、提供总舵的辅助类。如JDBC Template,Hibernate Template。

    6、对主流的应用框架提供了集成支持。集成struts,JPA,Hibernate

    八、请说明一下你对mvc模式的理解?

    mvc模式是表示层开发最常用的设计模式,使用这个设计模式的目的使为了解除控制逻辑,业务逻辑

    和视图之间的耦合,提升系统的可扩展性和可维护性。

    mvc模式主要是由模型,控制器和视图三个部分组成。其中控制器的主要责任是接受客户所提交的请求,

    并将请求转发给适当的模型对象进行处理,再将处理额结果发给视图进行显示。

    九、jsp中动态include与静态include的区别

    动态include在使用的时候,会先解析所要包含的页面,解析后和主页面放到一起显示;

    <jsp:include page="included.jsp" flush="true" />

    静态include在使用的时候,不会解析索要包含的页面。

    <%@ include file="included.htm" %>

    十、HashTable HashMap

    HahsMap和Hashtable的底层实现都是数组+链表结构实现的,这点完全一致,从存储结构和实现来讲基本上都是相同的,最大额不同就是hashtable使线程安全的,put方法都加了synchronized关键字

    java中的HashMap是以键值对(key-value)的形式存储元素的。HashMap需要一个hash函数,它使用hashCode()和equals()方法来向集合/从集合添加和检索元素。当调用put()方法的时候,HashMap会计算key的hash值,然后把键值对存储在集合中合适的索引上。如果key已经存在了,value会被更新成新值。HashMap的一些重要的特性是它的容量(capacity),

    负载因子(load factor)和扩容极限(threshold resizing)。

    HashMap和HashTable有什么区别?

    1、hashmap允许键和值是null,而Hashtable不允许键或值是null

    2、hashtable是同步的,而hashmap不是。因此 hashmap更适合单线程环境,二hashtable适合于多线程环境

    3、hashmap提供了可供应用迭代的键的集合,因此,hashmap是快速失败的。另一方面,Hashtable提供了对键的列举

    4、一般认为hashtable是一个遗留的类

    十一、ArrayList和LinkedList有什么区别?

    ArrayList和LinkedList都实现了List接口,他们有以下的不同点:

    1、ArrayList是基于索引的数据接口,它的底层是数据,查询速度比较快。

    LinkedList是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素连接在一起,查询速度慢

    2、LinkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者更新索引

    3、LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素

    十二、Comparable和Comparator接口是干什么的?列出它们的区别

    java提供了只包含一个comparaTo()方法的Comparable接口。这个方法可以给两个对象排序。

    具体来说,它返回负数,0,正数来表明输入对象小于,等于,大于已经存在的对象。

    java提供了包含compare()和equals()两个方法的Comparator接口。compare()方法用来给两个输入参数排序,返回负数,0,正数,表明第一个参数是小于,等于,大于第二个参数。

    equals()方法需要一个独享作为参数,它用来决定输入参数是否和comparat相等。只有当输入参数也是一个Comparator并且输入参数和当前Comparator的拍寻结果是相同的时候,这个方法才返回true。

    十三、单例模式是什么?用代码写一个单例模式

    单例模式是最简单的设计模式:整个程序中只允许有唯一的一个对象(这个类只能实例化一次)

    //懒汉,线程安全

    public class Singleton{

    private static Singleton instance;

    private Singleton(){}

    public static synchronized Singleton getInstance(){

    if(instance == null){

    instance = new Singleton();

    }

    return instance;

    }

    }

    十四、spring mvc处理Http请求的大致过程:

    1、用户发起请求,请求到DispatcherServlet前端控制器

    DispatcherServlet(中央调度),负责request和response,负责调用处理器映射器查找Handler,负责调用处理器

    适配器执行Handler,有了前端控制器降低了各个组件之间的耦合性,系统扩展性提高。

    2、DispatcherServlet前端控制器请求处理器映射器HandlerMapping查找Handler

    根据用户请求的url,根据一定的规则去查找(比如:xml配置,注解)

    3、HandlerMapping处理器映射器将Handler返回给前端控制器

    4、DispatcherServlet前端控制器调用HandlerAdapter处理器适配器执行Handler

    程序员编写的Handler是按照适配器要求的规则去执行Handler

    5、HandlerAdapther处理器适配器执行Handler

    适配器按照一定规则去执行Handler

    6、Handler执行完成,返回ModelAndView

    7、HandlerAdapter处理器适配器将ModelAndView返回给前端控制器

    8、前端控制器调用视图解析器,进行视图解析,解析完成给前端控制器返回View

    view是springmvc的封装对象,是一个接口,实现类包括jspview,pdfview。。。

    9、前端控制器调用view进行视图渲染

    将模型数据填充到view(将model数据填充到request)响应给用户

    10、前端控制器响应给用户。

    十五、服务器端解决跨域问题的三种方法

    跨域是指html文件所在的服务器与ajax请求的服务器是不同的ip+port,例如:

    ’192.168.1.1:8080’ 与 ‘192.168.1.2:8080’是不同的域。

    ‘192.168.1.1:8080’ 与 ‘192.168.1.1:8081’是不同的域。

    第一种:如果您使用的mvc框架是spring4.2以上的话,一个@CrossOrigin就可以搞定。将@CrossOrigin加到Controller上,那么这个Controller所有的请求都是支持跨域的,代码如下:

    @Controller

    @CrossOrigin

    public class GreetingController{}

    将@CrossOrigin加到请求方法上,那么这个请求是支持跨域的,代码如下

    @CrossOrigin

    @RequestMapping("/greeting")

    public @ResponseBody Greeting greeting(@RequestParam(required=false, defaultValue="World") String name) {

    第二种:全局配置,也需要spring4.2以上。

    @Bean

    public WebMvcConfigurer corsConfigurer(){

    retrun new WebMvcConfigurerAdapter(){

    @Override

    public void addCorsMappings(CorsRegistry registry){

     

    registry.addMaping("/greeting-javaconfig").allowedOrigins("http://localhost:9000");

    }

    };

    }

    .addCorsMappings()中的参数代表支持跨域的url,.allowedOrigins()中的参数代表可以访问该接口的域名,设置为" *",可支持所有域。

    第三种:这种方法就跟框架无关了,需要两个jar包,点击这里进行下载,两个jar包可以放得程序里,也可以放到tomcat中,然后将下面的配置写到web.xml中就可以了

    什么叫死锁?产生死锁的条件和预防死锁的各种方法? 所谓死锁:是指两个或两个以上的线程在运行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,他们都将无法推进下去。那么为什么会产生死锁呢? 因为系统资源不足。线程推进的顺序不合适资源分配不当

    死锁的产生有四个必要条件:

    互斥使用(资源独占),任意时间内进程对其占有的资源有排他控制性,其他申请的进程必须等待非剥夺控制,除非是进程自动放弃对资源的占有,否则其他进程无法强制使其释放,即使它处于阻塞态零散请求,即进程可根据自己的需求在不同的时间发出申请,而不必集中在一起申请,当申请不到资源时,也不会改变其原先占有的资源循环等待,等待资源的进程形成了一个封闭的链,链中进程都在等待下一进程结束,陷入了无休止的等待当中

    四个条件,破坏其一,就不属于死锁了

    预防死锁的各种方法

    在系统设计中,进程调度等方面注意如何不让着四个必要条件成立。

    确定资源的合理分配。避免进程永久占据系统资源。防止进程在处于等待状态的情况下占用资源 java多线程中synchronized和lock的区别 主要相同点:Lock能完成synchronized所实现的所有功能。主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。Synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放 nginx、redis配置 Nginx 有三个模块 一个http核心模块 nginx核心模块 event核心模块 在http模块中配置  upstream 这里写你需要配置的那个服务器的ip和端口号,前面加个server空格 这是第一种配置 叫轮询第二种是基于权重的负载均衡 在轮询的基础上,server指令后面加上weight 在weight=1,2,3,4,5 比如两个服务器都是1 则给的请求数一样第三种基于ip的hash值

     

    Nignx配置反向代理和静态代理

    Http模块中配置vhosts配置文件 该文件主要是各个服务器的参数

     #include vhosts

    Vhosts文件中配置的是各个服务器(NFS文件服务器)的参数: server(这里的server指令跟upstream指令是同一等级的指令) / {

    Listen:80;

    ...

    ..

    Proxy_pass : http://localhost:8080/img

    }

    server / {

    Listen:80;

    ...

    Proxy_pass : http://localhost:8080/img

    }

    执行流程;假如nginx接收到一个要静态文件的请求,nginx会根据你请求的路径将请求分配给各个nfs文件服务器,返回给客户端 客户端再次请求后就会直接访问文件服务器。

     

    Redis

    五种数据类型 1、String 2、List 3、set 4、sort set hash

    mybatis和hibernate Hibernate的查询会将表中的所有字段查询出来,这一点会有性能消耗。Hibernate也可以自己写SQL来指定需要查询的字段,但这样就破坏了hibernate开发的简洁性。而mybatis的SQL是手动编写的,所以可以按需求指定查询的字段Join会比in的效率更高 mybatis可以自己写确定效率最高,而hibernate却不一定是效率最高的SQL 使用final关键字修饰一个变量时,是指引用变量不能变,但是引用变量所指向的对象中内容还是可以改变的。

    Math.round(11.5)的结果为12,Math.round(-11.5)的结果为-11

    接口可以继承接口。抽象类可以实现接口,抽象类是可以继承具体类。抽象类中可以有静态的main方法。抽象类与普通类的唯一区别就是不能创建实例对象和允许有abstract方法

    abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized? 都不能

    匿名内部类是否可以extends(继承)其它类,是否可以implements(实现)interface?

    匿名内部类本身就是通过继承类或者接口来实现的。但是不能再显示的extends或者implements了。

     

    二十、SQL优化

    选择最优效率的表明顺序 ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表将被最先处理 如果三个表示完全无关系的话,将记录和列名最少的表,写在最后,然后依次类推如果三个表示有关系的话,将引用最多的表,放在最后,然后依次类推 WHERE子句中的连接顺序 ORACLE采用自右而左的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其它WHERE条件之左,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的之右。SELECT子句中避免使用*号 ORACLE在解析的过程中,会将*以此转换成所有的列名,这个工作是通过查询数据字典完成的,这意味着将耗费更多的时间使用DECODE函数来减少处理时间 使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表整合简单,无关联的数据库访问用TRUNCATE替代DELETE尽量多使用COMMIT 因为COMMIT会释放回滚点用WHERE子句替换HAVING子句 WHERE先执行,HAVING后执行多使用内部函数提高SQL效率使用表的别名 salgrade s使用列的别名用索引提高效率 在查询中,善用索引字符串型,能用=号,不用like 因为=号表示精确比较,like表示模糊比较SQL语句用大写的 因为ORACLE服务器总是先将小写字母转成大写后,才执行避免在索引列上使用NOT 因为ORACLE服务器遇到NOT后,他就会定制目标的工作,转而执行全表扫描避免在索引列上使用计算用 >= 替代 >用in替代or

    二十一、流

    根据处理数据类型的不同分为:字符流和字节流

    根据数据流向不同分为:输入流和输出流

    InputStream是所有的输入字节流的父类,它是一个抽象类

    OutputStream是所有的输出字节流的父类,他是一个抽象类

    Reader是所有的输入字符流的父类,它是一个抽象类

    Writer是所有的输出字符流的父类,它是一个抽象类

     

    最新回复(0)