阿里巴巴面试题 知识越梳理越顺畅

面试基础javascript

 1.自我介绍。(第一印象超级超级重要)html

1. 介绍我的信息,说明本次应聘岗位。 2. 项目经验,实习经验。 3. 我的特色,爱好。 4. 对贵公司的价值观承认。 5. 谢谢。

2. 面试圣经java

人品第一, 技术第二! 细节处体现人品,面试态度必定要和蔼。把不懂的知识点往你懂的知识点处引导。始终有答案,不要被问住。

3. 你在项目中遇到的一个困难,你是怎么解决的?(解决问题的逻辑过程 思路 总结性的结论)linux

  技术方面的,仍是团队配合方面的。最好结合本身的工做经验,先把困难和问题描述清楚,而后介绍,你如何去查找问题的缘由,任何问题,只要缘由查到了,基本就已经接近了百分之八十了。(本身能搞定的,就本身上网找资料;但若是好比在2个小时以内尚未头绪,就考虑问公司技术水平比较高的同事之类的,而后还要及时和项目经理沟通)。这个问题若是回答的好,能够把项目中的知识点导向你擅长的知识点处。c++

4. 你是如何与项目团队之间进行沟通和合做的?程序员

Java基础篇(50问)web

1. 你以为Java语言怎么样?面试

  java是面向对象的语言;跨平台可移植;解释性语言;封装、继承、多态;Java中无指针,对象的引用实现链表;GC自动垃圾回收,不用担忧内存泄露;单继承,实现多接口;java中有异常处理(C++没有)。算法

2. 说说你常使用的集合类,而后针对一个往死里问。spring

  接口List和Set继承自接口Collection,Map接口则不是。实现List的类有ArrayList、LinkedList、Vector;实现Set的类有HashSet、TreeSet;实现Map的类有HashMap、LinkedHashMap。

Hashtable和HashMap的区别:
1.Hashtable是Dictionary的子类,HashMap是Map接口的一个实现类;
2.Hashtable中的方法是同步的,而HashMap中的方法是非同步的。在多线程应用程序中能够安全地可使用Hashtable;而对于HashMap,则须要额外的同步机制。但HashMap的同步问题可经过Collections的一个静态方法获得解决:Map Collections.synchronizedMap(Map m)。这个方法返回一个同步的Map,这个Map封装了底层的HashMap的全部方法,使得底层的HashMap即便是在多线程的环境中也是安全的。
3.在HashMap中,容许key=null&&value=null,可是HashTable不容许。
// HashMap和ConcurrentHashMap的区别。
1. HashMap线程不安全。ConcurrentHashMap线程安全。 2. ConcurrentHashMap实现线程安全不是经过synchronized来实现的。而是采用了一个分段锁的概念。 3. ConcurrentHashMap的工做机制,经过把整个Map分为N个Segment, 当put和get的时候,经过使用key.hashCode()方法来算出放到哪一个setment中。
// HashMap和HashSet的区 map存键值对; Collections存对象。HashSet是用HashMap来实现的。
Map集合,就是有一对属性值的集合,属性包含key,和value。关键字key是惟一不重复的。Map是一个有序的集合,因此查询起来速度很快。而HashSet就像是把HashMap中value去掉,说白了就是只有一个key的HashMap集合。
Set是数学中定义的集合,因此元素无序, 且不能重复添加。java程序中Set集合用的很少,Map集合中的HashMap集合,List集合用的却是很多。

1. HashSet存储的元素不能重复。HashSet中有equals()和hasCode()方法,确保存入集合的元素不重复。add方法存入元素的时候,首先判断要放入对象的hashcode值与集合中的任意一个元素的hashcode值是否相等,若是不相等直接将该对象放入集合中。若是hashcode值相等,而后再经过equals方法判断要放入对象与集合中的任意一个对象是否相等,若是equals判断不相等,直接将该元素放入到集合中,不然不放入。
2. HashSet中add元素的源码以下:
public boolean add(E e) { return map.put(e, PRESENT)==null; } public V put(K key, V value) { if (key == null) return putForNullKey(value); int hash = hash(key.hashCode()); int i = indexFor(hash, table.length); for (Entry<K,V> e = table[i]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } } modCount++; addEntry(hash, key, value, i); return null; }
3. HashMap保存了对象存入时候的顺序,可是HashSet再输出的时候,顺序是跟存入时候的顺序不同的。由于其内部是使用hashCode()方法来实现的。map用put()方法; set用add()方法。
// HashSet是如何遍历的?遍历hashSet有两种方案:
1. clone出一个新的hashSet, 再用iterator迭代。(源码中采用这种 推荐)
2. toArray建立一个新数组, 再用for each循环遍历。(不推荐 效率不高)

