阿里面经

1.自我介绍

2.问你做过的项目,涉及的框架技术。

3.具体介绍Java四个基本属性(抽象,继承,多态,封装)这时他可能就会问你对多态的理解及哪个地方用到了多态。

抽象:说白就是把对象共同特征总结出来,构造类的一个过程,其中抽象有两个方面,1.数据抽象和行为抽象,抽象和类是一样的也是只关注属性和方法。不关心方法中做了什么。

继承:要清楚是从已有的类的继承信息创造新的类的一个过程,强调一下是已有的类。其中提供信息的一方称之为父类,超类及基类。得到继承信息的一方称之为子类,有了继承让系统有了一定的延续性,子类可以有自己的个性。

封装:人们通常会把封装认为是把数据和操作数据的方法进行绑定在一起,要想访问你只能通过访问已定义好的接口,这也表明了面向对象的思想就是把现实存在的世界进行一个完全治理,封闭式的这么一个对像,也可以这么说封装是想把隐藏一些要隐藏的东西,只向外面提供一个可以调用的接口。

多态:指的是允许不同子类对象对同一信息做出不同的响应。

多态的实现方式有哪些:

重载:也称为前绑定,实现的是编译时的多态性

重写:也称为后绑定,运行时的多态性

这里简单举一个例子,我们知道现实中有两种人一个是买房人一个是卖房人,他们在登陆界面成功时会出现不同的界面,但是他们登陆的方法都是同一个父类只是一个不同操作罢了。

4.考官经常会问的一个问题也是初学者难以口头表达出来的东西,或许你知道怎么回事就是说不出来。

面向对象和面向过程的区别:

面向过程:相当于管家对细节的事无微不至。

面向对象:是比喻为家用电器,只要知道她的功能就行只知道怎么用就可以,不要搞清楚她的原理。

这里举个例子:面向过程注重的是事件,比如你开车到学校,车子发动时是一个事车 子到达学校时又是一个事件。注重的是事件。面向对象关心的是对象的本身也就是汽车,从汽车到达学校只不过是他的行为。

面向过程时能不能实现面向对像:

那是不是表示不能面向对象:

5.重写和从载,我们怎么确定用哪个:

重载:发生在同一个类中,方法名相同只不过是参数不同。

重写:

6.面向对象开发时的六个基本原则:

单一职责:不管项目多大,功能多么复杂。一个类只能做他该做的事也是所谓的高内聚。

开放封闭: 开放指的是扩展开放,封闭指的是修改封闭。开放和封闭要做到两点,1.要有抽象类或接口,那么你就很难去扩展其功能点也就是业务层。2.封装的可变性:把一个可变的因素封装到一个继承体系当中。

里氏替换:子类继承父类,在类当中子类的能力一定是父类之上,这样子类也就可以替换掉父类。

依赖倒置:是我们后面学到的面向接口的一个编程,也就一些声明方法的参数类型,我们回忆下高中数学通常都会用一个未知数X来替代,解出方程。那么接口也就相当于这个X,当我们还不知道这个子类型时通常会用抽象类型来替代。

合成聚合复用:优先使用聚合。

接口隔离:接口我们一定要做到小而专心。不可让他变得过于臃肿那简直时对接口的侮辱,我们要深刻明白一种接口我们只能用为一种功能,也常常表示为接口的高内聚。

7.static和final的区别和用途

Static:1.静态变量随着累加载时会被初始化,内存中也就只能有一个,jvm也只分配她一次内存,所有的类都可以共享她的静态变量。2.static方法必须实现,当然也就不能抽象方法来修饰。

Final:分为两种常量,一种叫编译时的常量:完成了初始化后带入计算机中,一种基本常量。

另一种是运行时的常量,也是叫基本数据类型或叫引用数据类型。记住引用是不能变,变得是她的对象。同时不能被继承更不能被子类修改。

8.java实现多线程的三种不同方式及区别在哪里

8.1.继承Thread类,重写run函数。

