您当前的位置: 首页 >  面试

蓝不蓝编程

暂无认证

  • 4浏览

    0关注

    706博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

阿里巴巴面试题

蓝不蓝编程 发布时间:2014-04-27 22:32:01 ,浏览量:4



http://wenku.baidu.com/link?url=5hXV00kBdgImX-MidUHrTMzOxw2Jo_tTlE-pHkc-JaoilYCsM_iVpPKgXvrdQBt65xD1LrDMX_xJa53YJe_jb63K5iEYUDbCxG6TaC_UR2K

 你对Java的集合框架了解吗? 能否说说常用的类?

 

 说说Hashtable与HashMap的区别: 源代码级别的区别呢? 

 

 平时用过的List有哪些? (除了ArrayList和LinkedList),ArrayList和LinkedList的区别?

 

 ArrayList的特点,内部容器是如何扩充的?

 

 Properties类的特点? 线程安全?  

 

平时使用过的框架有哪些? (我提到了Struts2) 

 

 请说一下Struts2的初始化?和类的创建?(从源代码角度出发) 

 

 据你了解,除了反射还有什么方式可以动态的创建对象?(我提到了CGLIB…… 我以为他会接着问CGLIB,揪心中……,结果他没问) 

 

 请说一下Struts2 是如何把Action交给Spring托管的?它是单例的还是多例? 你们页面的表单对象是多例还是单例? 

 

 请说一下你们业务层对象是单例还是多例的? 

 

 请说一下Struts2源代码中有哪些设计模式?

 

 请说一下,你觉得你最熟悉的技术特点? (我提到了并发编程) 

 

 请说一下线程安全出现的原因?  

 

 请说一下线程池的中断策略(4个)? 各有什么特点? 

 

 请说一下Tomcat配置不同应用的不同端口如何配置? 如何配置数据源? 如何实现动态部署? 

 

 请说一下Java常用的优化? 

 

 

 你了解最新的Servlet规范吗? 简单说一下?(我提到了推) 

 

 那请你说一下“推”是如何实现的? 

 

 线程安全下,StringBuffer与StringBuilder的区别? 它们是如何扩充内部数组容量的? (源代码) 

 

 请说一下Tomcat中的设计模式?(我提到观察者模式) 

 

 是否可以说说Java反射的相关优化机制? (我说我不太清楚…… 他说没关系 - -!) 

 

 请说一些Mysql的常用优化策略? 

 

 因为我之前有提到过“推”,他可能对我的知识面比较感兴趣,要我说说平时都看些什么书,还了解一些什么其他的技术范畴。

 

 (他首先提到SOA,我说有了解,并且是未来的趋势,还有提到云计算,我说有过一定了解,但是并未深究)

 

 之后是几个职业方面的问题? 

 

 你觉得你的潜力? 你在团队中的位置? 你觉得跟团队中最好的还有哪些差距?你要花多少时间赶上他们? 

 

 你对阿里巴巴还有什么疑问吗? (我很囧的问了,“阿里巴巴的牛人平时都跟你们有互动吗?-----本意是指培训,但是话没说清楚……”,囧了……)

 

PS,下面是时候对问题的整理,里面纯粹仅限于个人浅见,如果有错误,还希望各位能指点一二。

 

?你对Java的集合框架了解吗? 能否说说常用的类? 

Java集合框架类图:

 

我常用的类:

HashMap,Hashtable,HashSet,ArrayList,Vector,LinkedList,Collections,Arrays;

 

?说说Hashtable与HashMap的区别(源代码级别)

 

       1.最明显的区别在于Hashtable 是同步的(每个方法都是synchronized),而HashMap则不是.

 

       2.HashMap继承至AbstractMap,Hashtable继承至Dictionary ,前者为Map的骨干, 其内部已经实现了Map所需           要做的大部分工作, 它的子类只需要实现它的少量方法即可具有Map的多项特性。而后者内部都为抽象方法,需要           它的实现类一一作自己的实现,且该类已过时

 

        3.两者检测是否含有key时,hash算法不一致,HashMap内部需要将key的hash码重新计算一边再检测,Hashtable则直接利用key本身的hash码来做验证。

HashMap:

 

Java代码 

1.int hash = (key == null) ? 0 : hash(key.hashCode());   

2.-----   

3.static int hash(int h) {   

4.        h ^= (h >>> 20) ^ (h >>> 12);   

5.        return h ^ (h >>> 7) ^ (h >>> 4);   

6.    }  

int hash = (key == null) ? 0 : hash(key.hashCode());

-----

static int hash(int h) {

        h ^= (h >>> 20) ^ (h >>> 12);

        return h ^ (h >>> 7) ^ (h >>> 4);

    } 

 

  Hashtable:

Java代码 

1.int hash = key.hashCode();  

int hash = key.hashCode(); 

 

  4.两者初始化容量大小不一致,HashMap内部为 16*0.75 , Hashtable 为 11*0.75 

 

HashMap: 

 

Java代码 

1.static final int DEFAULT_INITIAL_CAPACITY = 16;   

2.static final float DEFAULT_LOAD_FACTOR = 0.75f;   