3. length()和size()

  size用于集合类,length用于字符串和数组,字符串是函数,数组是属性。

4. Java集合类中的排序:

// ArrayList中有sort() 方法, 对 Java Arrays.sort()源代码解析:
1. sort()方法的源码中对基本数据类型使用快速排序; 对引用数据类型使用归并排序。理由:对象排序,稳定性更重要,对象移动开销大。具体的快速排序方法是有必定优化的,根据数组大小的不一样,有不一样的分割位置。

//ArrayList 默认初始容量是10,扩容1.5倍。LinkedList不须要,那么Vector是扩容2倍。Vector线程安全。
//HashTable怎么
实现线程安全的,调用了Hashtable.Synchronized方法后才变成线程安全,内部使用一个静态字段实现锁定。

5. equals( )方法和 = = 比较。 equals( )方法和hasCode( )方法比较。

// 首先equals 和 == 比较。
1. 一个是运算符,一个是方法 2. 比较无非就是在比较基本数据类型和引用数据类型。当比较基本数据类型的时候,equals和==均可以比较两个值是否相等,相等为true,不然为false。 当比较的是引用数据类型的时候,==和equals都是比较对象在内存中的地址是否相等,相等为true,不然为false。 3.特别注意的就是String了。object中的equals方法是==,string重写了==方法,因此,在String在比较的是对象的时候,equals同,==不一样。比较字符串的时候是相同的。 public class Test{ public static void main(String args[]){ String s1 = "abc"; String s2 = "abc"; System.out.println(s1==s2?Boolean.TRUE:Boolean.FALSE); System.out.println(s1.equals(s2)?Boolean.TRUE:Boolean.FALSE); } }
// 其次, equals()和hasCode()方法比较

1. 先掌握两个知识点:HashMap中put元素的实现; HashSet中add元素时候, 如何判断元素是否相同。
2. Object中默认的equals是比较内存地址的; 通常对象重写equals方法是为了比较内容。Object类的对象的hashCode是每new一个都不同。 可是若是你new两个相同的String,那么他们的hashCode是同样的。hashcode大部分状况下映射到内存地址。
 

6. Java抽象类和接口的区别。

  抽象类能够有构造方法,构造方法不能够继承。可是能够供子类使用super来调用。

  接口中的方法和变量是共有的,由于要供别人使用。抽象类中的方法和变量则是能够私有的。

  能够继承一个类,可是能够实现多个接口。

  接口定义方法,不能实现。抽象类能够实现部分方法。抽象类动物。接口是抽出公有的行为。动做。

  概念不同:实现接口的必定要实现接口里定义的全部方法,而实现抽象类能够有选择地重写须要用到的方法,通常的应用里,最顶级的是接口,而后是抽象类实现接口,最后才到具体类实现public class ArrayList<E> extends AbstractList<E> implements List<E> 

7. Java多态的实现机制。

重载和重写。
子类重写父类方法。
参数不一样,重载。

8. Java类加载的原理。

                                                  

每一个java开发人员对java.lang.ClassNotFoundExcetpion这个异常确定都不陌生,这背后就涉及到了java技术体系中的类加载。Java的类加载机制是java技术体系中比较核心的部分,虽然和大部分开发人员直接打交道很少,可是对其背后的机理有必定理解有助于排查程序中出现的类加载失败等技术问题,对理解java虚拟机的链接模型和java语言的动态性都有很大帮助。(跟异常结合来问) 最佳答案

9. Object类有几个方法?

