文章目录

1.什么是 java 序列化, 如何实现 java 序列化?或者请解释 Serializable 接口 接口的作用?
答:我们有时候将一个java 对象变成字节流的形式传出去或者从一个字节流中恢复成一个java 对象,例如,要将java 对象存储到硬盘或者传送给网络上的其他计算机,这个过程我们可以自己写代码去把一个java 对象变成某个格式的字节流再传输,但是,jre 本身就提供了这种支持,我们可以调用OutputStream的writeObject方法来做,如果要让java帮我们做,要被传输的对象必须实现serializable 接口,这样,javac 编译时就会进行特殊处理,编译的类才可以被writeObject方法操作,这就是所谓的序列化。需要被序列化的类必须实现Serializable 接口,该接口是一个mini 接口,其中没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的。
例如,在web 开发中,如果对象被保存在了Session 中,tomcat 在重启时要把Session对象序列化到硬盘,这个对象就必须实现Serializable接口。如果对象要经过分布式系统进行网络传输或通过rmi 等远程调用,这就需要在网络上传输对象,被传输的对象就必须实现Serializable接口。

2.MVC的各个部分都有那些技术来实现? 如何实现?
MVC是Model-View-Controller的简写。Model 代表的是应用的业务逻辑(通过JavaBean,EJB组件实现), View 是应用的表示面(由JSP页面产生),Controller 是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用

3.开发中主要使用 Spring 的什么技术 ?
IOC AOP

4.对Spring的理解,项目中都用什么?怎么用的?对IOC、和AOP的理解及实现原理?
Spring是一个开源框架,处于MVC模式中的控制层,它能应对需求快速的变化,其主要原因它有一种面向切面编程(AOP)的优势,其次它提升了系统性 能,因为通过依赖倒置机制(IOC),系统中用到的对象不是在系统加载时就全部实例化,而是在调用到这个类时才会实例化该类的对象,从而提升了系统性能。这两个优秀 的性能 使得Spring受到许多J2EE公司的青睐,如阿里里中使用最多的也是Spring相关技术。Spring的优点:
1、降低了组件之间的耦合性,实现了软件各层之间的解耦。
2、可以使用容易提供的众多服务,如事务管理,消息服务,日志记录等。
3、容器提供了AOP技术,利用它很容易实现如权限拦截、运行期监控等功能。Spring中AOP技术是设计模式中的动态代理模式。只需实现jdk提供的 动态代理接口InvocationHandler,所有被代理对象的方法都由InvocationHandler接管实际的处理任务。面向切面编程中还要 理解切入点、切面、通知、织入等概念。
Spring中IOC则利用了Java强大的反射机制来实现。所谓依赖注入即组件之间的依赖关系由容器在运行期决定。其中依赖注入的方法有两种,通过构造函数注入,通过set方法进行注入。

5.hashmap底层如何实现的?
底层是将你加入其中的对象进行HASH排列后在放的时候,将key和对应的value发在一起,可以随时用key找到value,所以其中如果你让如相同的key但value不同时,后者value会替换前者。详见http://liaokang-java.iteye.com/blog/1098404

6.arrayList底层如何扩展的?

public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}//arraylist的java底层实现

arraylist的add方法底层实际就是一个数组如果这个数组满了就将创建新数组比旧数组大的然后复制旧数组到新数组去

7.谈谈Hibernate的理解,一级和二级缓存的作用,在项目中Hibernate都是怎么使用缓存的?
Hibernate是一个开发的对象关系映射框架(ORM)。它对JDBC进行了非常对象封装,Hibernate允许程序员采用面向对象的方式来操作关系数据库。Hibernate的优点:
1、程序更加面向对象
2、提高了生产率
3、方便移植
4、无入侵性。
缺点:
1、效率比JDBC略差
2、不适合批量操作
3、只能配置一种关联关系
Hibernate有四种查询方式:
1、get、load方法,根据id号查询对象。
2、Hibernate query language
3、标准查询语言
4、通过sql查询
Hibernage工作原理:
1、配置hibernate对象关系映射文件、启动服务器
2、服务器通过实例化Configuration对象,读取hibernate.cfg.xml文件的配置内容,并根据相关的需求建好表以及表之间的映射关系。
3、通过实例化的Configuration对象建立SeesionFactory实例,通过SessionFactory实例创建Session对象。
4、通过Seesion对象完成数据库的增删改查操作。
Hibernate中的状态转移
临时状态(transient)
1、不处于session缓存中
2、数据库中没有对象记录
java是如何进入临时状态的:1、通过new语句创建一个对象时。2、刚调用session的delete方法时,从seesion缓存中删除一个对象时。
持久化状态(persisted)
1、处于session缓存中
2、持久化对象数据库中没有对象记录
3、seesion在特定的时刻会保存两者同步
java如何进入持久化状态:1、seesion的save()方法。2、seesion的load().get()方法返回的对象。3、seesion的find()方法返回的list集合中存放的对象。4、Session的update().save()方法。
流离状态(detached)
1、不再位于session缓存中
2、游离对象由持久化状态转变而来,数据库中还没有相应记录。
java如何进入流离状态:1、Session的close()。Session的evict()方法,从缓存中删除一个对象。
具体如下图所示:



Hibernate中的缓存主要有Session缓存(一级缓存)和SessionFactory缓存(二级缓存,一般由第三方提供)。

8.谈谈你在项目中的角色?
9.你做过的项目模块实现?
10.线程同步,并发操作怎么控制?
见:http://www.cnblogs.com/yanghuahui/p/3734565.html

11.servlet容器启动过程,生命周期?
Servlet生命周期分为三个阶段:
  1,初始化阶段 :调用init()方法
  2,响应客户请求阶段:调用service()方法
  3,终止阶段:调用destroy()方法
Servlet初始化阶段:
  在下列时刻Servlet容器装载Servlet:
    1,Servlet容器启动时自动装载某些Servlet,实现它只需要在web.XML文件中的之间添加如下代码:

1
    2,在Servlet容器启动后,客户首次向Servlet发送请求
    3,Servlet类文件被更新后,重新装载Servlet
  Servlet被装载后,Servlet容器创建一个Servlet实例并且调用Servlet的init()方法进行初始化。在Servlet的整个生命周期内,init()方法只被调用一次。
    
Servlet工作原理:
   首先简单解释一下Servlet接收和响应客户请求的过程,首先客户发送一个请求,Servlet是调用service()方法对请求进行响应的,通过 源代码可见,service()方法中对请求的方式进行了匹配,选择调用doGet,doPost等这些方法,然后再进入对应的方法中调用逻辑层的方法, 实现对客户的响应。在Servlet接口和GenericServlet中是没有doGet,doPost等等这些方法的,HttpServlet中定义 了这些方法,但是都是返回error信息,所以,我们每次定义一个Servlet的时候,都必须实现doGet或doPost等这些方法。
  每 一个自定义的Servlet都必须实现Servlet的接口,Servlet接口中定义了五个方法,其中比较重要的三个方法涉及到Servlet的生命周 期,分别是上文提到的init(),service(),destroy()方法。GenericServlet是一个通用的,不特定于任何协议的 Servlet,它实现了Servlet接口。而HttpServlet继承于GenericServlet,因此HttpServlet也实现了 Servlet接口。所以我们定义Servlet的时候只需要继承HttpServlet即可。
  Servlet接口和 GenericServlet是不特定于任何协议的,而HttpServlet是特定于HTTP协议的类,所以HttpServlet中实现了 service()方法,并将请求ServletRequest,ServletResponse强转为HttpRequest和 HttpResponse。

public void service(ServletRequest req,ServletResponse res)

throws ServletException,IOException
{


HttpRequest request;
HttpResponse response;
try

{

req = (HttpRequest)request;

res = (HttpResponse)response;

}
catch(ClassCastException e)

{

throw new ServletException("non-HTTP request response");

}

service(request,response);
}

代码的最后调用了HTTPServlet自己的service(request,response)方法,然后根据请求去调用对应的doXXX方法,因为HttpServlet中的doXXX方法都是返回错误

protected void doGet(HttpServletRequest res, HttpServletResponse resp)
throws ServletException, IOException
{


String protocol = req.getProtocol();

if(protocol.equals("1.1"))

{

resp.sendError(HttpServletResponse.SC.METHOD.NOT.ALLOWED, msg);

}

esle

{

resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);
}
}

12.SQL关联关系?
如果是 父子关系, 或者 一对多 关系
可以通过 创建外键的方式, 在 父表 与 子表之间, 创建一个关联关系。

13.list去重?
方法一: 通过Iterator 的remove方法
方法二:直接将结果赋值给另一个List
代码见http://lhkzyz.iteye.com/blog/1682641

14.arraylist和hashmap在内存中开销?
ArrayList 有序集合 底层为数组 按下标查找快 增删慢 按元素查找、增删都慢
HashMap 无序哈希表 底层哈希表 按下标查找一般比LinkedList快 增删快跟主体大小有关 按元素查找快 增删快跟主体大小有关,越大越慢
HashMap是适用小数据量的快速查找、增删操作,大数量之后,由于插入和查找的内存消耗和冲突排除都会大大提高,所以大数量都不敢用hashMap

15.sql行转列?
http://my.oschina.net/boltwu/blog/508565

文章目录