3.public HashMap() {   

4.     this.loadFactor = DEFAULT_LOAD_FACTOR;   

5.     threshold=(int)(DEFAULT_INITIAL_CAPACITY*DEFAULT_LOAD_FACTOR);   

6.     table = new Entry[DEFAULT_INITIAL_CAPACITY];   

7.     init();   

8.}      

9.………………………………  

static final int DEFAULT_INITIAL_CAPACITY = 16;

static final float DEFAULT_LOAD_FACTOR = 0.75f;

public HashMap() {

     this.loadFactor = DEFAULT_LOAD_FACTOR;

     threshold=(int)(DEFAULT_INITIAL_CAPACITY*DEFAULT_LOAD_FACTOR);

     table = new Entry[DEFAULT_INITIAL_CAPACITY];

     init();

}

……………………………… 

 

 Hashtable:

 

Java代码 

1.public Hashtable() {   

2.    this(11, 0.75f);   

3.}   

4.-----   

5. public Hashtable(int initialCapacity, float loadFactor) {   

6.        ..........   

7.    this.loadFactor = loadFactor;   

8.    table = new Entry[initialCapacity];   

9.    threshold = (int)(initialCapacity * loadFactor);   

10.    }     

public Hashtable() {

this(11, 0.75f);

}

-----

 public Hashtable(int initialCapacity, float loadFactor) {

    ..........

this.loadFactor = loadFactor;

table = new Entry[initialCapacity];

threshold = (int)(initialCapacity * loadFactor);

    }  

 

   其实后续的区别应该还有很多, 这里先列出4点。

 

 

 

?平时除了ArrayList和LinkedList外,还用过的List有哪些?

ArrayList和LinkedList的区别?

 

 

事实上,我用过的List主要就是这2个, 另外用过Vector.

 

ArrayList和LinkedList的区别: 

 

1. 毫无疑问,第一点就是两者的内部数据结构不同, ArrayList内部元素容器是一个Object的数组, 

而LinkedList内部实际上一个链表的数据结构,其有一个内部类来表示链表.

 

Java代码 

1.(ArrayList)   

2.private transient Object[] elementData;    

3.  

4.………………………………………………………………………………   

5.  

6.(LinkedList)   

7.private transient Entry header = new Entry(null, null, null);/链表头    

8.  

9.//内部链表类.   

10.private static class Entry {   

11.    E element; //数据元素   

12.    Entry next; // 前驱   

13.    Entry previous;//后驱   

14.    Entry(E element, Entry next, Entry previous) {   

15.        this.element = element;   

16.        this.next = next;   

17.        this.previous = previous;   

18.    }   

19.}     

(ArrayList)

private transient Object[] elementData;

 

………………………………………………………………………………

 

(LinkedList)

private transient Entry header = new Entry(null, null, null);/链表头 

 

//内部链表类.

private static class Entry {

E element; //数据元素

Entry next; // 前驱

Entry previous;//后驱

Entry(E element, Entry next, Entry previous) {

    this.element = element;

    this.next = next;

    this.previous = previous;

}

}  

2.两者的父类不同,也就决定了两者的存储形式不同。 ArrayList继承于 AbstractList,而LinkedList继承于AbstractSequentialList. 两者都实现了List的骨干结构,只是前者的访问形式趋向于 “随机访问”数据存储(如数组),后者趋向于 “连续访问”数据存储(如链接列表)

 

 

Java代码 

1.public class ArrayList extends AbstractList      

2.---------------------------------------------------------------------------------------   

3.public class LinkedList extends AbstractSequentialList      

public class ArrayList extends AbstractList

---------------------------------------------------------------------------------------

public class LinkedList extends AbstractSequentialList  

3.再有就是两者的效率问题, ArrayList基于数组实现,所以毫无疑问可以直接用下标来索引,其索引数据快,插入元素设计到数组元素移动,或者数组扩充,所以插入元素要慢。LinkedList基于链表结构,插入元素只需要改变插入元素的前后项的指向即可,故插入数据要快,而索引元素需要向前向后遍历,所以索引元素要慢。

?ArrayList的特点,内部容器是如何扩充的?

上一点谈到了ArrayList的特点,这里略,重点来看其内部容器的扩充:

Java代码 

1.public void ensureCapacity(int minCapacity) {   

2.        modCount++;   

3.        int oldCapacity = elementData.length;   

4.        if (minCapacity > oldCapacity) {   

5.            Object oldData[] = elementData;   

6.             //这里扩充的大小为原大小的大概 60%   

7.            int newCapacity = (oldCapacity * 3) / 2 + 1;   

8.            if (newCapacity  oldCapacity) {

Object oldData[] = elementData;

             //这里扩充的大小为原大小的大概 60%

int newCapacity = (oldCapacity * 3) / 2 + 1;

if (newCapacity = 0) {   

16.            c = 0;   

17.            keyLen = 0;   

18.            valueStart = limit;   

19.            hasSep = false;   

20.            precedingBackslash = false;   

21.            // 下面用2个循环来处理key,value   

22.            while (keyLen 

关注
打赏
1639405877
查看更多评论
立即登录/注册

微信扫码登录

0.0923s