1. clone( )方法, 建立并返回对象的一个副本。
2. getClass()方法,返回运行时类。
3. hashCode()方法,返回对象的哈希码。
4. toString()方法,返回对象的字符串表示。
5. wait()方法,使当前线程等待,知道被唤醒

// 咱们知道万事万物都是联系的,java对象世界也是如此; 因此要有一个超类Object,对象之间要发生关系,要并发、要同步,必需要使用wait()方法,学了JavaScript的继承机制,你就知道了为何要有一个超类。

10. try-catch-finally中,若是在try或catch中有return过,是否还执行 。

// 执行顺序总结:一句话描述“finally 永远执行”

1. 在try中没有异常的状况下try、catch、finally的执行顺序 try --- finally
2. 若是try中有异常,执行顺序是try --- catch --- finally
3. 若是try中没有异常而且try中有return这时候正常执行顺序是try ---- finally --- return
4. 若是try中有异常而且try中有return这时候正常执行顺序是try----catch---finally--- return

try-catch-finally里都没有return ,finally 以后有个return ,若是try中有异常,finally执行完后,还能执行return吗?那是不可能执行的了,try中有异常之后,根据java的异常机制先执行catch后执行finally,此时错误异常已经抛出,程序因异常而终止,因此你的return是不会执行的

//catch中同时有父异常和子异常,那么子异常优先来捕获异常。

11. JVM布局,JVM内部内存的划分。

首先知道,内存中被划分红这么几块儿:堆、栈、程序计数器、本地方法栈、方法区。 

1.方法区是线程共享的,跟堆同样; 本地方法栈,相似于栈,是用于执行本地方法的。

12. Java中序列化

第一点,要阐述的是当JVM处于运行时,java对象才可能存在。即Java对象的生命周期不会比JVM的生命周期更长。但在现实应用中,就可能要求在JVM中止运行以后可以保存(持久化)指定的对象,并在未来从新读取被保存的对象。Java对象序列化就可以帮助咱们实现该功能。使用Java对象序列化,在保存对象时,会把其状态保存为一组字节,在将来,再将这些字节组装成对象。必须注意地是,对象序列化保存的是对象的"状态",即它的成员变量。由此可知,对象序列化不会关注类中的静态变量。除了在持久化对象时会用到对象序列化以外,当使用RMI(远程方法调用),或在网络中传递对象时,都会用到对象序列化。

第二点,在Java中,只要一个类实现了java.io.Serializable接口,那么它就能够被序列化。

13. Java中反射机制

  一句话说Java反射机制就是,运行状态时动态获取信息。不少开源框架实现都是使用了java的反射机制。为何要使用java反射呢?有一句经典的话,叫作:父类引用指向子类对象。能发挥这种能力,须要配合在动态运行时肯定。体现了Java的灵活性,体现了多态,下降了类之间的耦合性。

1. 对于任意一个类,都可以知道这个类的全部属性和方法;
2. 对于任意一个对象,都可以调用它的任意一个方法;

Java反射机制能干什么?若是不使用反射机制。一个对象,增删改查,分别要建立四个Dao类来,有了Dao类,只须要写一个Dao类,四个方法,其他的交给java反射机制来解决。

14. Java中多线程

1. 继承Thread类,或者实现Runnable接口。
2. 重写Runnable中的run方法,启动线程用start方法。
3. java中有两种线程,用户线程和守护线程。 守护线程:优先级最低,setDaemon方法设置为守护线程。GC垃圾回收就是一个守护线程。
4. 当JVM的线程都是守护线程的时候,JVM就能够退出了。守护线程是用来服务用户线程的。
5. Java线程池,若是并发的线程数量不少,而且每一个线程都是执行一个时间很短的任务就结束了,这样频繁建立线程就会大大下降系统的效率,由于频繁建立线程和销毁线程须要时间。那么有没有一种办法使得线程能够复用,就是执行完一个任务,并不被销毁,而是能够继续执行其余的任务。在Java中能够经过线程池来达到这样的效果。

