阿里巴巴面试题java9篇

时间:2022-10-09 08:12:00 试题

  下面是范文网小编收集的阿里巴巴面试题java9篇,供大家阅读。

阿里巴巴面试题java9篇

阿里巴巴面试题java1

  1、自我介绍(还好我昨天准备了下)

  2、某个项目中遇到的最大问题

  3、团队成员间如何更好的协作

  4、项目的总体框架,模块的测试

  5、项目中用到的设计模式

  6、系统的安全性

  7、除了JSP还用过什么视图显示

  8、关于Ajax的问题,没接触过,题目也忘了

  9、HashMap和HashTable的区别

  10、关于Hashmap中key和关联对象的问题(对题目不太理解)

  11、多态的实现机制 (蒙了)

  12、类加载的原理 (说了个反射)

  13、举一个线程同步的例子

  14、Servlet的生命周期

  15、对SOA的'理解 (我说这东西有点虚了,会被云计算取代)

  16、用过什么开源web框架

  17、讲述各种排序算法的特点 (讲了一大堆)

  18、如何处理对数据库某张表的大量并发处理,性能提高(还好看过oracle)

  19、数据库中各种表的关联关系的理解(有难度)

  20、面向对象的特征

  21、Lucene和Nutch的区别

  22、喜欢什么运动 (网球)

  23、喜欢看书吗?喜欢看什么书?

  24、通过什么途径了解最新的技术发展

  25、如果淘宝的offer也拿到了,你怎么选择

  26、职位规划

阿里巴巴面试题java2

  01. 介绍一下你技术方面

  刚开始有点紧张,说的有点断断续续,中间还有HR MM进来,另外一个mm进来给面试官端水

  02. 性能优化方面

  我理解为代码层面的

  我:

  一是:HTML层次结构不要太深,层次结构深会xx…

  二是:防止内存泄露,DOM和javascript是两种东西,特别在IE等浏览器,javascript操作DOM效率低,容易造成内存泄露,在不使用的时候最好设为null

  三是:写类的时候用prototype,不要动态this.xx = funciton{}, 这样不能资源复用

  面试官:还有吗

  我疑问:哪方面的优化

  面试官:站点性能优化

  我豁然,说:哦,缓存啊,代码本地化

  面试官疑惑:本地缓存?如何?

  我:Expires,Etag等

  面试官:还有呢

  我:如果有条件使用cdn,还有cookie隔离

  面试官疑问:隔离?

  我:就是防止静态资源发送cookie,通过配置独立域名的,另外独立域名的好处还有多线程下载,因为传统浏览器限制了并发数2,是一个域名限制2,如果多一个域名可以多几个并发

  面试官:那么通常说脚本为什么要放头和放尾呢

  我:我知道一般放尾是为了不影响HTML的解析,另外放尾处可以不用DOM ready,直接可以document.getElementById等,至于放在头一般是变量定义吧,还有可能是受base得影响,放在头部一般是css文件,防止裸奔

  03. 字体定义有哪俩种方式

  我理解为字体定义font-face

  我:用font-face引入字体文件,有俩种?

  面试官:是字体大小

  我:哦,有俩种单位,一个是绝对值,类似于px,一个是相对值em之类的

  面试官追问:那em和px有什么关系

  我:如果父元素定义字体大小16px,那么子元素定义1em,大小就是16px

  追问:em默认值是多少

  我:不太清楚,跟浏览器设置有关吧

  04. 弹性布局和响应式及重构

  我:通过media-query,让不同浏览器展现不同布局

  面试官:还有吗?

(我有点卡了,这方面确实没怎么研究)

  继续说:每个组件在不同屏幕上显示不同样子吧,比如导航菜单在宽屏下显示一通栏,在手机上显示一个按钮

(其实他想听到我对弹性布局、流式布局的解释,用相对单位、max-width来控制等)

  面试官:有一篇文章中说99%的网站都需要被重构,这个文章你有看过吗?

  我:没有,听过

  面试官:为什么这么说?

  我:主要是政府等网站,大量的使用了table等标签,不规范,不过这个地方成本很高。

(这个问题没回答好,有点答非所问,不知道当时怎么想的,应该从规范、趋势、移动端方面去回答这个问题)

  05.你知道什么叫优雅降级和渐进增强

  我:我知道有两种,至于如何和这两个词对上不知道,一种是类似于border-radius,能显示圆角更好看,不能显示就显示方形,用户也可以接受;另一种是比如我要一个长连接,在高端浏览器上使用websocket,不能使用的用iframe流或者ajax,这个已经有socket.io封装了,算是渐进增强吧

阿里巴巴面试题java3

  一、谈谈final, finally, finalize的区别,

  Final --修饰符(关键字)。如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类

  不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为

  Final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载。

  Finally—在异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。

  Finalize —方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。

  这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。

  子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。

  二、Anonymous Inner Class (匿名内部类)

  是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?

  匿名的内部类是没有名字的内部类。不能extends(继承) 其它类,但一个内部类可以作为一个接口,由另一个内部

  类实现。

  三、Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。

  Nested Class (一般是C++的说法),Inner Class (一般是JAVA的说法)。

  Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。具体可见

/articles/services/view.asp?id=704&page=1

  注: 静态内部类(Inner Class)意味着

  1、创建一个static内部类的对象,不需要一个外部类对象,2、不能从一个static内部类的一个对象访问一个外部类对象

  四、&和&&的区别。