继承Thread类和runnable方法开启线程使用的是start方法。虚拟机会对这线程放入队列中,如果说有处理机可以用,会优先运行run方法。

8.1.2.实现他的Runnable接口

8.1.3.实现他的Callable接口

9.Jsp&Servlet

Servlet的生存周期中Servlet接口定义的五种方法。

9.1.-void init(ServletConfig config)throws ServletException

9.2.void servlet(ServletRequest req,ServletResponse resp)。。。

9.3.void destory()

9.4.java.lang.String.getSercletInfo()

9.5.ServletConfig getServletConfig()

Web容器要加载service()方法让他进行实力化之后也就表明她的生命周期就开始了init()方法让其初始化,请求达到时调用Servlet的service方法,会根据其对应的请求调用doget和dopost方法。浏览器是无脑子的,卸载时Servlet实例就会摧毁,这时就会调用Servlet的destroy方法。

10.了解Jsp&Servlet区别

Servlet无疑是一个特殊的Java程序,他是运行在虚拟机上的,是通过服务器像浏览器提供并显示内容,JSP本质上就是Servlet简易的一种形态,此时JSP就会被服务器处理变成一个可处理的类,为的是简化页面内容的生成。JSP和Servlet不同之是处在于,Servlet应用逻辑是在Java文件中,他是从HTML分离开来的。但JSP是在HTML加上java组成一个扩展名为.jsp文件。jsp注重的更是视图一个表现层的东西而Sevlet注重的则是逻辑方面,后面如果我们学到框架中SpringMvc就会深刻理解到JSP注重的是视图(view)而里面的Servlet充当的是控制器。

11.cookie和session的区别

session是在服务器端的,cookie呢是在客户端的。

session和cookie是有紧密关系的,当我们session运行依赖的是session中的id但id又是存在于cookie当中是不是很玄妙,也就是你要是禁止了cookie同时session肯定会失效,但是,不是绝对的因为我们可以用其她的方法比如用路径的形式通过路径url聚载他的id。

比较常见session的时候应该就是用户验证了吧。

你要明白cookie是不安全的因为我们都可以看到他,所以考虑到安全问题我们要用session。但session也不是最好的因为我们知道session是保存在服务器上的,要是访问量多了你。你的性能就会下降,只能说看情况办事。

12.Spring&Hibernate

详细介绍SpringIOC和IOP的理解和工作原理

1.SpringIOC:IOC也为控制反转全名如果不记错应该骄傲Inversion of Control。有一个叫DI的也就我们经常说的依赖注入,控制反转的概念我更喜欢解译为把传统的代码对,对像的操控交给了容器,通过容器对其装配和管理。所以控制反转就是把控制权的转移。从代码的本身交给了外部容器,这样容器就可以创建他的对像并且管理对像与对像的依赖关系,这样容器就可以动态的将这种依赖关系注入到组件当中去。

Spring IOC 的实现原理:

1.通过反射去创造实例的

2获取她要注入的接口实现类并将返回给接口。

Spring AOP:

AOP全称为Aspect-Oriented Programing☞一种设计范型,他是面向切面为基础的,切面说白点就是一个机制一个具有模块化的机制,用来描述分散在对象、类或方法中的横切关注点(crosscutting concern)。 ○ "横切关注"是会影响到整个应用程序的关注功能,它跟正常的业务逻辑是正交的,没有必然的联系,但是几乎所有的业 务逻辑都会涉及到这些关注功能。通常,事务、日志、安全性等关注就是应用中的横切关注功能。 

Spring AOP实现原理:

动态代理:他是将代理模式变成动态的,利用的是反射和动态编译原理

JDK动态代理:JDKProxy返回动态代理类,是目标类所实现接口的另一个实现版本,它实现了对目标类的代理(如同 UserDAOProxy与UserDAOImp的关系

cglib动态代理 :CGLibProxy返回的动态代理类,则是目标代理类的一个子类(代理类扩展了UserDaoImpl类) 59. Ioc容器的加载过程 

IOC容器加载过程

创建他的IOC配置文件里的抽象资源

创建一个bean工厂

13.动态代理与cglib实现的区别

JDK代理是不需要第三方库的,只要JDK环境就可以运行代理

JDK动态代理只是实现接口类的生成,并不是针对类的

CGLIB是主要针对类的,由指定的类生成她应有的子类,要想覆盖她最好的办法是继承,所已我们就不能用final。

CGLIB她是依赖类库的,他是通过欸来实现接口。

14.HIbernate一级缓存与二级缓存之间的区别


Hibernate的Session提供了一级缓存的功能,默认总是有效的,当应用程序保存持久化实体、修改持久化实体时,Session 并不会立即把这种改变提交到数据库,而是缓存在当前的Session中,除非显示调用了Session的flush()方法或通过close()方 法关闭Session。通过一级缓存,可以减少程序与数据库的交互,从而提高数据库访问性能。 • SessionFactory级别的二级缓存是全局性的,所有的Session可以共享这个二级缓存。不过二级缓存默认是关闭的,需要显 示开启并指定需要使用哪种二级缓存实现类(可以使用第三方提供的实现)。一旦开启了二级缓存并设置了需要使用二级缓 存的实体类,SessionFactory就会缓存访问过的该实体类的每个对象,除非缓存的数据超出了指定的缓存空间。 • 一级缓存和二级缓存都是对整个实体进行缓存,不会缓存普通属性,如果希望对普通属性进行缓存,可以使用查询缓存。查 询缓存是将HQL或SQL语句以及它们的查询结果作为键值对进行缓存,对于同样的查询可以直接从缓存中获取数据。查询缓 存默认也是关闭的,需要显示开启。

Spring MVC的工作原理:

接下里如图所示


阿里面经_第1张图片

SpringMVC 的好处在于她的所有请求都是交给前端控制器的也就是DispatcherServlet来处理的。她会扶着系统的其他模块来处理用户请求。

前端控制器接到请求后就会根据请求的信息可以是URL,HTML协议,请求头,参数,Cookit等等。

看着上面的图,那么HandlerMapping配置就会找到处理请求中的handler,Spring就会通过HandlerAdapter来对其处理进行主要封装

HandlerAdapter是一个适配器作用是她由一个统一的接口对各种请求进行调用

当Handler请求完成对用户请求处理完后就会返回给视图也就是ModelAndView。视图对象就会又交给了DispatcherServlet。

当得到真正视图对象后DispatcherServlet就会利用视图对象对模型数据进行渲染

这样客户端接收到响应后可能只是一个普通的HTML页面,也可以是XML或者是JSON,还可以是一张图片

简述Hibernate常见优化策略:

• 制定合理的缓存策略(二级缓存、查询缓存)。 • 采用合理的Session管理机制。 • 尽量使用延迟加载特性。 • 设定合理的批处理参数。 • 如果可以,选用UUID作为主键生成器。 • 如果可以,选用基于版本号的乐观锁替代悲观锁。 • 在开发过程中, 开启hibernate.show_sql选项查看生成的SQL,从而了解底层的状况;开发完成后关闭此选项。 • 考虑数据库本身的优化,合理的索引、恰当的数据分区策略等都会对持久层的性能带来可观的提升,但这些需要专业的 DBA(数据库管理员)提供支持。

15.线程安全问题:

线程安全分为两点,1.类的行为是否规范一致。2.访问该类时不需要额外的同步处理或者协调,我们就认为。他是线程安全的。

上面讲什么时线程安全下面讲如何保证线程就是安全的:

对变量用volitate,对程序进行加锁。

16.多线程如何进行信息交互:

用的时Object中的方法,wait()  notify() nitifyAll();

17.

31.数据库

说到数据库我们先了解一下常见数据库有哪些;1.Mysql,2.SQLServer

对Redis简介:Redis是一个十分快讯的非关系型数据库,他是工具key与不同类型v的值valua中的映射。把储蓄在内存的键值对数据持久化到硬盘当中。

32.数据库索引优缺点,及什么时候索引失效:

你可能感兴趣的:(阿里面经)