6. Java中线程安全问题, 线程安全问题主要出如今访问临界资源的时候,就是访问同一个对象的时候,可能会出现没法挽回的损失,特别是在关于资金安全方面的时候,固然还有数据库事务方面的问题。他们很相似,都是要保证数据的原子性。对与共同使用的对象进行加锁,意思是我使用的时候,那么你就必须等待,等我用完以后你再用,反之依然。加锁使用关键字synchronized。将当前线程锁定,让别的线程等待。
7. HashMap为什么线程不安全,同时又读又写的时候,不能保证结果的惟一。就是线程不安全。
8. 线程有几种状态:就绪、运行、阻塞、挂起。

21. Java中哈希实现原理。

哈希的出现时由于传统数据结构如线性表(数组,链表等),树中,关键字与其它的存放位置不存在对应的关系。所以在查找关键字的时候须要逐个比对,虽然出现了二分查找等各类提升效率的的查找算法。可是这些并不足够,但愿在查询关键字的时候不通过任何比较,一次存取便能获得所查记录。所以,咱们必须在关键字和其对应的存储位置间创建对应的关系f。这种对应的关系f被称为哈希函数,按此思想创建的表为哈希表。关键在于哈希函数如何构造。

http://www.linuxidc.com/Linux/2014-04/100598.htm

HashMap里面实现一个静态内部类Entry, 

静态定义,其实主要做用就是把初始化交给JVM,并且不须要人工初始化。 Entry就是用的LinkedList<E>里面的E, javaAPI的设计者们把Entry设计成静态内部类应该是为了方便使用吧。

 22. 说说Java静态内部类。

须要了解2个概念:内部类和静态修饰符static
1)首先,用内部类是由于内部类与所在外部类有必定的关系,每每只有该外部类调用此内部类。因此没有必要专门用一个Java文件存放这个类。
2)静态都是用来修饰类的内部成员的。好比静态方法,静态成员变量,静态常量。它惟一的做用就是随着类的加载(而不是随着对象的产生)而产生,以至能够用类名+静态成员名直接得到。
这样静态内部类就能够理解了,由于这个类没有必要单独存放一个文件,它通常来讲只被所在外部类使用。而且它能够直接被用 外部类名+内部类名 得到。
如下举例说明怎么使用:
Student类有个叫School的内部类(非静态)
Student stu = new Student();
stu.School sch = new stu.School();
sch就是School的一个对象。

假如School是内部静态类:
Student.School sch = new Student.School();
首先你要明白静态内部类和通常内部类的区别。
一、静态内部类也叫嵌套类,用这个名字给他定义是更加形象的。意思是说内部类和外部类的关系只是层次嵌套关系,因此只是在建立类文件的时候类文件名是以下形式:outer$inner.java,在使用方面彻底和两个普通类同样。
二、通常内部类在我看来才是真正的内部类,他们不只有着嵌套关系,更重要的是内部类能够得到外部类的引用从而实现回调。并且经过建立内部类还可已让java实现真正的多继承!(interface名叫接口,顾名思义,他就是实现接口的,让一个类继承多个接口实现多继承是不合适的)。关于内部类里面的东西比较多,也是java比较特点之一,不要期望在网上看就能学会,买本书再多多练习才能掌握。
Java语言容许在类中再定义类,这种在其它类内部定义的类就叫内部类。内部类又分为:常规内部类、局部内部类、匿名内部类和静态嵌套类四种。
一、静态内部类定义

静态内部类,定义在类中,任何方法外,用static定义;静态内部类只能访问外部类的静态成员。
生成(new)一个静态内部类不须要外部类成员:这是静态内部类和成员内部类的区别。静态内部类的对象能够直接生成:Outer.Inner in=new Outer.Inner();而不须要经过生成外部类对象来生成。这样实际上使静态内部类成为了一个顶级类。能够定义私有静态内部类。
二、java实现静态内部类注意事项 将某个内部类定义为静态类,跟将其余类定义为静态类的方法基本相同,引用规则也基本一致。不过其细节方面仍然有很大的不一样。具体来讲,主要有以下几个地方要引发注意。 1)通常状况下,若是一个内部类不是被定义成静态内部类,那么在定义成员变量或者成员方法的时候,是不可以被定义成静态成员变量与静态成员方法的。也就是说,在非静态内部类中不能够声明静态成员。 2)通常非静态外部类能够随意访问其外部类的成员变量以及方法(包括声明为private的方法),可是若是一个内部类被声明为static,则其在访问包括自身的外部类会有诸多的限制。静态内部类不能访问其外部类的非静态成员变量和方法 3)在一个类中建立非静态成员内部类的时候,有一个强制性的规定,即内部类的实例必定要绑定在外部类的实例中。而后要在一个外部类中定义一个静态的内部类,不须要利用关键字new来建立内部类的实例。即在建立静态类内部对象时,不须要其外部类的对象。

