1.什么是序列化以及用途,什么时候使用序列化?

序列化是指把对象转换为字节序列的过程称为对象的序列化;而反序列化是指把字节序列恢复为对象的过程称为对象的反序列化。

对象的序列化主要有两种用途:

1)把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;

2)在网络上传送对象的字节序列。

什么时候使用序列化:

1)对象序列化可以实现分布式对象。主要应用例如:RMI要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样。

2)java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序列化可以进行对象的"深复制",即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列。


2.编程题: 写一个Singleton单例模式

Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在,一般Singleton模式通常有几种种形式:

第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的该类变量,

在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。

/**
 * 素文宅 www.yoodb.com
 */
public class Singleton {
private Singleton(){}
   //在自己内部定义自己一个实例,是不是很奇怪?
   //注意这是private 只供内部调用
   private static Singleton instance = new Singleton();
   //这里提供了一个供外部访问本class的静态方法,可以直接访问  
  public static Singleton getInstance() {
     return instance;   
  } 
}

第二种形式: 

/**
 * 素文宅 www.yoodb.com
 */
public class Singleton { 
  private static Singleton instance = null;
  public static synchronized Singleton getInstance() {
  //这个方法比上面有所改进,不用每次都进行生成对象,只是第一次
  //使用时生成实例,提高了效率!
  if (instance==null)
    instance=new Singleton();
return instance;
  } 
}

其他形式:

定义一个类,它的构造函数为private的,所有方法为static的,一般认为第一种形式要更加安全些。


3.用简洁的话描述一下关于Spring的IOC与AOP

IoC就是对象的创建,依赖都由Spring及配置文件控制;而AOP就是统一的给一些类似的方法加上同样的功能,比如日志,事务。

IOC:控制反转,是一种设计模式。一层含义是控制权的转移:由传统的在程序中控制依赖转移到由容器来控制;

第二层是依赖注入:将相互依赖的对象分离,在spring配置文件中描述他们的依赖关系。他们的依赖关系只在使用的时候才建立。

AOP:面向切面,是一种编程思想,OOP的延续。将系统中非核心的业务提取出来,进行单独处理。比如事务、日志和安全等。


4.cookie和session的的区别有哪些?

COOKIE数据存放在客户的浏览器上,而session数据放在服务器上;COOKIE分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的COOKIE

COOKIE不是很安全,可以分析存放在本地的COOKIE并进行COOKIE欺骗,出于安全考虑应当使用session;

session会在一定时间内保存在服务器上,当访问增多时会比较影响服务器的性能,出于考虑减轻服务器性能方面,应当使用COOKIE;

单个COOKIE保存的数据不能超过4K,大多说浏览器都限制了一个站点最多保存20个COOKIE

个人观点认为将一些登录信息(重要信息)存放在session中,而其他信息如果需要保留,可以放在COOKIE中


5.乐观锁和悲观锁的区别

悲观锁(Pessimistic Lock), 锁如其名,字面上理解就是很悲观的意思,每次获取数据时都会认为可能造成数据变动,所以每次获取数据都会上锁,这样别人想获取时就会block直到它拿到锁。传统的关系型数据库中就使用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。

乐观锁(Optimistic Lock), 顾名思义,字面上理解就是很乐观的意思,每次获取数据的时候都认为不可能造成数据变动,因此不会上锁,但是在更新的时候会判断一下,其他人有没有去更新这个数据,可以采用版本号等类似的机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实就是提供的乐观锁。

悲观锁会造成访问数据库时间较长,并发性不好,尤其是比较长的事务处理;而乐观锁在现实中使用得较多,大多数厂商较多采用乐观锁。


6.Java里面一个字符占几个字节?

java的字符类型char占用2个,Unicode编码

float 4 字节 32位IEEE 754单精度 

double 8 字节 64位IEEE 754双精度 

byte 1字节 -128到127 

short 2 字节 -32,768到32,767 

int 4 字节 -2,147,483,648到2,147,483,647 

long 8 字节 -9,223,372,036,854,775,808到9,223,372,036, 854,775,807 

char 2 字节 整个Unicode字符集 

boolean 1 位 True或者false

下面列举在GCC编译器下32位机器和64位机器各个类型变量所占字节数:

 C类型           32位              64位
char            1               1
short int      2               2
int            4               4
long int      4               8
long long int         8               8
char*            4               8
float            4               4
double            8               8

需要说明一下的是指针类型存储的是所指向变量的地址,所以32位机器只需要32bit,而64位机器需要 64bit 。


7.Java虚拟机内存的堆区(heap),栈区(stack)和静态区(static/method)

JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method)

堆区:

1)存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)

2)jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身.

3)一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。

栈区:

1)每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中

2)每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。

3)栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。

4)由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.

静态区别名方法区:

1)方法区又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。

2)方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。

3)全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。


8.Java中HashMap和HashTable的区别

HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。

HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。 Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。

最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步(Collections.synchronizedMap)。 

Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。


9.JSP 九大内置对象和作用

request 请求对象 类型 javax.servlet.ServletRequest 作用域 Request

response 响应对象 类型 javax.servlet.SrvletResponse 作用域 Page

pageContext 页面上下文对象 类型 javax.servlet.jsp.PageContext 作用域 Page

session 会话对象 类型 javax.servlet.http.HttpSession 作用域 Session

application 应用程序对象 类型 javax.servlet.ServletContext 作用域 Application

out 输出对象 类型 javax.servlet.jsp.JspWriter 作用域 Page

config 配置对象 类型 javax.servlet.ServletConfig 作用域 Page

page 页面对象 类型 javax.lang.Object 作用域 Page

exception 例外对象 类型 javax.lang.Throwable 作用域 page

1)request 对象代表的是来自客户端的请求,例如我们在FORM表单中填写的信息等,是最常用的对象

常用的方法有:getParameter、getParameterNames 和getParameterValues 通过调用这几个方法来获取请求对象中所包含的参数的值。

2)response 对象代表的是对客户端的响应,也就是说可以通过response 对象来组织发送到客户端的数据。但是由于组织方式比较底层,所以不建议普通读者使用,需要向客户端发送文字时直接使用

3)pageContext 对象直译时可以称作“页面上下文”对象,代表的是当前页面运行的一些属性

常用的方法有 :findAttribute、getAttribute、getAttributesScope 和getAttributeNamesInScope

一般情况下pageContext对象用到得也不是很多,只有在项目所面临的情况比较复杂的情况下,才会利用到页面属性来辅助处理。

4)session    对象代表服务器与客户端所建立的会话,当需要在不同的JSP页面中保留客户信息的情况下使用,比如在线购物、客户轨迹跟踪等。“session” 对象建立在cookie的基础上,所以使用时应注意判断一下客户端是否打开了cookie。常用的方法包括getId、 getValue、 getValueNames和putValue等。

HTTP是无状态(stateless)协议;

Web Server 对每一个客户端请求都没有历史记忆;Session用来保存客户端状态信息;由Web Server 写入;存于客户端;客户端的每次访问都把上次的session记录传递给Web Server;Web Server读取客户端提交的session来获取客户端的状态信息

5)application 对象负责提供应用程序在服务器中运行时的一些全局信息,常用的方法有getMimeType和getRealPath等。

6)out 对象代表了向客户端发送数据的对象,与“response” 对象不同,通过“out” 对象发送的内容将是浏览器需要显示的内容,是文本一级的,可以通过“out” 对象直接向客户端写一个由程序动态生成HTML文件。常用的方法除了pirnt和println之外,还包括clear、clearBuffer、flush、getBufferSize和getRemaining,这是因为“out” 对象内部包含了一个缓冲区,所以需要一些对缓冲区进行操作的方法

7)config 对象提供一些配置信息,常用的方法有getInitParameter和getInitParameterNames,以获得Servlet初始化时的参数。

8)page 对象代表了正在运行的由JSP文件产生的类对象,不建议一般读者使用。

9)exception 对象则代表了JSP文件运行时所产生的例外对象,此对象不能在一般JSP文件中直接使用,而只能在使用了“<%@ page isErrorPage="true "%>”的JSP文件中使用


10.Java中java.util.Comparator接口简单描述一下?

java.util.Comparator是比较器接口,如果我们需要控制某个类的次序并且该类本身不支持排序,那么就可以建立一个类比较器来进行排序,实现方式很简单只需要实现java.util.Comparator接口。

java.util.Comparator接口只包括两个函数,它的源码如下:

package java.util;
public interface Comparator<T> {
    int compare(T o1, T o2);
    boolean equals(Object obj);
}

1) 若一个类要实现java.util.Comparator接口:它一定要实现int compare(T o1, T o2) 函数,而另一个可以不实现boolean equals(Object obj) 函数

2)int compare(T o1, T o2) 是比较o1和o2的大小

如果返回值为负数意味着o1比o2小,否则返回为零意味着o1等于o2,返回为正数意味着o1大于o2

具体源码分析,参考地址:http://blog.yoodb.com/yoodb/article/detail/1183

评论

分享:

支付宝

微信