&是位运算符。&&是布尔逻辑运算符。

  五、HashMap和Hashtable的区别。

  都属于Map接口的类,实现了将惟一键映射到特定的值上。 HashMap 类没有分类或者排序。它允许一个 null键和多个 null 值。 Hashtable 类似于HashMap,但是不允许 null 键和 null 值。它也比 HashMap 慢,因为它是同步的。

  六、Collection 和 Collections的区别。

  Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。

  Collection是个java.util下的接口,它是各种集合结构的父接口。

  七、什么时候用assert。

  断言是一个包含布尔表达式的语句,在执行这个语句时假定该表达式为 true。

  如果表达式计算为 false,那么系统会报告一个 AssertionError。

  它用于调试目的: assert(a > 0); // throws an AssertionError if a <= 0

  断言可以有两种形式: assert Expression1 ; assert Expression1 : Expression2 ; Expression1

  应该总是产生一个布尔值。 Expression2 可以是得出一个值的任意表达式。这个值用于生成显示更多调试信息的 String 消息。

  断言在默认情况下是禁用的。要在编译时启用断言,需要使用 source 1.4 标记: javac -source 1.4 Test.java

  要在运行时启用断言,可使用 -enableassertions 或者 -ea 标记。 要在运行时选择禁用断言,可使用 -da 或者 -disableassertions 标记。

  要在系统类中启用断言,可使用 -esa 或者 -dsa 标记。还可以在包的基础上启用或者禁用断言。

  可以在预计正常情况下不会到达的任何位置上放置断言。断言可以用于验证传递给私有方法的参数。不过,断言不应该用于验证

  传递给公有方法的参数,因为不管是否启用了断言,公有方法都必须检查其参数。不过,既可以在公有方法中,也可以在非公有方法中利用断言测试后置条件。另外,断言不应该以任何方式改变程序的状态。

  八、GC是什么? 为什么要有GC? (基础)。

  GC是垃圾收集器。Java 程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,

  可以调用下面的方法之一: System.gc() 、Runtime.getRuntime().gc()

  九、String s = new String(“xyz”);创建了几个String Object?

  两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。

  十、Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

  Math.round(11.5)返回(long)12,Math.round(-11.5)返回(long)-11;

  十一、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?

  short s1 = 1; s1 = s1 + 1;有错,s1是short型,s1+1是int型,不能显式转化为short型。

  可修改为s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正确。

  十二、sleep() 和 wait() 有什么区别?

  搞线程的最爱sleep()方法是使线程停止一段时间的方法,

  在sleep 时间间隔期满后,线程不一定立即恢复执行。

  这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非(a)“醒来”的线程具有更高的优先级,(b)正在运行的线程因为其它原因而阻塞。

  wait()是线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。

  十三、Java有没有goto?

  Goto—java中的保留字,现在没有在java中使用。

  十四、数组有没有length()这个方法? String有没有length()这个方法?

  数组没有length()方法,有length的属性。String有length()方法。

  十五、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?

  方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,

  重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被

  重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。

  如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。

  Overloaded的方法是可以改变返回值的类型。

  十八、error和exception有什么区别?

  error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。

  exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。

  二十,abstract class和interface有什么区别?

  声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明

  方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,

  并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供

  实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。

  接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有

  方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从

  接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允

  许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。

  二十三,启动一个线程是用run()还是start()?

  启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行

。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。

  2.抽象类和接口的区别.

  答案:

(1)接口可以被多重implements,抽象类只能被单一extends.

(2)接口只有定义,抽象类可以有定义和实现.

(3)接口的字段定义默认为:public static final, 抽象类字段默认friendly“(本包可见).

  37、int 和 Integer 有什么区别

  答:Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。原始类型封装类booleanBoolean,charCharacter,byteByte,shortShort,intInteger,

  longLong,floatFloat,doubleDouble引 用类型和原始类型的行为完全不同,并且它们具有不同的语义。

  引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数 据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类 型有关

  42、Java的接口和C++的虚类的相同和不同处

  答:由 于Java不支持多继承,而有可能某个类或对象要使用分别在几个类或对象里面的方法或属性,现有的单继承机制就不能满足要求。与继承相比,接口有更高的灵 活性,因为接口中没有任何实现代码。当一个类实现了接口以后,该类要实现接口里面所有的方法和属性,并且接口里面的属性在默认状态下面都是 public static,所有方法默认情况下是public.一个类可以实现多个接口。

  43、Java中的异常处理机制的简单原理和应用

  答:当JAVA 程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常。违反语义规则包括2种情况。一种是JAVA类库内置的语义检查。例如数 组下标越界,会引发IndexOutOfBoundsException;访问null的对象时会引发NullPointerException。另一种 情况就是JAVA允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自由选择在何时用throw关键字引发异常。所有的异常都是 java.lang.Thowable的子类。

  44、垃圾回收的优点和原理。并考虑2种回收机制

  答:Java 语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管 理。由于有个垃圾回收机制,Java中的对象不再有”作用域“的概念,只有对象的引用才有”作用域“。垃圾回收可以有效的防止内存泄露,有效的使用可以使 用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能 实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。

  不止所见,见所未见!你所需要的就是我所用所拥有的!!

阿里巴巴面试题java4

  1、面向对象的特征有哪些方面?

  1.抽象:

  抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。

  2.继承:

  继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。

  3.封装:

  封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。

  4. 多态性:

  多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。

  2、String是最基本的数据类型吗?

  基本数据类型包括byte、int、char、long、float、double、boolean和short。

  Java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类

  3、int 和 Integer 有什么区别

  Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。

  原始类型封装类

  booleanBoolean

  CharCharacter

  byteByte

  shortShort

  intInteger

  longLong

  FloatFloat

  doubleDouble

  引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。

  4、String 和StringBuffer的区别

  JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据。

  5、运行时异常与一般异常有何异同?

  异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。

  6、说出Servlet的生命周期,并说出Servlet和CGI的区别。

  servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。

  与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。

  7、说出ArrayList,Vector, LinkedList的存储性能和特性

  ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。

  8、EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别。

  eJB包括Session Bean、Entity Bean、Message Driven Bean,基于JNDI、RMI、JAT等技术实现。

  sessionBean在J2EE应用程序中被用来完成一些服务器端的业务操作,例如访问数据库、调用其他EJB组件。EntityBean被用来代表应用系统中用到的数据。

  对于客户机,SessionBean是一种非持久性对象,它实现某些在服务器上运行的业务逻辑。

  对于客户机,EntityBean是一种持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体。

  session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session Bean ,这两种的 Session Bean都可以将系统逻辑放在 method之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常来说,一个使用者会有一个相对应的 Stateful Session Bean 的实体。Stateless Session Bean 虽然也是逻辑组件,但是他却不负责记录使用者状态,也就是说当使用者呼叫 Stateless Session Bean 的时候,EJB Container 并不会找寻特定的 Stateless Session Bean 的实体来执行这个 method。换言之,很可能数个使用者在执行某个 Stateless Session Bean 的 methods 时,会是同一个 Bean 的 Instance 在执行。从内存方面来看, Stateful Session Bean 与 Stateless Session Bean 比较, Stateful Session Bean 会消耗 J2EE Server 较多的内存,然而 Stateful Session Bean 的优势却在于他可以维持使用者的状态。

  9、Collection 和 Collections的区别。

  Collection是集合类的上级接口,继承与他的接口主要有Set 和List.

  Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

  10、&和&&的区别。