23. 说说Java内部类。

内部类的优势是:内部类能够访问外部类的私有成员变量,而不须要new外部类的对象。
内部类又分为:静态内部类、匿名内部类、局部内部类、成员内部类。

  静态内部类的应用场景是:只能够访问外部类的静态成员变量和静态成员方法。

  成员内部类的应用场景是:它能够访问它的外部类的全部成员变量和方法,无论是静态的仍是非静态的均可以。

  局部内部类:像局部变量同样,不能被public, protected, private和static修饰。只能访问方法中定义的final类型的局部变量。

  匿名内部类:匿名内部类就是没有名字的局部内部类,不使用关键字class, extends, implements, 没有构造方法。匿名内部类隐式地继承了一个父类或者实现了一个接口。匿名内部类使用得比较多,一般是做为一个方法参数。

内部类不是很好理解,但说白了其实也就是一个类中还包含着另一个类。 如同一我的是由大脑、肢体、器官等身体结果组成,而内部类至关于其中的某个器官之一,例如心脏:它也有本身的属性和行为(血液、跳动)。

显然,此处不能单方面用属性或者方法表示一个心脏,而须要一个类。而心脏又在人体当中,正如同是内部类在外部内当中
从上面的例子不难看出,内部类其实严重破坏了良好的代码结构,但为何还要使用内部类呢? 由于内部类能够随意使用外部类的成员变量(包括私有)而不用生成外部类的对象,这也是内部类的惟一优势 如同心脏能够直接访问身体的血液,而不是经过医生来抽血

  程序编译事后会产生两个.class文件,分别是Out.class和Out$In.class。其中$表明了上面程序中Out.In中的那个。Out.In in = new Out().new In()能够用来生成内部类的对象,这种方法存在两个小知识点须要注意:1.开头的Out是为了标明须要生成的内部类对象在哪一个外部类当中。2.必须先有外部类的对象才能生成内部类的对象,由于内部类的做用就是为了访问外部类中的成员变量。

 24. Java中final和static区别。

  Java中的String类就是一个final类。当用final修饰一个类时,代表这个类不能被继承。要注意final类中的全部成员方法都会被隐式地指定为final方法。对于一个final变量,若是是基本数据类型的变量,则其数值一旦在初始化以后便不能更改;若是是引用类型的变量,则在对其初始化以后便不能再让其指向另外一个对象。被final修饰的引用变量一旦初始化赋值以后就不能再指向其余的对象,那么该引用变量指向的对象的内容是可变的。

  在static方法内部不能调用非静态方法,反过来是能够的。static目的是,方便在没有建立对象的状况下来进行调用(方法/变量)。被static关键字修饰的方法或者变量不须要依赖于对象来进行访问,只要类被加载了,就能够经过类名去进行访问。对于静态方法来讲,是没有this的,由于它不依附于任何对象,既然都没有对象,就谈不上this了。在静态方法中不能访问类的非静态成员变量和非静态成员方法,由于非静态成员方法/变量都是必须依赖具体的对象才可以被调用。在静态方法中不能访问非静态成员方法和非静态成员变量,可是在非静态成员方法中是能够访问静态成员方法/变量的。

  附:常常翻java API么?最新的JDK是哪一个版本?有什么新特性。

当前JDK 1.8版本。新特性以下:

1.Java 8容许咱们给接口添加一个非抽象的方法实现,只须要使用 default关键字便可,这个特征又叫作扩展方法。

