话不多说,以下是我十月份面试所遇到的坑,其实仔细思考并不是很难,只是自己太脆:
1.请从Java技术的角度或者使用Java程序来实现:西游记中, 小白龙是龙,但是唐僧需要一匹马,请问如何让唐僧相信小白龙是一匹白龙马而不是一条龙。
对于这道题我现在还不是很懂,但应该是要从多态这个方向去着手。如果有幸被您看到的话同时您知道答案,请您不吝赐教。
2.List中存放的是对象,该对象有很多属性。例如:list中存放People这个对象,而people这个对象有身高、年龄等属性,然后写一个方法以年龄对list进行排序,要求输出结果是对象按年龄从小到大进行排列。
具体实现如下,采用的是Collections的sort方法,只不过比较的是对象:
public class SortTest {
public static void main(String[] args) {
List sortList = SortTest.getSortList();
for (int i = 0; i < sortList.size(); i++) {
People p = (People)sortList.get(i);
System.out.println(p.getAge());
}
}
public static List getSortList(){
List<People> list = new ArrayList<People>();
People p = new People();
p.setName("lihua");
p.setAge(26);
People p1 = new People();
p1.setName("lifeng");
p1.setAge(25);
People p2 = new People();
p2.setName("lijf");
p2.setAge(22);
People p3 = new People();
p3.setName("wangz");
p3.setAge(34);
list.add(p);
list.add(p1);
list.add(p2);
list.add(p3);
//按年龄排序
Collections.sort(list,new Comparator<People>() {
@Override
public int compare(People o1, People o2) {
int age1 = o1.getAge();
int age2 = o2.getAge();
if(age1>age2){
return 1;
}else if(age1==age2){
return 0;
}else{
return -1;
}
}
});
return list;
}
}
3.redis的底层是如何实现的?
Redis是一种key/value型数据库,其中,每个key和value都是使用对象表示的。
redis共有五种对象类型,分别是:
类型常量 | 对象的名称 |
---|---|
REDIS_STRING | 字符串对象 |
REDIS_LIST | 列表对象 |
REDIS_HASH | 哈希对象 |
REDIS_SET | 集合对象 |
REDIS_ZSET | 有序集合对象 |
redis底层数据结构共有8种,如下:
编码常量 | 编码所对应的底层数据结构 |
---|---|
REDIS_ENCODING_INT | long 类型的整数 |
REDIS_ENCODING_EMBSTR | embstr 编码的简单动态字符串 |
REDIS_ENCODING_RAW | 简单动态字符串 |
REDIS_ENCODING_HT | 字典 |
REDIS_ENCODING_LINKEDLIST | 双端链表 |
REDIS_ENCODING_ZIPLIST | 压缩列表 |
REDIS_ENCODING_INTSET | 整数集合 |
REDIS_ENCODING_SKIPLIST | 跳跃表和字典 |
Redis的高效性和灵活性正是得益于同一个对象类型采取了不同的底层结构,并在必要时对二者进行转换,以及各种底层结构对内存的合理利用。比如,字符串对象的底层实现可以是int、raw、embstr ;列表对象的底层实现可以是ziplist、linkedlist;哈希对象的底层实现可以是ziplist、hashtable;集合对象的底层实现可以是inset、hashtable;有序集合对象的底层实现可以是ziplist或者是skiplist和dict的结合。
4.说一下你对Java Web 中的MVC模式的理解?
对于MVC具体代表什么就不介绍了,MVC模式的最大的优点就是降低耦合性。它是用一种业务逻辑、数据、界面显示分离显示的方法组织代码,每层只干自己该做的事情,条理清晰,降低代码的耦合性。如图:
5.谈谈你对动态代理的理解以及实现原理?
6.对于数据库索引、数据库执行计划的理解
7.对于hibernate映射关系的理解(一对多,一对一)
8.struts2或者springMVC(怎么避免线程安全)的工作机制
9.synchronize修饰方法(代码块)和修饰类的区别
对于synchronized这个关键字,经过一番了解后,大致可以总结如下:
synchronized可以修饰静态类、非静态类、代码块等。当修饰代码块时,如果传入的对象是this,即当前类对象,那么它和修饰类基本没有什么区别,主要区别就在于锁的范围了。 显然修饰类的范围大,这样就会有synchronized修饰类的性能低于修饰代码块的性能;当传入的不是this这个关键字,那么如果当方法被调用时,其他线程如果想再调用的话,就阻塞了。
如果synchronized修饰静态类,那么它拿到的就是类锁,一个类中的所有对象都共享这一把锁。
10.socket和webService的区别联系
Socket是基于TCP/IP的传输层协议,Socket接口通过流传输,不支持面向对象;适用于传输大数据量的数据;缺点就是:通信的借口协议需要自己定义,接口传输的数据需要手动解析。
Webservice是基于http的Soap协议传输数据,底层基于Socket通信。支持面向对象,适用于没有性能要求情况下且数据传输量小