Java记录二

1、Spring boot框架

Spring MVC和Spring Boot都属于Spring,Spring MVC 是基于Spring的一个 MVC 框架,而Spring Boot 是基于Spring的一套快速开发整合包,用于自动配置,降低项目配置的复杂度。

 

2、对Spring框架的理解

Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。它们分别是:

1)核心容器IOC和DI;

2)Spring 上下文:Spring 上下文是一个配置文件,名为ApplicationContext.xml;

3)Spring AOP:它为基于 Spring 的应用程序中的对象提供了事务管理服务。

  • 针对每个具体类分别编写代理类
  • 针对一个接口编写一个代理类

4)Spring DAO:用该异常层次结构来管理异常处理和不同数据库供应商抛出的错误消息,面向 JDBC。

5)Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上。

6)Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。

7) Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,比如hibernate。

 

3、核心容器的模块

核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC)模式根据配置文件去创建实例并创建各个实例之间的依赖关系 ,将应用程序的配置和依赖性规范与实际的应用程序代码分开。核心容器定义了创建、配置和管理 bean 的方式。

 

4、分布式

 

5、大数据、数据仓库和数据分析

大数据:海量又复杂的数据集合,数据体量巨大(Volume),数据类型繁多(Variety),价值密度低(Value),处理速度快(Velocity)。

数据仓库:数据仓库是一种系统,这种系统用数据库装东西 。数据仓库是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合,用于支持管理中的决策制定。

数据分析:

 

6、对象序列化

将实现了Serializable接口的对象转换成一个字节序列,并能够在以后讲这个字节序列完全恢复成对象。

序列化机制能使对象在程序不运行时仍能存在并保存信息,通过将一个序列化对象写入磁盘,然后在重新调用程序时恢复该对象,使该对象有一个持久性的生存周期。

对象的序列化可以实现轻量级持久性。之所以为轻量级,是因为对象必须在程序中显式地序列化和反序列化还原。若需要更严格的持久性机制,需考虑hibernate一样的对象关系工具。

对于java beans来说,对象序列化是必需的。bean工厂根据配置文件创建bean实例和实例间的关系,这个bean的状态必须保存下来,以在程序启动时进行恢复。

序列化操作:首先要创建某些OutputStream对象,然后将其封装在一个ObjectOutputStream对象内,然后调用writeObject()将对象序列化,并将其发送给OutputStream;

反序列化操作:创建某些InputStream对象,将其封装在一个ObjectInputStream对象内,调用readObject()并发送给InputStream。

 

7、String、StringBuilder、StringBuffer的区别

String是不可变对象,每次对String的修改操作实际上都生成了一个新的String对象;

StringBuffer是可变字符序列,用一个不可修改的字符串缓冲区来存储字符串,它是线程安全的;

StringBuilder是可变字符序列,每一次该对象的修改都是对自身进行操作。但它是非线程安全的,用于字符串缓冲区被单个线程使用的时候;它提供了与StringBuffer兼容的api,故两者方法基本相同,但大多数实现中,它比StringBuffer快;

 

8、HashMap和HashTable的区别

HashMap和Hashtable使用了相同的底层存储和查找机制,故性能大体上相当;但HashMap是Hashtable轻量级的实现,Hashtable是线程安全的,其各方法都是Synchronized的,而HashMap是非线程安全的;HashMap允许将null作为一个Map.Entry的Key或者Value,而Hashtable不允许。

 

9、HashMap有一种情况会造成缓冲区溢出

如果使用String作为id则会因为Map中的值引用了自己的键,导致JVM无法根据键是否还被引用而清除 WeakHashMap中的entry;

public class Locker {   
    private static WeakHashMap lockerMap = new WeakHashMap();   
    private final String id;   
    private Locker(String id) {   this.id= id;   }   
    public synchronized static Locker acquire(String id) {   
        Locker locker = lockerMap.get(id);   
        if (locker == null) {   
            locker = new Locker(id);   
            lockerMap.put(id, locker);  //问题代码,导致了entry.key == entry.value.id       
       //lockerMap.put(new String(id), locker); //这是一种修改方式,保证了WeakHashMap中的key,没有被value直接或间接所引用    }    return locker;    }    public String getId() {   return this.id;   }    }

 

10、HTTP 请求的类型

OPTIONS方法:用于返回服务器支持的HTTP方法;

HEAD方法:类似于GET,但仅返回HTTP的报头;

GET方法:用于请求指定的页面数据;不重复提交,url中可见,数据类型、长度有限制;

POST方法:将指定的资源提交到服务器进行处理;重复提交,url中不可见,数据类型、长度无限制;

PUT方法:用于向服务器上传指定的资源;

DELETE方法:请求服务器删除指定的资源;

TRACE方法:回显服务器收到的请求;

重点get和post的区别:

1)GET请求会被浏览器主动cache,而POST不会;

2)GET请求只能进行url编码,而POST支持多种编码方式;

3)GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留;

4)GET请求在URL中传送的参数是有长度限制的,而POST没有;

5)参数数据类型,GET只接受ASCII字符,而POST没有限制;

6)GET参数通过URL传递,POST放在Request body中;

7)GET和POST本质都是TCP连接,但GET产生一个TCP数据包;POST产生两个TCP数据包;  

  ·对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);

  ·而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据);

  ·并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次;

 

11、Servlet中请求重定向和请求转发的区别和实现

请求重定向:浏览器进行了两次请求和响应,第一次响应信息没有包含其它任何数据,只是在响应头中Location字段包含了一个需要重定向的url地址,第二次请求中没有携带表单信息;请求重定向可以访问其它应用的地址。

HttpServletResponse response;
response.sendRedirect(some_url);

请求转发:整个过程浏览器只有一次请求和响应,转发过程中各组件共享同一组请求响应对象;转发只能在同一应用组件间进行,不能转发给其它应用的地址。

HttpServletRequest req;
HttpServletResponse response;
String forward_url = "some";
RequestDispatcher rd = req.getRequestDispatcher(forward_url); //RequestDispatcher封装了转发操作,它接受来自客户端的请求,转发到指定资源
rd.forward(req,response);

 

12、控制反转、依赖注入和依赖倒置

参考文章:控制反转和依赖注入的理解(通俗易懂)

       面试官:你是如何理解Java中依赖倒置和依赖注入以及控制反转的?

posted @ 2019-05-09 14:20  thePacer  阅读(189)  评论(0编辑  收藏  举报