2.Lambda 表达式 和 Functional 接口。Lambda表达式(也称为闭包)是整个Java 8发行版中最受期待的在Java语言层面上的改变,Lambda容许把函数做为一个方法的参数(函数做为参数传递进方法中),或者把代码当作数据:函数式程序员对这一律念很是熟悉。在JVM平台上的不少语言(Groovy,Scala,……)从一开始就有Lambda,可是Java程序员不得不使用毫无新意的匿名类来代替lambda。关于Lambda设计的讨论占用了大量的时间与社区的努力。可喜的是,最终找到了一个平衡点,使得可使用一种即简洁又紧凑的新方式来构造Lambdas。在最简单的形式中,一个lambda能够由用逗号分隔的参数列表、–>符号与函数体三部分表示。
例如:
在看实例以前,先看一个函数的使用Arrays.asList()方法的使用:
Arrays首先是一个工具类,它提供了Arrays.sort()方法.

 

 

25 。 Collection 和 Collections的区别。 

Collection是集合类的上级接口,继承与他的接口主要有Set 和List. 
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各类集合的搜索、排序、线程安全化等操做。 

 26. 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 就必须为之提供外同步。 
Hashtable和HashMap采用的hash/rehash算法都大概同样,因此性能不会有很大的差别。 

27. sleep() 和 wait() 有什么区别? 
    sleep是线程类(Thread)的方法,致使此线程暂停执行指定时间,给执行机会给其余线程,可是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。 
wait是Object类的方法,对此对象调用wait方法致使本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备得到对象锁进入运行状态。 

28. Overload和Override的区别。Overloaded的方法是否能够改变返回值的类型? 
方法的重写Overriding和重载Overloading是Java多态性的不一样表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。若是在子类中定义某方法与其父类有相同的名称和参数,咱们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了。若是在一个类中定义了多个同名的方法,它们或有不一样的参数个数或有不一样的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是能够改变返回值的类型。 

29. error和exception有什么区别? 
  error 表示恢复不是不可能但很困难的状况下的一种严重问题。好比说内存溢出。不可能期望程序能处理这样的状况。 
      exception 表示一种设计或实现问题。也就是说,它表示若是程序运行正常,从不会发生的状况。 

30.  同步和异步有何异同,在什么状况下分别使用他们?举例说明。 
若是数据将在线程间共享。例如正在写的数据之后可能被另外一个线程读到,或者正在读的数据可能已经被另外一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。 
当应用程序在对象上调用了一个须要花费很长时间来执行的方法,而且不但愿让程序等待方法的返回时,就应该使用异步编程,在不少状况下采用异步途径每每更有效率。 

31。 forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,而后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,因此它的地址栏中仍是原来的地址。 
       redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器从新去请求那个地址,通常来讲浏览器会用刚才请求的全部参数从新请求,因此session,request参数均可以获取。 

23. EJB与JAVA BEAN的区别? 
Java Bean 是可复用的组件,对Java Bean并无严格的规范,理论上讲,任何一个Java类均可以是一个Bean。但一般状况下,因为Java Bean是被容器所建立(如Tomcat)的,因此Java Bean应具备一个无参的构造器,另外,一般Java Bean还要实现Serializable接口用于实现Bean的持久性。Java Bean实际上至关于微软COM模型中的本地进程内COM组件,它是不能被跨进程访问的。Enterprise Java Bean 至关于DCOM,即分布式组件。它是基于Java的远程方法调用(RMI)技术的,因此EJB能够被远程访问(跨进程、跨计算机)。但EJB必须被布署在诸如Webspere、WebLogic这样的容器中,EJB客户从不直接访问真正的EJB组件,而是经过其容器访问。EJB容器是EJB组件的代理, EJB组件由容器所建立和管理。客户经过容器来访问真正的EJB组件。 

24. 说出数据链接池的工做机制是什么? 
J2EE 服务器启动时会创建必定数量的池链接,并一直维持很多于此数目的池链接。客户端程序须要链接时,池驱动程序会返回一个未使用的池链接并将其表记为忙。若是当前没有空闲链接,池驱动程序就新建必定数量的链接,新建链接的数量有配置参数决定。当使用的池链接调用完成后,池驱动程序将此链接表记为空闲,其余调用就可使用这个链接。

