基础面试题
平凡
大酋长1.什么是序列化以及用途,什么时候使用序列化?
序列化是指把对象转换为字节序列的过程称为对象的序列化;而反序列化是指把字节序列恢复为对象的过程称为对象的反序列化。
对象的序列化主要有两种用途:
1)把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
2)在网络上传送对象的字节序列。
什么时候使用序列化:
1)对象序列化可以实现分布式对象。主要应用例如:RMI要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样。
2)java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序列化可以进行对象的"深复制",即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列。
2.编程题: 写一个Singleton单例模式
Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在,一般Singleton模式通常有几种种形式:
第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的该类变量,
在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。
public class Singleton {
private Singleton(){}
//在自己内部定义自己一个实例,是不是很奇怪?
//注意这是private 只供内部调用
private static Singleton instance = new Singleton();
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance() {
return instance;
}
}
第二种形式:
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。ashMap允许将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算法都大概一样,所以性能不会有很大的差异。
浙公网安备 33010602011771号