补漏知识点
前言:补充了数据结构和算法、设计模式、spring MVC等内容并对很多知识点进行了深入的剖析,例如hashCode方法的设计、垃圾收集、并发编程、数据库事务等。
1 |
数据类型:Java中的基本数据类型只有8个:byte(8)、short(16)、int(32)、long(64)、float(32)、double(64)、 char(16,2字节,可放一个中文汉字)、boolean(64);除了基本类型(primitive type)和枚举类型 (enumeration type),剩下的都是引用类型(reference type)。 注:eg1: float f=3.4,错误。双精度转单精度,下转型,需强转。float f =(float)3.4; 或者写成float f =3.4F; eg2: short s1 = 1; s1 = s1 + 1。错误,理由同上。short s1 = 1; s1 += 1。正确,因为s1+= 1; 相当于s1 = (short)(s1 + 1),其中有隐含的强制类型转换。 eg3: long w=12345678901。错误。超出了int类型的取值范围。
eg4: Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150; System.out.println(f1 == f2); System.out.println(f3 == f4); 注意上面的变量都是Integer引用,查阅Integer的内部类IntegerCache可知,如果整型字面量的值在-128 到127之间,那么不会new新的Integer对象,而是直接引用常量池中的Integer对象,所以上面的面试题中 f1==f2的结果是true,而f3==f4的结果是false。 |
2 |
goto和const都是保留字 |
3 |
Math.round(11.5)的返回值是12,Math.round(-11.5)的返回值是-11。四舍五入的原理是在参数上加0.5然后 进行下取整。 |
4 |
用最有效率的方法计算2乘以8:2 << 3(左移3位相当于乘以2的3次方,右移3位相当于除以2的3次方) |
5 |
(x.equals(y) == true),但却可有不同的hash code? 错误。如果两个对象相同,hashcode值一定要相同。 |
6 |
String 类是final类,不可以被继承。所有的包装类都是final修饰的类,都不能被继承。 |
7 |
Java中非静态内部类对象的创建要依赖其外部类对象(this.new 内部类 ; new 外部类.new 内部类). |
8 |
Java 中会存在内存泄漏吗? 理论上Java因为有垃圾回收机制(GC)不会存在内存泄露问题。开发中,可能会存在无用但可达的对象,这些 对象不能被GC回收,因此也会导致内存泄露的发生。例如hibernate的Session(一级缓存)中的对象属于持久 态,垃圾回收器是不会回收这些对象的,然而这些对象中可能存在无用的垃圾对象,如果不及时关闭(close) 或清空(flush)一级缓存就可能导致内存泄露。 |
9 |
EJB:包括Session Bean、Entity Bean、Message Driven Bean,基于JNDI、RMI(远程方法调用,详解:http://blog.csdn.net/a19881029/article/details/946566)、JAT(Java基础框架)等技术实现。 SessionBean和EntityBean的区别:对于客户机,SessionBean是一种非持久性对象,它实现某些在服务器上 运行的业务逻辑,可细分为Stateful Session Bean 与 Stateless Session Bean ; EntityBean是一种持久性对象, 它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体。 StatefulBean和StatelessBean的区别:Stateful Session Bean 可以记录呼叫者的状态,每个使用者对应一个 实体,消耗 J2EE Server 较多的内存,可以维持使用者的状态;Stateless Session Bean不负责记录使用者状 态,可能数个使用者对应一个 Bean 的 Instance 在执行。 EJB与JAVA BEAN的区别:Java Bean 是可复用的组件,被容器所创建,Java Bean应具有一个无参的 构造器,还要实现Serializable接口用于实现Bean的持久性,不能被跨进程访问的;Enterprise Java Bean相当 于分布式组件。基于Java的远程方法调用(RMI)技术的,EJB容器是EJB组件的代理, EJB组件由容器所 创建和管理。客户通过容器来访问真正的EJB组件。
|
10 |
HashMap和Hashtable的区别:两者皆采用哈希算法。HashMap允许空键值,非线程安全。HashMap把 Hashtable的contains方法去掉了,改成containsvalue和containsKey;Hashtable不允许空键值,线程安全。 |
11 |
sleep() 和 wait() 有什么区别:sleep()是Thread的方法,导致线程暂停执行指定时间,给执行机会给其他线程, 监控状态依然保持。调用sleep不会释放对象锁。 wait()是Object的方法,线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法 (或notifyAll)后本线程才进入对象锁定池,准备获得对象锁进入运行状态。 |
12 |
Heap [堆]和stack [栈]有什么区别:堆是栈的一个组成元素。栈是一种线形集合,其添加和删除元素的操作应 在同一段完成。栈按照后进先出的方式进行处理。 |
13. |
forward 和redirect的区别:forward是服务器请求资源,服务器直接访问目标地址的URL。浏览器不知道发送 内容从哪来,地址栏不变 ; redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址。地址栏改变。
|
14 |
JSP中动态INCLUDE与静态INCLUDE的区别:动态INCLUDE用jsp:include动作实现 它总是会检查所含文件中 的变化,适合用于包含动态页面,并且可以带参数; 静态INCLUDE用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面 |
15 |
什么时候用assert (断言):常用的调试方式。对程序的一条语句进行检查,保证其为true。若为false,说明程序 处于不正确状态,系统将给出警告或退出。assertion检查通常在开发和测试时开启。为了提高性能, 在软件 发布后,assertion检查通常是关闭的。 |
16 |
GC是什么? 为什么要有GC? GC可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言 没有提供释放已分配内存的显示操作方法。对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收。 调用下面的方法之一:System.gc() 或Runtime.getRuntime().gc() ,但JVM可以屏蔽掉显示的垃圾回收调用。 |
17 |
数据连接池的工作机制:J2EE 服务器启动时会建立一定数量的连接置于连接池中,需要时直接从连接池获取, 使用结束时归还连接池而不必关闭连接,从而避免频繁创建和释放连接所造成的开销。浪费了空间存储连接, 但节省了创建和释放连接的时间 为什么需要连接池: 由于创建连接和释放连接都有很大的开销(尤其是数据库服务器不在本地时,每次建立 连接都需要进行TCP的三次握手,释放连接需要进行TCP四次握手,造成的开销是不可忽视的) |
18 |
SpringMVC执行原理: 1.用户向前端控制器(DispatherServlet)发起请求 2.前端控制器(DispatherServlet)解析URL,请求处理映射器(HandlerMapping)。 3.处理映射器(HandlerMapping)返回Handler配置的所有相关对象。 4.前端控制器(DispatherServlet)根据获得的Handler,选择一个合适的HandlerAdapter。 (附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法)。 5.开始执行Handler(Controller),业务逻辑处理。 6.Handler处理完业务逻辑,返回ModelAndView对象给前端控制器(DispatherServlet)。 7.视图解析器(ViewResolver)返回真正的视图对象(View),前端控制器根据模型数据和视图对象,进行 视图渲染。 8.最后将渲染的试图以(html/json/xml)的形式响应用户。 |
19 |
Struts2执行原理: 1.客户端初始化一个指向Servlet容器的请求(HttpServletRequest请求) 2.请求经过一系列过滤器(最先执行ActionContextCleanUp、最后执行FilterDispatcher) 3.FilterDispatcher询问ActionMapper是否需要调用某个Action来处理这个(HttpServlet Request)请求,如果 ActionMapper决定需要调用某个Action,FilterDispatcher则把请求的处理交给ActionProxy。 4.ActionProxy通过Configuration Manager(struts.xml)询问框架的配置文件,找到需要调用的Action类。 5.ActionProxy创建一个ActionInvocation实例。ActionInvocation会根据配置加载相关的拦截器(Interceptor),并 通过代理模式调用Action。 6.Action执行完毕后,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果result。 |
20 |
日期和时间: 1.获得年月日、小时分钟秒
|