25.当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 
不能,一个对象的一个synchronized方法只能由一个线程访问。 

26. Java中的异常处理机制的简单原理和应用。 
当JAVA 程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常。违反语义规则包括2种状况。一种是JAVA类库内置的语义检查。例如数组下标越界,会引起IndexOutOfBoundsException;访问null的对象时会引起NullPointerException。另外一种状况就是JAVA容许程序员扩展这种语义检查,程序员能够建立本身的异常,并自由选择在什么时候用throw关键字引起异常。全部的异常都是 java.lang.Thowable的子类。 

27. 垃圾回收的优势和原理。并考虑2种回收机制。 
Java语言中一个显著的特色就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候再也不须要考虑内存管理。因为有个垃圾回收机制, Java中的对象再也不有"做用域"的概念,只有对象的引用才有"做用域"。垃圾回收能够有效的防止内存泄露,有效的使用可使用的内存。垃圾回收器一般是做为一个单独的低级别的线程运行,不可预知的状况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或全部对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。 

28. 请说出你所知道的线程同步的方法。 
wait():使一个线程处于等待状态,而且释放所持有的对象的lock。 
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。 
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM肯定唤醒哪一个线程,并且不是按优先级。 
Allnotity():唤醒全部处入等待状态的线程,注意并非给全部唤醒线程一个对象的锁,而是让它们竞争。 

29. 你所知道的集合类都有哪些?主要方法? 
最经常使用的集合类是 List 和 Map。 List 的具体实现包括 ArrayList 和 Vector,它们是可变大小的列表,比较适合构建、存储和操做任何类型对象的元素列表。 List 适用于按数值索引访问元素的情形。 
Map 提供了一个更通用的元素存储方法。 Map 集合类用于存储元素对(称做"键"和"值"),其中每一个键映射到一个值。 

30. 描述一下JVM加载class文件的原理机制? 
JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader 是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类。 

31. JSP的内置对象及方法。 
request表示HttpServletRequest对象。它包含了有关浏览器请求的信息,而且提供了几个用于获取cookie, header, 和session数据的有用的方法。 
    response表示HttpServletResponse对象,并提供了几个用于设置送回浏览器的响应的方法(如cookies,头信息等) 
    out对象是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。 
    pageContext表示一个javax.servlet.jsp.PageContext对象。它是用于方便存取各类范围的名字空间、servlet相关的对象的API,而且包装了通用的servlet相关功能的方法。 
    session表示一个请求的javax.servlet.http.HttpSession对象。Session能够存贮用户的状态信息 
    applicaton 表示一个javax.servle.ServletContext对象。这有助于查找有关servlet引擎和servlet环境的信息 
    config表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化参数。 
    page表示从该页面产生的一个servlet实例 

31. 线程的基本概念、线程的基本状态以及状态之间的关系 
线程指在程序执行过程当中,可以执行程序代码的一个执行单位,每一个程序至少都有一个线程,也就是程序自己。 
Java中的线程有四种状态分别是:运行、就绪、挂起、结束。 

32. servlet的生命周期 
web容器加载servlet,生命周期开始。经过调用servlet的init()方法进行servlet的初始化。经过调用service()方法实现,根据请求的不一样调用不一样的do***()方法。结束服务,web容器调用servlet的destroy()方法。 

http://www.aliyun.com/zixun/content/3_12_523694.html

http://wenku.baidu.com/link?url=tpivQbMVCwLtk8r24ggl7hcF-gXQ5-bTKrnYcMnYenvu-b7ylUBodmuZ0H52xVeN1KHNk0ciHygy0sshINcAxqCb4T19laxjUZ_npHZ6SSK

http://blog.csdn.net/sunshinesir/article/details/8221509

Java框架篇