&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。

  11、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算法都大概一样,所以性能不会有很大的差异。

  12、final, finally, finalize的区别。

  Final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。

  Finally是异常处理语句结构的一部分,表示总是执行。

  Finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。

  13、sleep 和 wait() 有什么区别?

  sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。

阿里巴巴面试题java5

  阿里巴巴面试题

  阿里巴巴面试题【1】

  题目的背景如下:

  一晚,李先生在家独自饮酒。突然一个杀手从窗户跳了进来,对李先生说:“李先生!我受人之托,要你小命”

  李先生若无其事地说:“是谁找你杀我?”

“这你不必知道”

“好!我出3倍的价钱买我的命如何?”

  杀手一听,立刻露出了贪婪的目光。

  李先生见有转机,可以缓和气氛,便倒了半杯酒,说:“你也喝杯酒吧,喝完我就给你拿钱”。杀手拿起酒杯一饮而尽。

  李先生接过杀手的酒杯,走到保险柜旁,打开了保险柜,取出钱袋放在桌上,杀手刚伸手去拿,就听“哐”一声,保险柜的门关上了,接着他说:“现在你还敢杀我么?”

  杀手看了看保险柜和李先生的手,又看了看桌子,落荒而逃。

  试问:李先生做了什么让杀手连钱都不拿就立即逃走?

  答案在下方:

  答案:把有杀手唾液和指纹的酒杯放到了保险柜里面,杀手当然就不敢杀人了.

  阿里巴巴面试题集合【2】

  一、String,StringBuffer, StringBuilder 的区别是什么?String为什么是不可变的?

  答: 1、String是字符串常量,StringBuffer和StringBuilder都是字符串变量。后两者的字符内容可变,而前者创建后内容不可变。

  2、String不可变是因为在JDK中String类被声明为一个final类。

  3、StringBuffer是线程安全的,而StringBuilder是非线程安全的。

  ps:线程安全会带来额外的系统开销,所以StringBuilder的效率比StringBuffer高。如果对系统中的线程是否安全很掌握,可用StringBuffer,在线程不安全处加上关键字Synchronize。

  二、Vector,ArrayList, LinkedList的区别是什么?

  答: 1、Vector、ArrayList都是以类似数组的形式存储在内存中,LinkedList则以链表的形式进行存储。

  2、List中的元素有序、允许有重复的元素,Set中的元素无序、不允许有重复元素。

  3、Vector线程同步,ArrayList、LinkedList线程不同步。

  4、LinkedList适合指定位置插入、删除操作,不适合查找;ArrayList、Vector适合查找,不适合指定位置的插入、删除操作。

  5、ArrayList在元素填满容器时会自动扩充容器大小的50%,而Vector则是100%,因此ArrayList更节省空间。

  三、HashTable, HashMap,TreeMap区别?

  答: 1、HashTable线程同步,HashMap非线程同步。

  2、HashTable不允许有空值,HashMap允许有空值。

  3、HashTable使用Enumeration,HashMap使用Iterator。

  4、HashTable中hash数组的默认大小是11,增加方式的old*2+1,HashMap中hash数组的默认大小是16,增长方式一定是2的`指数倍。

  5、TreeMap能够把它保存的记录根据键排序,默认是按升序排序。

  四、Tomcat,Apache,JBoss的区别?

  答: 1、Apache是Http服务器,Tomcat是web服务器,JBoss是应用服务器。

  2、Apache解析静态的html文件;Tomcat可解析jsp动态页面、也可充当servlet容器。

  五、GET,POST区别?

  答: 基础知识:Http的请求格式如下。

  主要包含三个信息:1、请求的类型(GET或POST),2、要访问的资源(如resimga.jif),3、Http版本(http/1.1)

  用来说明服务器要使用的附加信息

  这是Http的规定,必须空一行

  请求的内容数据

  区别:

  1、Get是从服务器端获取数据,Post则是向服务器端发送数据。

  2、在客户端,Get方式通过URL提交数据,在URL地址栏可以看到请求消息,该消息被编码过;Post数据则是放在Html header内提交。

  3、对于Get方式,服务器端用Request.QueryString获取变量的值;对用Post方式,服务器端用Request.Form获取提交的数据值。

  4、Get方式提交的数据最多1024字节,而Post则没有限制。

  5、Get方式提交的参数及参数值会在地址栏显示,不安全,而Post不会,比较安全。

阿里巴巴面试题java6

  阿里巴巴java面试题

  阿里巴巴软件招JAVA高级工程师面试题【1】

  1.两个对象值相同(x.equals(y)==true),但却可有不同的hash code,这句话对不对?为什么?

  2.GC是什么?为什么要有GC?

  3.请简要描述一下J2EE应用中的class loader的层次结构?

  4.写一段代码,实现银行转帐功能:

  接口定义如下:

  public interface ITransfer{

/**

* 银行内部转帐,从转出帐号中扣除转帐金额,给转入帐号增加转帐金额,需要保证以上两个操作

* 要么同时成功,要么同时失败

* fromAccountId 转出帐号

* outAccountId 转入帐号

* amount 转帐金额

**/

  public void transferInner(String fromAccountId,String outAccountId,

  bigDecimal amount);

/**

* 外部转帐-转出,从转出帐号中扣除转帐金额

* fromAccountId 转出帐号

* amount 转帐金额

**/

  public void transferOut(String fromAccountId,BigDecimal amount);

/**

* 外部转帐-转入,给转入帐号增加转帐金额

* toAccountId 转入帐号

* amount 转帐金额

  public void transerIn (String toAccountId, BigDecimal amount);

}

  请编写你的实现类,来实现上述接口

  Account表

  字段:accountId , 主键 varchar2(32), 用户帐号

  字段:amount , 金额 number(18,3)

  5.“组合优于继承”,是否同意这句话,并阐述你的观点。

  6.请说下Template模式与Strategy模式的异同点。

  阿里巴巴面试题 java方向【2】

  一、String,StringBuffer, StringBuilder 的区别是什么?String为什么是不可变的?

  二、VECTOR,ARRAYLIST, LINKEDLIST的'区别是什么?

  三、HASHTABLE, HASGMAQ,TreeMap区别

  四、ConcurrentMap和HashMap的区别

  五、Tomcat,apache,jboss的区别

  六、GET POST区别

  七、SESSION, COOKIE区别

  八、Servlet的生命周期

  九、HTTP 报文包含内容

  十、Statement与PreparedStatement的区别,什么是SQL注入,如何防止SQL注入

  十一、redirect, foward区别

  十二、关于JAVA内存模型,一个对象(两个属性,四个方法)实例化100次,现在内存中的存储状态,

  几个对象,几个属性,几个方法。

  十三、谈谈Hibernate的理解,一级和二级缓存的作用,在项目中Hibernate都是怎么使用缓存的

  十四、反射讲一讲,主要是概念,都在哪需要反射机制,反射的性能,如何优化

  十五、谈谈Hibernate与Ibatis的区别,哪个性能会更高一些

  十六、对Spring的理解,项目中都用什么?怎么用的?对IOC、和AOP的理解及实现原理

  十七、线程同步,并发操作怎么控制

  十八、描述struts的工作流程。

  十九、Tomcat的session处理,如果让你实现一个tomcatserver,如何实现session机制

  二十、关于Cache(Ehcache,Memcached)

  二一、sql的优化相关问题

  二二、oracle中 rownum与rowid的理解,一千条记录我查200到300的记录怎么查?

  二三、如何分析ORACLE的执行计划?

  二四、 DB中索引原理,种类,使用索引的好处和问题是什么?

  二五、JVM垃圾回收实现原理。垃圾回收的线程优先级。

  二六、jvm 最大内存设置。设置的原理。结合垃圾回收讲讲。

阿里巴巴面试题java7

  1. 什么情况下会发生栈内存溢出。

  至于是堆内存溢出还是方法区内存溢出还是栈内存溢出,其实可以用一些工具比如

  JConsole来监视

  2. JVM 的内存结构,Eden 和 Survivor 比例。

  3. jvm 中一次完整的 GC 流程是怎样的,对象如何晋升到老年代,说说你知道的几种主要的 jvm 参数。

  4. 你知道哪几种垃圾收集器,各自的优缺点,重点讲下 cms,包括原理,流程,优缺点

  5. 垃圾回收算法的实现原理。

  6. 当出现了内存溢出,你怎么排错。

  7. JVM 内存模型的相关知识了解多少,比如重排序,内存屏障,happen-before,主内存,工作内存等。

  8. 简单说说你了解的类加载器。

  9. 讲讲 JAVA 的反射机制。

  10. 你们线上应用的 JVM 参数有哪些。

  11. g1 和 cms 区别,吞吐量优先和响应优先的垃圾收集器选择。

  12. 请解释如下 jvm 参数的含义:

-server -Xms512m -Xmx512m -Xss1024K

-XX:PermSize=256m -XX:MaxPermSize=512m -XX:MaxTenuringThreshold=20 XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSInitiatingOccupancyOnly。

/a503921892/article/details/39048889

  Xmx3550m:设置JVM最大可用内存为3550M。

-Xms3550m:设置JVM初始内存为3550m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。

-Xss128k: 设置每个线程的堆栈大小。在相同物理内 存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,

  经验值在3000~5000左右

-XX:MaxPermSize=16m:设置持久代大小为16m

-XX:MaxTenuringThreshold=0:设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。

  如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。

  开源框架知识

  1. 简单讲讲 tomcat 结构,以及其类加载器流程。

  2. tomcat 如何调优,涉及哪些参数。

  3. 讲讲 Spring 加载流程。

  4. 讲讲 Spring 事务的传播属性。

  pROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

  5. Spring 如何管理事务的。

  6. Spring 怎么配置事务(具体说出一些关键的 xml元素)。

  tx:advice,aop:config

  7. 说说你对 Spring 的理解,非单例注入的原理?它的生命周期?循环注入的原理,aop 的实现原理,说说 aop 中的几个术语,它们是怎么相互工作的。

  8. Springmvc 中 DispatcherServlet初始化过程。

  操作系统

  1. Linux 系统下你关注过哪些内核参数,说说你知道的。

  2. Linux 下 IO 模型有几种,各自的含义是什么。

  3. epoll 和 poll 有什么区别。

  4. 平时用到哪些 Linux 命令。

  5. 用一行命令查看文件的最后五行。

  输出test文件的后五行:

  liyi@liyi:~/Desktop > tail -n 5 test

  输出test文件的前五行:

  liyi@liyi:~/Desktop > head -n 5 test

  6. 用一行命令输出正在运行的 java 进程。

  7. 介绍下你理解的操作系统中线程切换过程。

  8. 进程和线程的区别。

  多线程

  1. 多线程的几种实现方式,什么是线程安全。

  2. volatile 的原理,作用,能代替锁么。

  3. 画一个线程的生命周期状态图。

  4. sleep 和 wait 的区别。

  5. Lock 与 Synchronized 的区别。

  6. synchronized 的原理是什么,解释以下名词:重排序,自旋锁,偏向锁,轻量级锁,可重入锁,公平锁,非公平锁,乐观锁,悲观锁。

  7. 用过哪些原子类,他们的原理是什么。

  8. 用过线程池吗,newCache 和 newFixed 有什么区别,他们的原理简单概括下,构造函数的各个参数的含义是什么,比如 coreSize,maxsize 等。

  9. 线程池的关闭方式有几种,各自的区别是什么。

  10. 假如有一个第三方接口,有很多个线程去调用获取数据,现在规定每秒钟最多有 10 个线程同时调用它,如何做到。

  11. spring 的 controller 是单例还是多例,怎么保证并发的安全。

  singleton : bean在每个Spring ioc 容器中只有一个实例。

  prototype:一个bean的定义可以有多个实例。

  request:每次http请求都会创建一个bean,该作用域仅在基于web的Spring ApplicationContext情形下有效。

  12. 用三个线程按顺序循环打印 abc 三个字母,比如 abcabcabc。

  思路:解题思路大概是这样的,开启三个线程,每个线程一次打印一个字母,并且按照一定的顺序打印,当打印A的时候,其他线程处于阻塞状态,打印完A以后,

  将线程解锁,让打印B的那个线程开启,其他线程处于阻塞状态,同理打印C的时候,阻塞其他线程,这三个线程顺序循环,就达到顺序多次打印ABC的目的了。

  这道题看似思路简单,其实主要需要用到wait方法和notify()方法,还有关键字synchronized,只有充分理解了这些,才能解出这道题。下面我有必要讲解一下这两个方法,

  还有关键字synchronized。

  13. ThreadLocal 用过么,用途是什么,原理是什么,用的时候要注意什么。

  14. 如果让你实现一个并发安全的链表,你会怎么做。

  15. 有哪些无锁数据结构,他们实现的原理是什么。

  16. 讲讲 java 同步机制的 wait 和 notify。

  17. 多线程如果线程挂住了怎么办。

  18. countdowlatch 和 cyclicbarrier的内部原理和用法,以及相互之间的差别。

  19. 使用 synchronized 修饰静态方法和非静态方法有什么区别。

  所有的非静态同步方法用的都是同一把锁――实例对象本身,也就是说如果一个实例对象的非静态同步方法获取锁后,

  该实例对象的其他非静态同步方法必须等待获取锁的方法释放锁后才能获取锁,

  可是别的实例对象的非静态同步方法因为跟该实例对象的非静态同步方法用的是不同的锁,

  所以毋须等待该实例对象已获取锁的非静态同步方法释放锁就可以获取他们自己的锁。

  而所有的静态同步方法用的也是同一把锁――类对象本身,这两把锁是两个不同的对象,

  所以静态同步方法与非静态同步方法之间是不会有竞态条件的。但是一旦一个静态同步方法获取锁后,

  其他的静态同步方法都必须等待该方法释放锁后才能获取锁,而不管是同一个实例对象的静态同步方法之间,

  还是不同的实例对象的静态同步方法之间,只要它们同一个类的实例对象!

  20. 简述 ConcurrentLinkedQueue 和 LinkedBlockingQueue 的用处和不同之处。

  21. 导致线程死锁的原因?怎么解除线程死锁。

  22. 非常多个线程(可能是不同机器),相互之间需要等待协调,才能完成某种工作,问怎么设计这种协调方案。

  23. 正确使用 Volatile 变量

  正确使用 volatile 变量的条件

  您只能在有限的一些情形下使用 volatile 变量替代锁。要使 volatile 变量提供理想的线程安全,必须同时满足下面两个条件:

  1对变量的写操作不依赖于当前值。

  2该变量没有包含在具有其他变量的不变式中。

/developerworks/cn/java/j-jtp06197.html

  tCP与HTTP

  1. http1.0 和 http1.1 有什么区别。

  在http1.0中,当建立连接后,客户端发送一个请求,服务器端返回一个信息后就关闭连接,

  当浏览器下次请求的时候又要建立连接,显然这种不断建立连接的方式,会造成很多问题。

  在http1.1中,引入了持续连接的概念,通过这种连接,浏览器可以建立一个连接之后,

  发送请求并得到返回信息,然后继续发送请求再次等到返回信息,也就是说客户端可以连续发送多个请求,而不用等待每一个响应的到来。

  2. TCP 三次握手和四次挥手的流程,为什么断开连接要 4次,如果握手只有两次,会出现什么。

  3. TIME_WAIT 和 CLOSE_WAIT 的区别。

  4. 说说你知道的几种 HTTP 响应码,比如 200, 302, 404。

  5. 当你用浏览器打开一个链接的时候,计算机做了哪些工作步骤。

  6. TCP/IP 如何保证可靠性,说说 TCP 头的结构。

  7. 如何避免浏览器缓存。

  8. 简述 Http 请求 get 和 post 的区别以及数据包格式。

  GET提交,请求的数据会附在URL之后(就是把数据放置在HTTP协议头<request-line>中

  pOST提交:把提交的数据放置在是HTTP包的包体<request-body>中

[java面试题]

阿里巴巴面试题java8

  13)请说一下System.gc()函数的作用。什么时候可以调用垃圾回收器?(瞬联)

  垃圾回收函数,手动调用的.

  当一个对象停止被活动声明所引用,它就变成了垃圾(garbage)可以被回收重新使用

  14)你做过的项目中采用了什么安全认证机制?(IBM)

  15)Math.round()什么作用?

  Math.Round(3.44, 1) = 3.4

  Math.Round(3.45, 1) = 3.4

  Math.Round(3.46, 1) = 3.5

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

  Math.Round(3.54, 1) = 3.5

  Math.Round(3.55, 1) = 3.6

  Math.Round(3.56, 1) = 3.6

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

  Math.Round(3.64, 1) = 3.6

  Math.Round(3.65, 1) = 3.6

  Math.Round(3.66, 1) = 3.7

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

  Math.Round(3.74, 1) = 3.7

  Math.Round(3.75, 1) = 3.8

  Math.Round(3.76, 1) = 3.8

  这种舍入方法叫做银行家舍入(Banker'sRound),这就是已经规定下来的标准、Round的标准、世界的标准。

  round 四舍五入

  16、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。

  以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题。

  package java_example150;

  public class TestThread3{

  private int j;

  public static void main(String[] args){

  testThread3 t = new TestThread3();

  inc inc = t.new Inc();

  dec dec = t.new Dec();

  For(int i=0;i<2;i++){

  thread ts = new Thread(inc);

  ts.start();

  ts= new Thread(dec);

  ts.start();

}

}

  private synchronized void inc(){

  J++;

  system.out.println(Thread.currentThread().getName()+”-inc:“+j);

}

  private synchronized void dec(){

  J--;

  system.out.println(Thread.currentThread().getName()+”-dec:“+j);

}

  Class Inc implements Runnable{

  public void run(){

  For(int i=0;i<10;i++){

  inc();

}

}

}

  Class Dec implements Runnable{

  public void run(){

  For(int i=0;i<10;i++){

  dec();

}

}

}

}

  17.CORBA是什么?用途是什么?

  答:CORBA 标准是公共对象请求代理结构(Common Object Request Broker Architecture),由对象管理组织 (Object Management Group,缩写为 OMG)标准化。它的组成是接口定义语言(IDL), 语言绑定(binding:也译为联编)和允许应用程序间互操作的协议。 其目的为:

  1. 用不同的程序设计语言书写

  2. 在不同的进程中运行

  3. 为不同的操作系统开发

  18.JAVA代码查错

  1.

  Abstract class Name

{

  private String name;

  public abstract boolean isStupidName(String name) {}

}

  答案: 错。abstract method必须以分号结尾,且不带花括号。

  2.

  public class Something

{

  void doSomething ()

{

  private String s = ”“;

  int l = s.length();

}

}

  答案: 错。局部变量前不能放置任何访问修饰符 (private,public,和protected)。final可以用来修饰局部变量

(final如同abstract和strictfp,都是非访问修饰符,strictfp只能修饰class和method而非variable)。

  3.

  Abstract class Something

{

  private abstract String doSomething ();

}

  答案: 错。abstract的methods不能以private修饰。abstract的methods就是让子类implement(实现)具体细节的,怎么可以用private把abstractmethod封锁起来呢? (同理,abstract method前不能加final)。

  4.

  public class Something

{

  public int addOne(final int x)

{

  return ++x;

}

}

  答案: 错。int x被修饰成final,意味着x不能在addOne method中被修改。

  5.

  public class Something

{

  public static void main(String[] args)

{

  Other o = new Other();

  New Something().addOne(o);

}

  public void addOne(final Other o)

{

  O.i++;

}

}

  Class Other

{

  public int i;

}

  答案: 正确。在addOne method中,参数o被修饰成final。如果在addOne method里我们修改了o的reference

(比如: o = new Other();),那么如同上例这题也是错的。但这里修改的是o的member vairable

(成员变量),而o的reference并没有改变。

  6.

  Class Something

{

  int i;

  public void doSomething()

{

  system.out.println(”i = “ + i);

}

}

  答案: 正确。输出的是”i = 0“。int i属於instant variable (实例变量,或叫成员变量)。instant variable有default value。int的default value是0。

  7.

  Class Something

{

  Final int i;

  public void doSomething()

{

  system.out.println(”i = “ + i);

}

}

  答案: 错。final int i 是个final的 instant variable (实例变量,或叫成员变量)。final的instant variable没有default value,必须在constructor (构造器)结束之前被赋予一个明确的值。可以修改为”final int i = 0;“。

  8.

  public class Something

{

  public static void main(String[] args)

{

  something s = new Something();

  system.out.println(”s.doSomething() returns “ + doSomething());

}

  public String doSomething()

{

  return ”Do something ...“;

}

}

  答案: 错。看上去在main里call doSomething没有什么问题,毕竟两个methods都在同一个class里。但仔细看,main是static的。static method不能直接call non-static methods。可改成”System.out.println(“s.doSomething() returns ” + s.doSomething());“。同理,static method不能访问non-static instant variable。

阿里巴巴面试题java9

  三、线程的四种状态

  1. 新状态:线程已被创建但尚未执行(start() 尚未被调用)。

  2. 可执行状态:线程可以执行,虽然不一定正在执行。CPU 时间随时可能被分配给该线程,从而使得它执行。

  3. 死亡状态:正常情况下 run() 返回使得线程死亡。调用 stop()或 destroy() 亦有同样效果,但是不被推荐,前者会产生异常,后者是强制终止,不会释放锁。

  4. 阻塞状态:线程不会被分配 CPU 时间,无法执行。

  四、线程的优先级

  线程的优先级代表该线程的重要程度,当有多个线程同时处于可执行状态并等待获得 CPU 时间时,线程调度系统根据各个线程的优先级来决定给谁分配 CPU 时间,优先级高的线程有更大的机会获得 CPU 时间,优先级低的线程也不是没有机会,只是机会要小一些罢了。

  你可以调用 Thread 类的方法 getPriority() 和 setPriority()来存取线程的优先级,线程的优先级界于1(MIN_PRIORITY)和10(MAX_PRIORITY)之间,缺省是5(NORM_PRIORITY)。

  5)你用过哪种设计模式?(瞬联,IBM,aspenTech)

  设计:design

  模式:pattern

  框架:framework

  创建模式,结构模式和行为模式

  GoF设计模式

  A.创建模式

  设计模式之Factory(工厂模式)

  使用工厂模式就象使用new一样频繁./10/9更新

  设计模式之Prototype(原型模式)

  用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

  设计模式之Builder

  汽车由车轮 方向盘 发动机很多部件组成,同时,将这些部件组装成汽车也是一件复杂的工作,Builder模式就是将这两种情况分开进行。

  设计模式之Singleton(单态模式)

  保证一个类只有一个实例,并提供一个访问它的全局访问点 2002/10/9更新

  b.结构模式

  设计模式之Facade

  可扩展的使用JDBC针对不同的数据库编程,Facade提供了一种灵活的实现.

  设计模式之Proxy

  以Jive为例,剖析代理模式在用户级别授权机制上的应用

  设计模式之Adapter

  使用类再生的两个方式:组合(new)和继承(extends),这个已经在”thinking in java“中提到过.

  设计模式之Composite

  就是将类用树形结构组合成一个单位.你向别人介绍你是某单位,你是单位中的一个元素,别人和你做买卖,相当于和单位做买卖。文章中还对Jive再进行了剖析。

  设计模式之Decorator

  decorator是个油漆工,给你的东东的外表刷上美丽的颜色.

  设计模式之Bridge

  将”牛郎织女“分开(本应在一起,分开他们,形成两个接口),在他们之间搭建一个桥(动态的结合)

  设计模式之Flyweight

  提供Java运行性能,降低小而大量重复的类的开销.

  C.行为模式

  设计模式之Template

  实际上向你介绍了为什么要使用Java 抽象类,该模式原理简单,使用很普遍.

  设计模式之Memento

  很简单一个模式,就是在内存中保留原来数据的拷贝.

  设计模式之Observer

  介绍如何使用Java API提供的现成Observer

  设计模式之Chain of Responsibility

  各司其职的类串成一串,好象击鼓传花,当然如果自己能完成,就不要推委给下一个.

  设计模式之Command

  什么是将行为封装,Command是最好的说明.

  设计模式之State

  状态是编程中经常碰到的实例,将状态对象化,设立状态变换器,便可在状态中轻松切换.

  设计模式之Strategy

  不同算法各自封装,用户端可随意挑选需要的算法.

  设计模式之Mediator

  Mediator很象十字路口的红绿灯,每个车辆只需和红绿灯交互就可以.

  设计模式之Interpreter

  主要用来对语言的分析,应用机会不多.

  设计模式之Visitor

  访问者在进行访问时,完成一系列实质性操作,而且还可以扩展.

  设计模式之Iterator

  这个模式已经被整合入Java的Collection.在大多数场合下无需自己制造一个Iterator,只要将对象装入Collection中,直接使用Iterator进行对象遍历。

  6)请说一下MVC架构(瞬联,IBM,aspenTech)

  Model:模型层

  view:视图层

  Controller:控制层

  MVC (Modal View Controler)本来是存在于Desktop程序中的,M是指数据模型,V是指用户界面,C则是控制器。使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。比如一批统计数据你可以分别用柱状图、饼图来表示。C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新。

  模型-视图-控制器(MVC)是Xerox PARC在八十年代为编程语言Smalltalk-80发明的一种软件设计模式,至今已被广泛使用。最近几年被推荐为Sun公司J2EE平台的设计模式,并且受到越来越多的使用 ColdFusion 和 PHP 的开发者的欢迎。模型-视图-控制器模式是一个有用的工具箱,它有很多好处,但也有一些缺点。

  MVC如何工作

  MVC是一个设计模式,它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务。

  视图

  视图是用户看到并与之交互的界面。对老式的Web应用程序来说,视图就是由HTML元素组成的界面,在新式的Web应用程序中,HTML依旧在视图中扮演着重要的角色,但一些新的技术已层出不穷,它们包括Macromedia Flash和象XHTML,XML/XSL,WML等一些标识语言和Web services.

  如何处理应用程序的界面变得越来越有挑战性。MVC一个大的好处是它能为你的应用程序处理很多不同的视图。在视图中其实没有真正的处理发生,不管这些数据是联机存储的还是一个雇员列表,作为视图来讲,它只是作为一种输出数据并允许用户操纵的方式。

  模型

  模型表示企业数据和业务规则。在MVC的三个部件中,模型拥有最多的处理任务。例如它可能用象EJBs和ColdFusion Components这样的构件对象来处理数据库。被模型返回的数据是中立的,就是说模型与数据格式无关,这样一个模型能为多个视图提供数据。由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。

  控制器

  控制器接受用户的输入并调用模型和视图去完成用户的需求。所以当单击Web页面中的超链接和发送HTML表单时,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后用确定用哪个视图来显示模型处理返回的数据。

  现在我们总结MVC的处理过程,首先控制器接收用户的请求,并决定应该调用哪个模型来进行处理,然后模型用业务逻辑来处理用户的请求并返回数据,最后控制器用相应的视图格式化模型返回的数据,并通过表示层呈现给用户。

  为什么要使用 MVC

  大部分Web应用程序都是用像ASP,PHP,或者CFML这样的过程化语言来创建的。它们将像数据库查询语句这样的数据层代码和像HTML这样的表示层代码混在一起。经验比较丰富的开发者会将数据从表示层分离开来,但这通常不是很容易做到的,它需要精心的计划和不断的尝试。MVC从根本上强制性的将它们分开。尽管构造MVC应用程序需要一些额外的工作,但是它给我们带来的好处是无庸质疑的。

  首先,最重要的一点是多个视图能共享一个模型,正如我所提及的,现在需要用越来越多的方式来访问你的应用程序。对此,其中一个解决之道是使用MVC,无论你的用户想要Flash界面或是 WAP 界面;用一个模型就能处理它们。由于你已经将数据和业务规则从表示层分开,所以你可以最大化的重用你的代码了。

  由于模型返回的数据没有进行格式化,所以同样的构件能被不同界面使用。例如,很多数据可能用HTML来表示,但是它们也有可能要用Macromedia Flash和WAP来表示。模型也有状态管理和数据持久性处理的功能,例如,基于会话的购物车和电子商务过程也能被Flash网站或者无线联网的应用程序所重用。

  因为模型是自包含的,并且与控制器和视图相分离,所以很容易改变你的应用程序的数据层和业务规则。如果你想把你的数据库从MySQL移植到Oracle,或者改变你的基于RDBMS数据源到LDAP,只需改变你的模型即可。一旦你正确的实现了模型,不管你的数据来自数据库或是LDAP服务器,视图将会正确的显示它们。由于运用MVC的应用程序的三个部件是相互对立,改变其中一个不会影响其它两个,所以依据这种设计思想你能构造良好的松偶合的构件。

  对我来说,控制器的也提供了一个好处,就是可以使用控制器来联接不同的模型和视图去完成用户的需求,这样控制器可以为构造应用程序提供强有力的手段。给定一些可重用的模型和视图,控制器可以根据用户的需求选择模型进行处理,然后选择视图将处理结果显示给用户。

  MVC的缺点

  MVC的缺点是由于它没有明确的定义,所以完全理解MVC并不是很容易。使用MVC需要精心的计划,由于它的内部原理比较复杂,所以需要花费一些时间去思考。

  你将不得不花费相当可观的时间去考虑如何将MVC运用到你的应用程序,同时由于模型和视图要严格的分离,这样也给调试应用程序到来了一定的困难。每个构件在使用之前都需要经过彻底的测试。一旦你的构件经过了测试,你就可以毫无顾忌的重用它们了。

  根据我个人经验,由于我们将一个应用程序分成了三个部件,所以使用MVC同时也意味着你将要管理比以前更多的文件,这一点是显而易见的。这样好像我们的工作量增加了,但是请记住这比起它所能带给我们的好处是不值一提。

  MVC并不适合小型甚至中等规模的应用程序,花费大量时间将MVC应用到规模并不是很大的应用程序通常会得不偿失。

  MVC是一条创建软件的好途径

  MVC设计模式是一个很好创建软件的途径,它所提倡的一些原则,像内容和显示互相分离可能比较好理解。但是如果你要隔离模型、视图和控制器的构件,你可能需要重新思考你的应用程序,尤其是应用程序的构架方面。如果你肯接受MVC,并且有能力应付它所带来的额外的工作和复杂性,MVC将会使你的软件在健壮性,代码重用和结构方面上一个新的台阶。

  7)如果类a继承类b,实现接口c,而类b和接口c中定义了同名变量,请问会出现什么问题?(瞬联)

  interface A

{

  int x = 0;

}

  Class B

{

  int x =1;

}

  Class C extends B implements A

{

  public void pX()

{

  system.out.println(x);

}

  public static void main(String[] args) {

  New C().pX();

}

}

  答案:错误。在编译时会发生错误(错误描述不同的JVM有不同的信息,意思就是未明确的x调用,两个x都匹配(就象在同时import java.util和java.sql两个包时直接声明Date一样)。对于父类的变量,可以用super.x来明确(输出的是1),而接口的属性默认隐含为 public static final.所以可以通过A.x来明确(输出的是0)。

  下面的代码运行时会不会报错

  interface Playable

{

  void play();

}

  interface Bounceable

{

  void play();

}

  interface Rollable extends Playable, Bounceable

{

  ball ball = new Ball(”PingPang“);

}

  Class Ball implements Rollable

{

  private String name;

  public String getName()

{

  return name;

}

  public Ball(String name)

{

  this.name = name;

}

  public void play()

{

  ball = new Ball(”Football“);

  system.out.println(ball.getName());

}

}

  答案: 错。”interface Rollable extends Playable, Bounceable“没有问题。interface可继承多个interfaces,所以这里没错。问题出在interface Rollable里的”Ball ball = new Ball(“PingPang”);“。任何在interface里声明的interface variable (接口变量,也可称成员变量),默认为public static final。也就是说”Ball ball = new Ball(“PingPang”);“实际上是”public static final Ball ball = new Ball(“PingPang”);“。在Ball类的Play()方法中,”ball = new Ball(“Football”);“改变了ball的reference,而这里的ball来自Rollable interface,Rollable interface里的ball是public static final的,final的object是不能被改变reference的。因此编译器将在”ball = new Ball(“Football”);“这里显示有错。

  8)请说一下java中为什么要引入内部类?还有匿名内部类?(瞬联,IBM)

  9)请说一下final,finally和finalize的区别?(瞬联)

  Final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。

  Finally是异常处理语句结构的一部分,表示总是执行。

  Finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。

  10)请说一下HTTP请求的基本过程(IBM)

  11)java中存在内存泄漏问题吗?请举例说明?(IBM)

  会

  int i,i2; return (i-i2); //when i为足够大的正数,i2为足够大的负数。结果会造成溢位,导致错误。

  12)请说一下java中的内存回收机制所采用的算法(IBM,瞬联)

  虽然垃圾回收关心着大部分的问题,包括内存管理,使得程序员的任务显得更加轻松,但是程序员还是可能犯些错误导致内存泄漏问题。GC(垃圾回收)通过递归对所有从“根”对象(堆栈中的对象,静态数据成员,JNI句柄等等)继承下来的引用进行工作,然后标记所有可以访问的活动着的对象。而这些对象变成了程序唯一能够操纵的对象,其他的对象都被释放了。因为GC使得程序不能够访问那些被释放的对象,所以这样做是安全的。

阿里巴巴面试题java9篇相关文章: