1、面向对象的特征
java面向对象的的三大特征,封装、继承、多态。
封装:是指将某事物的属性和行为包装到对象中,这个对象只对外公开属性和行为,java中使用private、protected、public、不用,来限制对象属性和方法的访问。
四个作用域可见范围不同。
继承:子类可以继承父类的方法和属性。
多态:父类中同一个方法在多个子类中有不同的表现。
多态的三个必要条件:要有继承、要有重写、父类引用指向子类对象。
2、final、finally、finalize的区别
final:是修饰符。修饰变量不能别改变、修饰方法不能被重写、修饰类不能被继承
finally:java的一种异常处理机制。是异常中的finally块,finally语句块的语句最终被执行,无论是否发生异常。
finalize: Java技术使用finalize()方法。在垃圾收集器将对象从内存中清除出去前,做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在Object类中定义的,因此所有的类都继承了它。子类覆盖finalize()方法以整理系统资源或者执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的
3、int 和 integer区别
区别:Ingeter是int的包装类,int的初值为0,Ingeter的初值为null
①无论如何,Integer与new Integer不会相等。不会经历拆箱过程,new出来的对象存放在堆,而非new的Integer常量则在常量池(在方法区),他们的内存地址不一样,所以为false。
②两个都是非new出来的Integer,如果数在-128到127之间,则是true,否则为false。因为java在编译Integer i2 = 128的时候,被翻译成:Integer i2 = Integer.valueOf(128);而valueOf()函数会对-128到127之间的数进行缓存。
③两个都是new出来的,都为false。还是内存地址不一样。
④int和Integer(无论new否)比,都为true,因为会把Integer自动拆箱为int再去比。
4、重载和重写的区别
重载:同一个类中有相同的方法名,不同的参数个数、类型,返回值类型可相同可不同。
重写:是子类重写父类的方法,要求与被重写方法的,参数列表、方法名、返回值类型相同,访问修饰的权限不能大于被重写方法,不能抛出比被重写方法更宽泛的异常。
5、抽象类和接口有什么区别
接口(interface):接口是抽象方法的集合,一个雷要实现一个接口必须实现接口的抽象方法。(Oracle已经开始尝试向接口中引入默认方法和静态方法,以此来减少抽象类和接口之间的差异。现在,我们可以为接口提供默认实现的方法了并且不用强制子类来实现它),不能被继承,可以使用implements实现。
抽象类(abstract):抽象类是子类的通用特性,不能被实例化,只能被用作子类的超类,抽象类是用来创建继承层级里子类的模板。如HttpServlet extends GenericServlet
6、什么时候用抽象类和接口
假如考虑一些方法需要有默认的实现,就使用抽象类。
假如想实现多重继承,就用接口,java不支持多重继承,子类不能继承多个类,可以实现多个接口。
如果基本功能在不断改变,那么就需要使用抽象类。如果不断改变基本功能并且使用接口,那么就需要改变所有实现了该接口的类。
7、说说反射的用途及实现
java反射机制是非常强大的,spring、mybatis都有反射的身影
获取一个对象的反射类的方法有三种:①对象.getClass()方法②类名.class③Class.ForName("全类名");
8、说说自定义注解的场景及实现
9、HTTP 请求的 GET 与 POST 方式的区别参考
在客户机和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST。
- GET - 从指定的资源请求数据。
- POST - 向指定的资源提交要被处理的数据
GET方法
请注意,查询字符串(名称/值对)是在 GET 请求的 URL 中发送的:
/test/demo_form.asp?name1=value1&name2=value2
- 请求可被缓存
- 请求保留在浏览器历史记录中
- 请求可被收藏为书签
- 请求不应在处理敏感数据时使用
- 请求有长度限制
- 请求只应当用于取回数据
POST方法
请注意,查询字符串(名称/值对)是在 POST 请求的 HTTP 消息主体中发送的:
POST /test/demo_form.asp HTTP/1.1
Host: w3schools.com
name1=value1&name2=value2
比较 GET 与 POST
方法 | GET | POST | |
---|---|---|---|
缓存 | 能被缓存 | 不能缓存 | |
编码类型 | application/x-www-form-urlencoded | application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。 | |
对数据长度的限制 | 是的。当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符) | 无限制。 | |
对数据类型的限制 | 只允许 ASCII 字符 | 没有限制。也允许二进制数据。 | |
安全性 | 与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。在发送密码或其他敏感信息时绝不要使用 GET | POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中。 | |
可见性 | 数据在 URL 中对所有人都是可见的。 | 数据不会显示在 URL 中。 |
其他 HTTP 请求方法
- HEAD 与 GET 相同,但只返回 HTTP 报头,不返回文档主体。
- PUT 上传指定的 URI 表示。
- DELETE 删除指定资源。
- OPTIONS 返回服务器支持的 HTTP 方法
- CONNECT 把请求连接转换到透明的 TCP/IP 通道。
10、session 与 cookie 区别
cookie数据存放在客户的浏览器上,session数据放在服务器上。
cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗考虑到安全应当使用session。
session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用COOKIE。
单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
所以个人建议:
将登陆信息等重要信息存放为SESSION
其他信息如果需要保留,可以放在COOKIE中
11、session 分布式处理参考,不错
第一种:粘性session
粘性Session是指将用户锁定到某一个服务器上,比如上面说的例子,用户第一次请求时,负载均衡器将用户的请求转发到了A服务器上,如果负载均衡器设置了粘性Session的话,那么用户以后的每次请求都会转发到A服务器上,相当于把用户和A服务器粘到了一块,这就是粘性Session机制
第二种:服务器session复制
原理:任何一个服务器上的session发生改变(增删改),该节点会把这个 session的所有内容序列化,然后广播给所有其它节点,不管其他服务器需不需要session,以此来保证Session同步。
第三种:session共享机制
使用分布式缓存方案比如memcached、Redis,但是要求Memcached或Redis必须是集群。
原理:不同的 tomcat指定访问不同的主memcached。多个Memcached之间信息是同步的,能主从备份和高可用。用户访问时首先在tomcat中创建session,然后将session复制一份放到它对应的memcahed上
第四种:session持久化到数据库
原理:就不用多说了吧,拿出一个数据库,专门用来存储session信息。保证session的持久化。 优点:服务器出现问题,session不会丢失 缺点:如果网站的访问量很大,把session存储到数据库中,会对数据库造成很大压力,还需要增加额外的开销维护数据库。
第五种terracotta实现session复制
原理:就不用多说了吧,拿出一个数据库,专门用来存储session信息。保证session的持久化。 优点:服务器出现问题,session不会丢失 缺点:如果网站的访问量很大,把session存储到数据库中,会对数据库造成很大压力,还需要增加额外的开销维护数据库
12、JDBC 流程[](http://www.cnblogs.com/lazyco...
注意:在此之前应该先把所有用到的对象设为null
(1)向DriverManager类注册驱动数据库驱动程序,
Class.forName( "com.somejdbcvendor.TheirJdbcDriver" );
(2)调用DriverManager.getConnection方法, 通过JDBC URL,用户名,密码取得数据库连接的Connection对象。
Connection conn = DriverManager.getConnection(
"jdbc:somejdbcvendor:other data needed by some jdbc vendor", //URL
"myLogin", // 用户名
"myPassword" ); // 密码
(3)获取Connection后, 便可以通过createStatement创建Statement用以执行SQL语句。下面是一个插入(INSERT)的例子:
Statement stmt = conn.createStatement();
stmt.executeUpdate( "INSERT INTO MyTable( name ) VALUES ( 'my name' ) " );
(4)有时候会得到查询结果,比如select,得到查询结果,查询(SELECT)的结果存放于结果集(ResultSet)中。
ResultSet rs = stmt.executeQuery( "SELECT * FROM MyTable" );
(5)关闭数据库语句,关闭数据库连接。
rs.close();
stmt.close();
13、MVC 设计思想
每当用户在Web浏览器中点击链接或提交表单的时候,请求就开始工作了。请求是一个十分繁忙的家伙,从离开浏览器开始到获取响应返回,它会经历很多站,在每站都会留下一些信息,同时也会带上一些信息。
Spring工作流程描述原文在这里
- 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获;
DispatcherServlet
对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain
对象的形式返回;
DispatcherServlet
根据获得的Handler,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法)
- 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
- HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
- 数据转换:对请求消息进行数据转换。如String转换成Integer、Double等
- 数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等
- 数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
- Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;
- 根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;
- ViewResolver 结合Model和View,来渲染视图
- 将渲染结果返回给客户端。
Spring工作流程描述
- 为什么Spring只使用一个Servlet(DispatcherServlet)来处理所有请求?
- 详细见J2EE设计模式-前端控制模式
- Spring为什么要结合使用
HandlerMapping
以及HandlerAdapter
来处理Handler? - 符合面向对象中的单一职责原则,代码架构清晰,便于维护,最重要的是代码可复用性高。如
HandlerAdapter
可能会被用于处理多种Handler。
1、请求旅程的第一站是Spring的DispatcherServlet
。与大多数基于Java的Web框架一样,Spring MVC所有的请求都会通过一个前端控制器(front contrller)Servlet.前端控制器是常用Web应用程序模式。在这里一个单实例的Servlet将请求委托给应用的其他组件来执行实际的处理。在Spring MVC中,DisPatcherServlet就是前端控制器。
2、DisPactcher的任务是将请求发送Spring MVC控制器(controller).控制器是一个用于处理请求的Spring组件。在典型的应用中可能会有多个控制器,DispatcherServlet
需要知道应该将请求发送给那个哪个控制器。所以Dispactcher以会查询一个或 多个处理器映射(Handler mapping),来确定请求的下一站在哪里。处理映射器根据请求携带的 URL信息来进行决策。
3、一旦选择了合适的控制器,DispatcherServlet
会将请求发送给选中的控制器。到了控制器,请求会卸下其负载(用户提交的信息)并耐心等待控制器处理这些信息。(实际上,设计良好的控制器 本身只是处理很少,甚至不处理工作,而是将业务逻辑委托给一个或多个服务器对象进行处理)
4、控制器在完成处理逻辑后,通常会产生一些信息。这些 信息需要返回给 用户,并在浏览器上显示。这些信息被称为模型(Model),不过仅仅给用户返回原始的信息是不够的----这些信息需要以用户友好的方式进行格式化,一般会是HTML。所以,信息需要发送一个视图(View),通常会是JSP。
5、 控制器做的最后一件事就是将模型打包,并且表示出用于渲染输出的视图名。它接下来会将请求连同模型和视图发送回DispatcherServlet。
6、这样,控制器就不会与特定的视图相耦合*传递给控制器的视图名并不直接表示某个特定的jsp。实际上,它甚至并不能确定视图就是JSP。相反,它仅仅传递了一个逻辑名称,这个名字将会用来查找产生结果的真正视图。DispatcherServlet将会使用视图解析器(View resolver),来将逻辑视图名称匹配为一个特定的视图实现,他可能也可能不是JSP
7、虽然DispatcherServlet已经知道了哪个驶入渲染结果、那请求的任务基本上也就完成了,它的最后一站是试图的实现。在这里它交付给模型数据。请求的任务就结束了。视图将使用模型数据渲染输出。这个输出通过响应对象传递给客户端(不会像听上去那样硬编码)
可以看到,请求要经过很多步骤,最终才能形成返回给客户端的响应,大多数的 步骤都是在Spirng框架内部完成的。
14、equals 与 == 的区别参考
-
- 1、使用==比较原生类型如:boolean、int、char等等,使用equals()比较对象。
- 2、==返回true如果两个引用指向相同的对象,equals()的返回结果依赖于具体业务实现
- 3、字符串的对比使用equals()代替==操作符
其主要的不同是一个是操作符一个是方法,==用于对比原生类型而equals()方法比较对象的相等性。
==是判断两个变量或实例是不是指向同一个内存空间 equals是判断两个变量或实例所指向的内存空间的值是不是相同。
15、Switch能否用String做参数?
-在java7之前,switch只能支持byte,short,char,int或其对应的封装类以及Enum类型,在java7中string支持被加上了。long不被支持。
16、Object有哪些公用方法
-equals、clone、getClass、notify、notifyall、wait
17.hashcode的作用,与equal有什么区别。
--同样用于鉴定2个对象是否相等,java集合中有list和set两类,其中set不允许元素重复实现,那个这个不允许重复实现的方法,如果用equals去比较的话,如果存在1000个元素,你new一个新的元素出来,需要用1000次equal去逐个和他们比较是否是同一个对象,这样会大大降低效率。hashcode实际上是返回对象的内存储地址,如果这个位置上没有元素,就把元素直接存储在上面,如果这个位置上已经存在元素,这个时候才去调用equals方法与新元素进行比较。
18.String、StringBuffer、StringBuilder的区别
--string是final修饰的所以不可变,stringBuffer线程安全,stringbuilder线程不安全。
19.override和overload的含义区别
--override方法的重写,发生在子类继承父类时,要求方法名相同,参数列表相同,返回值类型相同
--overload方法的重载,发生在同一个类中,要求方法名相同,参数列表不同,与返回值无关。
20.抽象类和接口的区别
--一个类只能继承单个类,但是可以实现多个接口
抽象类中的方法并不一定是要抽象的,而接口的所有方法必须是抽象的不能有方法体(java8中接口中也可以有方法体,由于接口是不能实例化的所以要声明的方法必须是default,static,接口的实现类可以调用接口中的default修饰的方法)
21.解析xml的几种方式的原理特点
dom解析,消耗内存
sax解析,效率高
22.wait 和sleep的区别
wait来自object类,sleep 来自Thread类
wait()会释放对象锁,并需要通过notify,notifyAll来唤醒才能重新抢占cpu资源
sleep()不会释放对象锁,时间到继续抢占cpu资源
23.java中堆栈的区别,说下java的内存机制
基本数据类型变量和对象的引用都是在栈中分配
堆内存用来存放new创建的对象和数组
类变量(static修饰的变量),程序在一加载的时候就在堆中为类变量分配内存,堆中的内存地址存放在栈中
实例变量:当你使用java关键字new的时候,系统在堆中开辟并不一定是连续的空间分配给变量,是根据零散的堆内存地址,通过哈希算法换算为一长串数字以表征这个变量在堆中的“物理位置”,实例变量的生命周期-当实例变量的引用丢失后,将gc(垃圾回收器)列入可回收“名单”中,但并不是马上就释放堆中内存
局部变量:由声明在某方法,或某代码段(比如for循环),执行到它的时候在栈中开辟内存,当局部变量一旦脱离作用域,内存立即释放
24.java多态的事项原理
抽象的讲,多态的意思是统一消息可以根据发送对象的不同采用多种不同的行为方式。(发送消息就是函数调用)
java是动态的语言,动态绑定程序调用方法在运行期才动态绑定,jvm通过参数的自动转型来找到合适的方法。
25.单利模式
单利模式的8中写法,以及比较
//推荐写法,双重检查
public class Singleton { private static volatile Singleton singleton; private Singleton() {} public static Singleton getInstance() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } }
26.java常见的设计模式以及应用(参考)
https://blog.csdn.net/xiaokang123456kao/article/details/76268527
27.jvm内存结构
其中,方法区和堆所有线程共享。
深入理解JVM的内存结构及GC机制:https://blog.csdn.net/anjoyandroid/article/details/78609971
Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结:http://outofmemory.cn/c/java-outOfMemoryError
Java OutOfMemory异常清单 :https://blog.csdn.net/hzy38324/article/details/76719105?utm_source=gold_browser_extension
https://www.cnblogs.com/java1024/p/7685400.html
https://blog.csdn.net/litongwei7601/article/details/80132662
https://www.cnblogs.com/jacksonxiao/p/8185569.html