1. Ajax实现机制。

  Ajax是异步通信,所谓的异步是指再不刷新页面的状况下与后台进行的一次通讯。它的技术实现原理经过内置的XmlHttpRequest发送请求,至关于有一个小浏览器在你不知情的状况下发送了一个小请求,从服务器获取数据,经过javascript处理返回值来更新页面上的东西。

2. Servlet线程安全么?周期呢?

Servlet容器默认采用单实例多线程的方式来处理请求,默认是非线程安全的Servlet容器如何同时来处理多个请求,Servlet采用多线程来处理多个请求同时访问。servlet依赖于一个线程池来服务请求。线程池其实是一系列的工做者线程集合。Servlet使用一个调度线程来管理工做者线程. 当容器收到一个Servlet请求,调度线程从线程池中选出一个工做者线程,将请求传递给该工做者线程,而后由该线程来执行Servlet的 service方法。当这个线程正在执行的时候,容器收到另一个请求,调度线程一样从线程池中选出另外一个工做者线程来服务新的请求,容器并不关心这个请求是否访问的是同一个Servlet.当容器同时收到对同一个Servlet的多个请求的时候,那么这个Servlet的service()方法将在多线程中并发执行。 Servlet容器默认采用单实例多线程的方式来处理请求,这样减小产生Servlet实例的开销,提高了对请求的响应时间,对于Tomcat能够在server.xml中经过<Connector>元素设置线程池中线程的数目。 就实现来讲: 调度者线程类所担负的责任如其名字,该类的责任是调度线程,只须要利用本身的属性完成本身的责任。因此该类是承担了责任的,而且该类的责任又集中到惟一的单体对象中。而其余对象又依赖于该特定对象所承担的责任,咱们就须要获得该特定对象。那该类就是一个单例模式的实现了。

3. 

 

 

 

 

Hibernate为何优于JDBC。

Hibernate一级缓存和二级缓存。

Servlet生命周期。

session是怎么实现的?存储在哪里?   http://blog.csdn.net/zhq426/article/details/2992488

说说你认识的设计模式。及常见的应用场景。

http://zhidao.baidu.com/link?url=wTRk2ft-_lOZCHKiGp8_Wu2pi1pqUJC5GFwFVzpy1qmqZsGS5UkyllRaE0G-wlrKTMl4CYJ5rvOwINFqULoA_q

 +杂题

 

6. SpringMVC经常用的注解

// 经常使用注解总结

1.  @Controller , 标注在控制层。@Service 常标注在业务层,用于标志业务逻辑。@Repository 标注在持久层,即dao。用于标注数据访问。
2.  @RequestMapping , 同上标注在类定义出,将Controller和特定请求关联起来。
3.  @PathVariable ,  该注解绑定它传过来的值到方法的参数上。
4. @Autowired, Java web的实体类属性中使用注解@Autowired以后, 不须要再写getter和setter方法,spring会自动注入。

数据结构篇

6.

 

 

设计模式篇

1. 静态代理模式,及其应用场景。

  最佳博客

2. Spring中用到的设计模式。

  http://www.360doc.com/content/13/0116/13/11261516_260506834.shtml

3.

SQL经常使用命令研究

1. 先来一个基础复习,SQL语句基础

 

// 先来几组约定:
  1. sql语句不区分大小写,但涉及到表名 字段名的时候要对应起来。
  2. 数据库名约定为DBName 表名约定为tableName 列名约定为columnName

1. create database DBName;
2. drop database DBName;
3. creat table tableName (id varchar(20) primary key, idCard varchar(18), address varchar(100))
4. drop table tableName
5. Alter table tableName add column columnName varchar(10)

6. select * from tableName where
7. insert into tableName(id,age) values(11,28)
8. delete from table where
9. update tableName set id=12 where
10. select * from tableName where name like '%李%'
11. select * from tableName order by id, age[des]
12. select count as totalCount from tableName //总数

2.数据库中group by和having区别

having 和where 都是用来筛选用的   having 是筛选组 而where是筛选记录; 当分组筛选的时候用having, 其余的状况用where。

使用having,就必定要与group by连用. 用group by不必定要用having,它只是当须要在组内筛选的时候用的.

 

 

 

 

 

 

项目篇 

1.

相关文章
相关标签/搜索