java校招面试编程题及答案

时间:2022-10-14 10:02:56 面试笔试 我要投稿

java校招面试编程题及答案

  在现实的学习、工作中,我们最熟悉的就是试题了,借助试题可以为主办方提供考生某方面的知识或技能状况的信息。还在为找参考试题而苦恼吗?以下是小编收集整理的java校招面试编程题及答案,欢迎大家分享。

java校招面试编程题及答案

  java校招面试编程题及答案1

  1.Java集合框架是什么?说出一些集合框架的优点?

  每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector、Stack、HashTable和Array。随着集合的广泛使用,Java1.2提出了囊括所有集合接口、实现和算法的集合框架。在保证线程安全的情况下使用泛型和并发集合类,Java已经经历了很久。它还包括在Java并发包中,阻塞接口以及它们的实现。集合框架的部分优点如下:

  (1)使用核心集合类降低开发成本,而非实现我们自己的集合类。

  (2)随着使用经过严格测试的集合框架类,代码质量会得到提高。

  (3)通过使用JDK附带的集合类,可以降低代码维护成本。

  (4)复用性和可操作性。

  2.集合框架中的泛型有什么优点?

  Java1.5引入了泛型,所有的集合接口和实现都大量地使用它。泛型允许我们为集合提供一个可以容纳的对象类型,因此,如果你添加其它类型的任何元素,它会在编译时报错。这避免了在运行时出现ClassCastException,因为你将会在编译时得到报错信息。泛型也使得代码整洁,我们不需要使用显式转换和instanceOf操作符。它也给运行时带来好处,因为不会产生类型检查的字节码指令。

  3.Java集合框架的基础接口有哪些?

  Collection为集合层级的根接口。一个集合代表一组对象,这些对象即为它的元素。Java平台不提供这个接口任何直接的实现。

  Set是一个不能包含重复元素的集合。这个接口对数学集合抽象进行建模,被用来代表集合,就如一副牌。

  List是一个有序集合,可以包含重复元素。你可以通过它的索引来访问任何元素。List更像长度动态变换的数组。

  Map是一个将key映射到value的对象.一个Map不能包含重复的key:每个key最多只能映射一个value。

  一些其它的接口有Queue、Dequeue、SortedSet、SortedMap和ListIterator。

  4.为何Collection不从Cloneable和Serializable接口继承?

  Collection接口指定一组对象,对象即为它的元素。如何维护这些元素由Collection的具体实现决定。例如,一些如List的Collection实现允许重复的元素,而其它的如Set就不允许。很多Collection实现有一个公有的clone方法。然而,把它放到集合的所有实现中也是没有意义的。这是因为Collection是一个抽象表现。重要的是实现。

  当与具体实现打交道的时候,克隆或序列化的语义和含义才发挥作用。所以,具体实现应该决定如何对它进行克隆或序列化,或它是否可以被克隆或序列化。

  在所有的实现中授权克隆和序列化,最终导致更少的灵活性和更多的限制。特定的实现应该决定它是否可以被克隆和序列化。

  5.为何Map接口不继承Collection接口?

  尽管Map接口和它的实现也是集合框架的一部分,但Map不是集合,集合也不是Map。因此,Map继承Collection毫无意义,反之亦然。

  如果Map继承Collection接口,那么元素去哪儿?Map包含key-value对,它提供抽取key或value列表集合的方法,但是它不适合“一组对象”规范。

  6.Iterator是什么?

  Iterator接口提供遍历任何Collection的接口。我们可以从一个Collection中使用迭代器方法来获取迭代器实例。迭代器取代了Java集合框架中的Enumeration。迭代器允许调用者在迭代过程中移除元素。

  7.Enumeration和Iterator接口的区别?

  Enumeration的速度是Iterator的两倍,也使用更少的内存。Enumeration是非常基础的,也满足了基础的需要。但是,与Enumeration相比,Iterator更加安全,因为当一个集合正在被遍历的时候,它会阻止其它线程去修改集合。

  迭代器取代了Java集合框架中的Enumeration。迭代器允许调用者从集合中移除元素,而Enumeration不能做到。为了使它的功能更加清晰,迭代器方法名已经经过改善。

  8.为何没有像Iterator.add()这样的方法,向集合中添加元素?

  语义不明,已知的是,Iterator的协议不能确保迭代的次序。然而要注意,ListIterator没有提供一个add操作,它要确保迭代的顺序。

  9.为何迭代器没有一个方法可以直接获取下一个元素,而不需要移动游标?

  它可以在当前Iterator的顶层实现,但是它用得很少,如果将它加到接口中,每个继承都要去实现它,这没有意义。

  10.Iterater和ListIterator之间有什么区别?

  (1)我们可以使用Iterator来遍历Set和List集合,而ListIterator只能遍历List。

  (2)Iterator只可以向前遍历,而LIstIterator可以双向遍历。

  (3)ListIterator从Iterator接口继承,然后添加了一些额外的功能,比如添加一个元素、替换一个元素、获取前面或后面元素的索引位置。

  11.遍历一个List有哪些不同的方式?

  ListstrList=new ArrayList<>();

  //使用for-each循环

  for(String obj:strList){

  System.out.println(obj);

  }

  //using iterator

  Iteratorit=strList.iterator();

  while(it.hasNext()){

  String obj=it.next();

  System.out.println(obj);

  }

  使用迭代器更加线程安全,因为它可以确保,在当前遍历的集合元素被更改的时候,它会抛出ConcurrentModificationException。

  12.通过迭代器fail-fast属性,你明白了什么?

  每次我们尝试获取下一个元素的时候,Iterator fail-fast属性检查当前集合结构里的任何改动。如果发现任何改动,它抛出ConcurrentModificationException。Collection中所有Iterator的实现都是按fail-fast来设计的(ConcurrentHashMap和CopyOnWriteArrayList这类并发集合类除外)。

  13.fail-fast与fail-safe有什么区别?

  Iterator的fail-fast属性与当前的集合共同起作用,因此它不会受到集合中任何改动的影响。Java.util包中的所有集合类都被设计为fail-fast的,而java.util.concurrent中的集合类都为fail-safe的。Fail-fast迭代器抛出ConcurrentModificationException,而fail-safe迭代器从不抛出ConcurrentModificationException。

  14.在迭代一个集合的时候,如何避免ConcurrentModificationException?

  在遍历一个集合的时候,我们可以使用并发集合类来避免ConcurrentModificationException,比如使用CopyOnWriteArrayList,而不是ArrayList。

  15.为何Iterator接口没有具体的实现?

  Iterator接口定义了遍历集合的方法,但它的实现则是集合实现类的责任。每个能够返回用于遍历的Iterator的集合类都有它自己的Iterator实现内部类。

  这就允许集合类去选择迭代器是fail-fast还是fail-safe的。比如,ArrayList迭代器是fail-fast的,而CopyOnWriteArrayList迭代器是fail-safe的。

  16.UnsupportedOperationException是什么?

  UnsupportedOperationException是用于表明操作不支持的异常。在JDK类中已被大量运用,在集合框架java.util.Collections.UnmodifiableCollection将会在所有add和remove操作中抛出这个异常。

  17.在Java中,HashMap是如何工作的?

  HashMap在Map.Entry静态内部类实现中存储key-value对。HashMap使用哈希算法,在put和get方法中,它使用hashCode()和equals()方法。当我们通过传递key-value对调用put方法的时候,HashMap使用Key hashCode()和哈希算法来找出存储key-value对的索引。Entry存储在LinkedList中,所以如果存在entry,它使用equals()方法来检查传递的key是否已经存在,如果存在,它会覆盖value,如果不存在,它会创建一个新的entry然后保存。当我们通过传递key调用get方法时,它再次使用hashCode()来找到数组中的索引,然后使用equals()方法找出正确的Entry,然后返回它的值。下面的图片解释了详细内容。

  其它关于HashMap比较重要的问题是容量、负荷系数和阀值调整。HashMap默认的初始容量是32,负荷系数是0.75。阀值是为负荷系数乘以容量,无论何时我们尝试添加一个entry,如果map的大小比阀值大的时候,HashMap会对map的内容进行重新哈希,且使用更大的容量。容量总是2的幂,所以如果你知道你需要存储大量的key-value对,比如缓存从数据库里面拉取的数据,使用正确的容量和负荷系数对HashMap进行初始化是个不错的做法。

  18.hashCode()和equals()方法有何重要性?

  HashMap使用Key对象的hashCode()和equals()方法去决定key-value对的索引。当我们试着从HashMap中获取值的时候,这些方法也会被用到。如果这些方法没有被正确地实现,在这种情况下,两个不同Key也许会产生相同的hashCode()和equals()输出,HashMap将会认为它们是相同的,然后覆盖它们,而非把它们存储到不同的地方。同样的,所有不允许存储重复数据的集合类都使用hashCode()和equals()去查找重复,所以正确实现它们非常重要。equals()和hashCode()的实现应该遵循以下规则:

  (1)如果o1.equals(o2),那么o1.hashCode()==o2.hashCode()总是为true的。

  (2)如果o1.hashCode()==o2.hashCode(),并不意味着o1.equals(o2)会为true。

  19.我们能否使用任何类作为Map的key?

  我们可以使用任何类作为Map的key,然而在使用它们之前,需要考虑以下几点:

  (1)如果类重写了equals()方法,它也应该重写hashCode()方法。

  (2)类的所有实例需要遵循与equals()和hashCode()相关的规则。请参考之前提到的这些规则。

  (3)如果一个类没有使用equals(),你不应该在hashCode()中使用它。

  (4)用户自定义key类的最佳实践是使之为不可变的,这样,hashCode()值可以被缓存起来,拥有更好的性能。不可变的类也可以确保hashCode()和equals()在未来不会改变,这样就会解决与可变相关的问题了。

  比如,我有一个类MyKey,在HashMap中使用它。

  //传递给MyKey的name参数被用于equals()和hashCode()中

  MyKey key=new MyKey('Pankaj');//assume hashCode=1234

  myHashMap.put(key,'Value');

  //以下的代码会改变key的hashCode()和equals()值

  key.setName('Amit');//assume new hashCode=7890

  //下面会返回null,因为HashMap会尝试查找存储同样索引的key,而key已被改变了,匹配失败,返回null

  myHashMap.get(new MyKey('Pankaj'));

  那就是为何String和Integer被作为HashMap的key大量使用。

  20.Map接口提供了哪些不同的集合视图?

  Map接口提供三个集合视图:

  (1)Set keyset():返回map中包含的所有key的一个Set视图。集合是受map支持的,map的变化会在集合中反映出来,反之亦然。当一个迭代器正在遍历一个集合时,若map被修改了(除迭代器自身的移除操作以外),迭代器的结果会变为未定义。集合支持通过Iterator的Remove、Set.remove、removeAll、retainAll和clear操作进行元素移除,从map中移除对应的映射。它不支持add和addAll操作。

  (2)Collection values():返回一个map中包含的所有value的一个Collection视图。这个collection受map支持的,map的变化会在collection中反映出来,反之亦然。当一个迭代器正在遍历一个collection时,若map被修改了(除迭代器自身的移除操作以外),迭代器的结果会变为未定义。集合支持通过Iterator的Remove、Set.remove、removeAll、retainAll和clear操作进行元素移除,从map中移除对应的映射。它不支持add和addAll操作。

  (3)SetentrySet():返回一个map钟包含的所有映射的一个集合视图。这个集合受map支持的,map的变化会在collection中反映出来,反之亦然。当一个迭代器正在遍历一个集合时,若map被修改了(除迭代器自身的移除操作,以及对迭代器返回的entry进行setValue外),迭代器的结果会变为未定义。集合支持通过Iterator的Remove、Set.remove、removeAll、retainAll和clear操作进行元素移除,从map中移除对应的映射。它不支持add和addAll操作。

  21.HashMap和HashTable有何不同?

  (1)HashMap允许key和value为null,而HashTable不允许。

  (2)HashTable是同步的,而HashMap不是。所以HashMap适合单线程环境,HashTable适合多线程环境。

  (3)在Java1.4中引入了LinkedHashMap,HashMap的一个子类,假如你想要遍历顺序,你很容易从HashMap转向LinkedHashMap,但是HashTable不是这样的,它的顺序是不可预知的。

  (4)HashMap提供对key的Set进行遍历,因此它是fail-fast的,但HashTable提供对key的Enumeration进行遍历,它不支持fail-fast。

  (5)HashTable被认为是个遗留的类,如果你寻求在迭代的时候修改Map,你应该使用CocurrentHashMap。

  22.如何决定选用HashMap还是TreeMap?

  对于在Map中插入、删除和定位元素这类操作,HashMap是最好的选择。然而,假如你需要对一个有序的key集合进行遍历,TreeMap是更好的选择。基于你的collection的大小,也许向HashMap中添加元素会更快,将map换为TreeMap进行有序key的遍历。

  23.ArrayList和Vector有何异同点?

  ArrayList和Vector在很多时候都很类似。

  (1)两者都是基于索引的,内部由一个数组支持。

  (2)两者维护插入的顺序,我们可以根据插入顺序来获取元素。

  (3)ArrayList和Vector的迭代器实现都是fail-fast的。

  (4)ArrayList和Vector两者允许null值,也可以使用索引值对元素进行随机访问。

  以下是ArrayList和Vector的不同点。

  (1)Vector是同步的,而ArrayList不是。然而,如果你寻求在迭代的时候对列表进行改变,你应该使用CopyOnWriteArrayList。

  (2)ArrayList比Vector快,它因为有同步,不会过载。

  (3)ArrayList更加通用,因为我们可以使用Collections工具类轻易地获取同步列表和只读列表。

  24.Array和ArrayList有何区别?什么时候更适合用Array?

  Array可以容纳基本类型和对象,而ArrayList只能容纳对象。

  Array是指定大小的,而ArrayList大小是固定的。

  Array没有提供ArrayList那么多功能,比如addAll、removeAll和iterator等。尽管ArrayList明显是更好的选择,但也有些时候Array比较好用。

  (1)如果列表的大小已经指定,大部分情况下是存储和遍历它们。

  (2)对于遍历基本数据类型,尽管Collections使用自动装箱来减轻编码任务,在指定大小的基本类型的列表上工作也会变得很慢。

  (3)如果你要使用多维数组,使用[][]比List<list<>>更容易。

  25.ArrayList和LinkedList有何区别?

  ArrayList和LinkedList两者都实现了List接口,但是它们之间有些不同。

  (1)ArrayList是由Array所支持的基于一个索引的数据结构,所以它提供对元素的随机访问,复杂度为O(1),但LinkedList存储一系列的节点数据,每个节点都与前一个和下一个节点相连接。所以,尽管有使用索引获取元素的方法,内部实现是从起始点开始遍历,遍历到索引的节点然后返回元素,时间复杂度为O(n),比ArrayList要慢。

  (2)与ArrayList相比,在LinkedList中插入、添加和删除一个元素会更快,因为在一个元素插入到中间的时候,不会涉及改变数组的大小,或更新索引。

  (3)LinkedList比ArrayList消耗更多的内存,因为LinkedList中的每个节点存储了前后节点的引用。

  26.哪些集合类提供对元素的随机访问?

  ArrayList、HashMap、TreeMap和HashTable类提供对元素的随机访问。

  27.EnumSet是什么?

  java.util.EnumSet是使用枚举类型的集合实现。当集合创建时,枚举集合中的所有元素必须来自单个指定的枚举类型,可以是显示的或隐示的。EnumSet是不同步的,不允许值为null的元素。它也提供了一些有用的方法,比如copyOf(Collection c)、of(E first,E…rest)和complementOf(EnumSet s)。

  28.哪些集合类是线程安全的?

  Vector、HashTable、Properties和Stack是同步类,所以它们是线程安全的,可以在多线程环境下使用。Java1.5并发API包括一些集合类,允许迭代时修改,因为它们都工作在集合的克隆上,所以它们在多线程环境中是安全的。

  29.并发集合类是什么?

  Java1.5并发包(java.util.concurrent)包含线程安全集合类,允许在迭代时修改集合。迭代器被设计为fail-fast的,会抛出ConcurrentModificationException。一部分类为:CopyOnWriteArrayList、ConcurrentHashMap、CopyOnWriteArraySet。

  30.BlockingQueue是什么?

  Java.util.concurrent.BlockingQueue是一个队列,在进行检索或移除一个元素的时候,它会等待队列变为非空;当在添加一个元素时,它会等待队列中的可用空间。BlockingQueue接口是Java集合框架的一部分,主要用于实现生产者-消费者模式。我们不需要担心等待生产者有可用的空间,或消费者有可用的对象,因为它都在BlockingQueue的实现类中被处理了。Java提供了集中BlockingQueue的实现,比如ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue,、SynchronousQueue等。

  31.队列和栈是什么,列出它们的区别?

  栈和队列两者都被用来预存储数据。java.util.Queue是一个接口,它的实现类在Java并发包中。队列允许先进先出(FIFO)检索元素,但并非总是这样。Deque接口允许从两端检索元素。

  栈与队列很相似,但它允许对元素进行后进先出(LIFO)进行检索。

  Stack是一个扩展自Vector的类,而Queue是一个接口。

  32.Collections类是什么?

  Java.util.Collections是一个工具类仅包含静态方法,它们操作或返回集合。它包含操作集合的多态算法,返回一个由指定集合支持的新集合和其它一些内容。这个类包含集合框架算法的方法,比如折半搜索、排序、混编和逆序等。

  33.Comparable和Comparator接口是什么?

  如果我们想使用Array或Collection的排序方法时,需要在自定义类里实现Java提供Comparable接口。Comparable接口有compareTo(T OBJ)方法,它被排序方法所使用。我们应该重写这个方法,如果“this”对象比传递的对象参数更小、相等或更大时,它返回一个负整数、0或正整数。但是,在大多数实际情况下,我们想根据不同参数进行排序。比如,作为一个CEO,我想对雇员基于薪资进行排序,一个HR想基于年龄对他们进行排序。这就是我们需要使用Comparator接口的情景,因为Comparable.compareTo(Object o)方法实现只能基于一个字段进行排序,我们不能根据对象排序的需要选择字段。Comparator接口的compare(Object o1,Object o2)方法的实现需要传递两个对象参数,若第一个参数比第二个小,返回负整数;若第一个等于第二个,返回0;若第一个比第二个大,返回正整数。

  34.Comparable和Comparator接口有何区别?

  Comparable和Comparator接口被用来对对象集合或者数组进行排序。Comparable接口被用来提供对象的自然排序,我们可以使用它来提供基于单个逻辑的排序。

  Comparator接口被用来提供不同的排序算法,我们可以选择需要使用的Comparator来对给定的对象集合进行排序。

  35.我们如何对一组对象进行排序?

  如果我们需要对一个对象数组进行排序,我们可以使用Arrays.sort()方法。如果我们需要排序一个对象列表,我们可以使用Collection.sort()方法。两个类都有用于自然排序(使用Comparable)或基于标准的排序(使用Comparator)的重载方法sort()。Collections内部使用数组排序方法,所有它们两者都有相同的性能,只是Collections需要花时间将列表转换为数组。

  36.当一个集合被作为参数传递给一个函数时,如何才可以确保函数不能修改它?

  在作为参数传递之前,我们可以使用Collections.unmodifiableCollection(Collection c)方法创建一个只读集合,这将确保改变集合的任何操作都会抛出UnsupportedOperationException。

  37.我们如何从给定集合那里创建一个synchronized的集合?

  我们可以使用Collections.synchronizedCollection(Collection c)根据指定集合来获取一个synchronized(线程安全的)集合。

  38.集合框架里实现的通用算法有哪些?

  Java集合框架提供常用的算法实现,比如排序和搜索。Collections类包含这些方法实现。大部分算法是操作List的,但一部分对所有类型的集合都是可用的。部分算法有排序、搜索、混编、最大最小值。

  39.大写的O是什么?举几个例子?

  大写的O描述的是,就数据结构中的一系列元素而言,一个算法的性能。Collection类就是实际的数据结构,我们通常基于时间、内存和性能,使用大写的O来选择集合实现。比如:例子1:ArrayList的get(index i)是一个常量时间操作,它不依赖list中元素的数量。所以它的性能是O(1)。例子2:一个对于数组或列表的线性搜索的性能是O(n),因为我们需要遍历所有的元素来查找需要的元素。

  java校招面试编程题及答案2

  1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?

  Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。

  Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。

  2.JDK和JRE的区别是什么?

  JRE: Java RuntimeEnvironment

  JDK:Java Development Kit

  JRE顾名思义是java运行时环境,包含了iava虚拟机,java基础类库。是使用iava语言编写的程序运行所需要的软件环境,是提供给想运行java程序的用户使用的。

  JDK顾名思义是java开发工具包,是程序员使用iava语言编写java程序所需的开发工具包,是提供给程序员使用的。JDK包含了JRE,同时还包含了编译java源码的编译器javac,还包含了很多java程序调试和分析的工具:jconsole,jvisualvm等工具软件,还包含了java程序编写所需的文档和demo例子程序。

  如果你需要运行iava程序,只需安装JRE就可以了。如果你需要编写iava程序,需要安装JDK.

  JRE根据不同操作系统(如:windows,linux等)和不同JRE提供商(IBM,ORACLE等)有很多版本

  再说说java的跨平台吧:

  java源程序先经过javac编译器编译成二进制的.class字节码文件(iava的跨平台指的就是.class字节码文件的跨平台,.class字节码文件是与平台无关的),.class文件再运行在jvm上,java解释器(jvm的一部分)会将其解释成对应平台的机器码执行,所以java所谓的跨平台就是在不同平台上安装了不同的jvm,而在不同平台上生成的.class文件都是一样的,而.class文件再由对应平台的jvm解释成对应平台的机器码执行

  最后解释下机器码和字节码的区别:

  一、机器码,完全依附硬件而存在~并且不同硬件由于内嵌指令集不同,即使相同的01代码

  意思也可能是不同的 ~ 换句话说,根本不存在跨平台性 ~ 比如 ~ 不同型号的CPU,你给他个指令10001101,他们可能会解析为不同的结果~

  二、我们知道JAVA是跨平台的,为什么呢?因为他有一个jvm,不论那种硬件,只要你装有jvm,那么他就认识这个JAVA字节码~ ~ ~ ~ 至于底层的机器码,咱不用管,有jvm搞定,他会把字节码再翻译成所在机器认识的机器码~ ~ ~

  3.”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?

  "static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。

  Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,所以概念上不适用。

  java中也不可以覆盖private的方法,因为private修饰的变量和方法只能在当前类中使用,如果是其也的类继承当前类是不能访问到private变量或方法的,当然也不能覆盖。

  4.是否可以在static环境中访问非static变量?

  static变量在Java中是属于类的,它在所有的实例中的值是一样的。当类被Java虚拟机载入的时候会对static变量进行初始化。如果你的代码尝试不用实例来访问非static的变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。

  5.Java支持的数据类型有哪些?什么是自动拆装箱?

  Java语言支持的8种基本数据类型是:

  byte

  short

  int

  long

  float

  double

  boolean

  char

  自动装箱是Java编译器在基本数据类型和对应的对象包装类型之间做的一个转化。比如:把int转化成Integer,double转化成Double,等等。反之就是自动拆箱。

  Java支持的数据类型包括两种:一种是基本数据类型,包含byte,charshort, boolean ,int,long floatdouble:另一种是引用类型:如String等,其实是对象的引用,JVM中虚拟栈中存的是对象的地址,创建的对象实质在堆中,通过地址来找到堆中的对象的过程,即为引用类型。自动装箱就是 Java编译器在基本数据类型和对应的对象包装类型间的转化,即int转化为Integer,自动拆箱是 Integer调用其方法将其转化为int的过程。

  6.Java中的方法覆盖(Overriding)和方法重载(Overload)是什么意思?

  Java中的方法重载发生在同一个类里面两个或者是多个方法的方法名相同但是参数不同的情况。与此相对,方法覆盖是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。覆盖者可能不会限制它所覆盖的方法的访问。

  7.Java中,什么是构造方法?什么是构造方法重载?什么是复制构造方法?

  当新对象被创建的时候,构造方法会被调用。每一个类都有构造方法。在程序员没有给类提供构造方法的情况下,Java编译器会为这个类创建一个默认的构造方法。

  Java中构造方法重载和方法重载很相似。可以为一个类创建多个构造方法。每一个构造方法必须有它自己唯一的参数列表。

  Java不支持像C++中那样的复制构造方法,这个不同点是因为如果你不自己写构造方法的情况下 lava不会创建默认的复制构造方法。

  8.Java支持多继承么?

  Java中类不支持多继承,只支持单继承(即一个类只有一个父类)。 但是java中的接口支持多继承,,即一个子接口可以有多个父接口。(接口的作用是用来扩展对象的功能,一个子接口继承多个父接口,说明子接口扩展了多个功能,当类实现接口时,类就扩展了相应的功能)。

  9.接口和抽象类的区别是什么?

  Java提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:

  接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。类可以实现很多个接口,但是只能继承一个抽象类

  类可以不实现抽象类和接口声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。

  抽象类可以在不提供接口方法实现的情况下实现接口。

  Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。

  Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是 public。

  接口是绝对抽象的,不可以被实例化,抽象类也不可以被实例化

  也可以参考JDK8中抽象类和接口的区别

  10.进程和线程的区别是什么?

  进程是执行着的应用程序,而线程是进程内部的一个执行序列。一个进程可以有多个线程。线程又叫做轻量级进程。

  线程与进程的区别归纳:

  a.地址空间和其它资源:进程间相互独立,同一进程的各线程间共享,某进程内的线程在其它进程不可见。

  b.通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信–需要进程同步和石斥手段的辅助,以保证数据的一致性。

  c.调度和切换:线程上下文切换比进程上下文切换要快得多。

  d.在多线程OS中,进程不是一个可执行的实体。

  11.创建线程有几种不同的方式?你喜欢哪一种?为什么?

  有4种方式可以用来创建线程:

  继承Thread类

  实现Runnable接口

  应用程序可以使用Executor框架来创建线程池

  实现Runnable接口这种方式更受欢迎,因为这不需要继承Thread类。在应用设计中已经继承了别的对象的情况下,这需要多继承(而Java不支持多继承),只能实现接口。同时,线程池也是非常高效的,很容易实现和使用。

  还有一种方式是实现Callable接口

  12.概括的解释下线程的几种可用状态。

  1.新建(new):新创建了一个线程对象。

  2.可运行(runnable):线程对象创建后,其他线程(比如main线程)调用了该对象的start(方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu的使用权。

  3.运行(running):可运行状态(runnable)的线程获得了cpu时间片(timeslice),执行程序代码。

  4.阻塞(block):阻塞状态是指线程因为某种原因放弃了cpu使用权,也即让出了 cpu timeslice暂时停止运行。直到线程进入可运行(runnable)状态,才有机会再次获得cputimeslice 转到运行(running)状态。阻塞的情况分三种:

  (一).等待阻塞:运行(running)的线程执行o.wait(方法,JVM 会把该线程放入等待队列( waitting queue)中。

  (二.同步阻塞:运行(running)的线程在获取对象的同步锁时,若该同步锁 被别的线程占用,则 JVM 会把该线程放入锁池( lock pool )中。

  (三).其他阻塞:运行(running)的线程执行Thread .sleep(long ms)或t.join()方法,或者发出了1/0请求时,JVM会把该线程置为阻塞状态。当sleep(状态超时、join()等待线程终止或者超时、或者1/0处理完毕时,线程重新转入可运行(runnable)状态。

  5.死亡(dead):线程run(、main)方法执行结束,或者因异常退出了run(方法,则该线程结束生命周期。死亡的线程不可再次复生。

  13.同步方法和同步代码块的区别是什么?

  区别:

  同步方法默认用this或者当前类class对象作为锁:

  同步代码块可以选择以什么来加锁,比同步方法要更细颗粒度,我们可以选择只同步会发生同步问题的部分代码而不是整个方法:

  同步方法使用关键字synchronized修饰方法,而同步代码块主要是修饰需要进行同步的代码。用synchronized(object)(代码内容}进行修饰;

  14.在监视器(Monitor)内部,是如何做线程同步的?程序应该做哪种级别的同步?

  监视器和锁在Java虚拟机中是一块使用的。监视器监视一块同步代码块,确保一次只有一个线程执行同步代码块。每一个监视器都和一个对象引用相关联。线程在获取锁之前不允许执行同步代码。

  15.什么是死锁(deadlock)?

  所谓死锁是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。死锁产生的4个必要条件:

  互斥条件:进程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某 资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。

  不剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能 由获得该资源的进程自己来释放(只能是主动释放)。

  请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源 已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。

  循环等待条件:存在一种进程资源的循环等待链,链中每一个进程已获得的资源同时被 链中下

  个进程所请求。

  16.如何确保N个线程可以访问N个资源同时又不导致死锁?

  使用多线程的时候,一种非常简单的避免死锁的方式就是:指定获取锁的顺序,并强制线程按照指定的顺序获取锁。因此,如果所有的线程都是以同样的顺序加锁和释放锁,就不会出现死锁了。

  17.Java集合类框架的基本接口有哪些?

  集合类接口指定了一组叫做元素的对象。集合类接口的每一种具体的实现类都可以选择以它自己的方式对元素进行保存和排序。有的集合类允许重复的键,有些不允许。

  Java集合类提供了一套设计良好的支持对一组对象进行操作的接口和类。Java集合类里面最基本的接口有:

  Collection:代表一组对象,每一个对象都是它的子元素。

  Set:不包含重复元素的Collection.

  List:有顺序的collection,并且可以包含重复元素。

  Map:可以把键(kev)映射到值(value)的对象,键不能重复。

  18.为什么集合类没有实现Cloneable和Serializable接口?

  克隆(cloning)或者是序列化(serialization)的语义和含义是跟具体的实现相关的。因此,应该由集合类的具体实现来决定如何被克隆或者是序列化。

  19.什么是迭代器(lterator)?

  lterator接口提供了很多对集合元素进行选代的方法。每一个集合类都包含了可以返回选代器实例的

  迭代方法。迭代器可以在迭代的过程中删除底层集合的元素,但是不可以直接调用集合的

  remove(Object Obj)删除,可以通过迭代器的remove()方法删除。

  20.lterator和Listlterator的区别是什么?

  下面列出了他们的区别:

  Iterator可用来遍历Set和List集合,但是Listlterator只能用来遍历List。

  Iterator对集合只能是前向遍历,Listlterator既可以前向也可以后向。

  Listlterator实现了lterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。

  21.快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?

  一、快速失败(fail-fast)

  在用选代器遍历一个集合对象时,如果遍历过程中对集合对象的结构进行了修改(增加、删除)。则会抛出Concurrent Modification Exception。

  原理:选代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个modCount变量。集合在被遍历期间如果结构发生变化,就会改变modCount的值。每当迭代器使用hashNext(/next(遍历下一个元素之前,都会检测modCount变量是否为expectedmodCount值,是的话就返回遍历;否则抛出异常,终止遍历。

  注意:这里异常的抛出条件是检测到 modCount!=expectedmodCount 这个条件。如果集合发生变化时修改modCount值刚好又设置为了expectedmodCount值,则异常不会抛出。因此,不能依赖于这个异常是否抛出而进行并发操作的编程,这个异常只建议用于检测并发修改的bug。

  场景:java.util包下的集合类都是快速失败的,不能在多线程下发生并发修改(迭代过程中被修改)。

  二、安全失败(fail-safe)

  采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历。

  原理:由于迭代时是对原集合的拷贝进行遍历,所以在遍历过程中对原集合所作的修改并不能被选代器检测到,所以不会触发Concurrent Modification Exception。

  缺点:基于拷贝内容的优点是避免了Concurrent Modification Exception,但同样地,选代器并不能访问到修改后的内容,即:迭代器遍历的是开始遍历那一刻拿到的集合拷贝,在遍历期间原集合发生的修改迭代器是不知道的。

  场景:java.util.concurrent包下的容器都是安全失败,可以在多线程下并发使用,并发修改。

  22.Java中的HashMap的工作原理是什么?

  Java中的HashMap是以键值对(key-value)的形式存储元素的。HashMap需要一个hash函数,它使用hashCode()和equals(方法来向集合/从集合添加和检索元素。当调用put(方法的时候, HashMap会计算key的hash值,然后把键值对存储在集合中合适的索引上。如果key已经存在了,value会被更新成新值。HashMap的一些重要的特性是它的容量(capacity),负载因子(load

  factor)和扩容极限(threshold resizing)。

  23.hashCode()和equals()方法的重要性体现在什么地方?

  Java中的HashMap使用hashCode()和equals()方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。如果没有正确的实现这两个方法,两个不同的键可能会有相同的hash值,因此,可能会被集合认为是相等的。而且,这两个方法也用来发现重复元素。所以这两个方法的实现对HashMap的精确性和正确性是至关重要的。

  24.HashMap和Hashtable有什么区别?

  HashMap和Hashtable都实现了Map接口,因此很多特性非常相似。但是,他们有以下不同点:

  HashMap允许键和值是null,而Hashtable不允许键或者值是null。

  Hashtable是同步的,而HashMap不是。因此,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。

  HashMap提供了可供应用迭代的键的集合,因此,HashMap是快速失败的。另一方面 Hashtable提供了对键的列举(Enumeration)。

  一般认为Hashtable是一个遗留的类。

  25.数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用Array而不是ArrayList?

  下面列出了Array和ArrayList的不同点:

  Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。

  Array大小是固定的,ArrayList的大小是动态变化的。

  ArrayList提供了更多的方法和特性,比如:addAll0,removeAll0,iterator()等等。

  对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当外理固定大小的基本数据类型的时候,这种方式相对比较慢。

  26.ArrayList和LinkedList有什么区别?

  ArrayList和LinkedList都实现了List接口,他们有以下的不同点:

  ArrayList是基于索引的数据接口,它的底层是数组。它可以以0(1)时间复杂度。对元素进行随机访问。与此对应,LinkedList是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是O(n)。

  相对于ArrayList,LinkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。

  LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。

  也可以参考ArrayList vs. LinkedList。

  27.Comparable和Comparator接口是干什么的?列出它们的区别。

  Java提供了只包含一个compareTo(方法的Comparable接口。这个方法可以个给两个对象排序。具体来说,它返回负数,0,正数来表明已经存在的对象小于,等于,大于输入对象。

  Java提供了包含compare()和equals(两个方法的Comparator接口。compare()方法用来给两个输入参数排序,返回负数,0,正数表明第一个参数是小于,等于,大于第二个参数。equals()方法需要一个对象作为参数,它用来决定输入参数是否和comparator相等。只有当输入参数也是一个 comparator并且输入参数和当前comparator的排序结果是相同的时候,这个方法才返回true。

  28.什么是Java优先级队列(Priority Queue)?

  PriorityQueue是一个基于优先级堆的无界队列,它的元素是按照自然顺序(natural order)排序的。在创建的时候,我们可以给它提供一个负责给元素排序的比较器。PriorityQueue不允许null值,医为他们没有自然顺序,或者说他们没有任何的相关联的比较器。最后,PriorityQueue不是线程安全的,入队和出队的时间复杂度是O(log(n))。

  29.你了解大0符号(big-O notation)么?你能给出不同数据结构的例子么?

  大0符号描述了当数据结构里面的元素增加的时候,算法的规模或者是一个渐进上界。

  大0符号也可用来描述其他的'行为,比如:内存消耗。因为集合类实际上是数据结构,我们一般使用大0符号基于时间,内存和性能来选择最好的实现。大0符号可以对大量数据的性能给出一个很好的说明。

  30.如何权衡是使用无序的数组还是有序的数组?

  有序数组最大的好处在于查找的时间复杂度是O(loq n),而无序数组是O(n)。有序数组的缺点是插入操作的时间复杂度是O(n),因为值大的元素需要往后移动来给新元素腾位置。相反,无序数组的插入时间复杂度是常量O(1)。

  31.Java集合类框架的最佳实践有哪些?

  根据应用的需要正确选择要使用的集合的类型对性能非常重要,比如:假如元素的数量是固定的而且能事先知道,我们就应该用Array而不是ArrayList。

  有些集合类允许指定初始容量。因此,如果我们能估计出存储的元素的数目,我们可以设置初始容量来避免重新计算hash值或者是扩容。

  为了类型安全,可读性和健壮性的原因总是要使用泛型。同时,使用泛型还可以避免运行时的 ClassCastException。

  使用JDK提供的不变类(immutable class)作为Map的键可以避免为我们自己的类实现hashCode(和equals()方法。

  编程的时候接口优于实现。

  底层的集合实际上是空的情况下,返回长度是0的集合或者是数组,不要返回null。

  32.Enumeration接口和lterator接口的区别有哪些?

  Enumeration速度是Iterator的2倍,同时占用更少的内存。但是,lterator远远比Enumeration安全,因为其他线程不能够修改正在被iterator遍历的集合里面的对象。同时,Iterator允许调用者册除底层集合里面的元素,这对Enumeration来说是不可能的。

  33.HashSet和TreeSet有什么区别?

  HashSet是由一个hash表来实现的,因此,它的元素是无序的。add(,remove(),contains()方法的时间复杂度是O(1)。

  另一方面,TreeSet是由一个树形的结构来实现的,它里面的元素是有序的。因此,add(, remove),contains(方法的时间复杂度是O(logn)。

  34.Java中垃圾回收有什么目的?什么时候进行垃圾回收?

  垃圾回收是在内存中存在没有引用的对象或超过作用域的对象时进行。

  垃圾回收的目的是识别并且丢弃应用不再使用的对象来释放和重用资源。

  35.System.gc()和Runtime.gc()会做什么事情?

  这两个方法日来提示VV要进行垃圾口收。但是,立即开始还是处识进行垃圾口收是取决于V

  的。

  36.finalize(方法什么时候被调用?析构函数(finalization)的目的是什么?

  垃圾回收器(garbage collector)决定回收某对象时,就会运行该对象的finalize()方法但是在Java中很不幸,如果内存总是充足的,那么垃圾回收可能永远不会进行,也就是说filalize()可能永远不被执行,显然指望它做收尾工作是靠不住的。那么finalize()究竟是做什么的呢?它最主要的用途是回收特殊渠道申请的内存。Java程序有垃圾回收器,所以一般情况下内存问题不用程序员操心。但有一种JNI(Java Native Interface)调用non-Java程序(C或C++),finalize()的工作就是回收这部分的内存。

  37.如果对象的引用被置为null,垃圾收集器是否会立即释放对象占用的内存?

  不会,在下一个垃圾回收周期中,这个对象将是可被回收的。

  38.Java堆的结构是什么样子的?什么是堆中的永久代(Perm Gen space)?

  JVM的堆是运行时数据区,所有类的实例和数组都是在堆上分配内存。它在JVM启动的时候被创建。对象所占的堆内存是由自动内存管理系统也就是垃圾收集器回收。

  堆内存是由存活和死亡的对象组成的。存活的对象是应用可以访问的,不会被垃圾回收。死亡的对象是应用不可访问尚且还没有被垃圾收集器回收掉的对象。一直到垃圾收集器把这些对象回收掉之前,他们会一直占据堆内存空间。

  永久代是用于存放静态文件,如Java类、方法等,持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类,永久代中一般包含:

  类的方法(字节码…)

  类名(Sring对象)

  class文件读到的常量信息

  class对象相关的对象列表和类型列表(e.g.方法对象的array)

  JVM创建的内部对象

  JIT编译器优化用的信息

  39.串行(serial)收集器和吞吐量(throughput)收集器的区别是什么?

  吞吐量收集器使用并行版本的新生代垃圾收集器,它用于中等规模和大规模数据的应用程序。而申行收集器对大多数的小应用(在现代处理器上需要大概100M左右的内存)就足够了。

  40.在Java中,对象什么时候可以被垃圾回收?

  当对象对当前使用这个对象的应用程序变得不可触及的时候,这个对象就可以被回收了。

  41.JVM的永久代中会发生垃圾回收么?

  会,如果永久代满了或者是超过了临界值,会触发完全垃圾回收(Full GC)。如果你仔细查看垃圾收集器的输出信息,就会发现永久代也是被回收的。这就是为什么正确的永久代大小对避免Full GC是非常重要的原因。请参考下Java8:从永久代到元数据区

  (注:Java8中已经移除了永久代,新加了一个叫做元数据区的native内存区)

  42.Java中的两种异常类型是什么?他们有什么区别?

  Java中有两种异常:受检查的(checked)异常和不受检查的(unchecked)异常。不受检查的异常不需要在方法或者是构造函数上声明,就算方法或者是构造承数的执行可能会抛出这样的异常,并且不受检查的异常可以传播到方法或者是构造函数的外面。相反,受检查的异常必须要用throws语句在方法或者是构造函数上声明。这里有Java异常处理的一些小建议。

  43.Java中Exception和Error有什么区别?

  Exception和Error都是Throwable的子类。Exception用于用户程序可以捕获的异常情况。Error定义了不期望被用户程序捕获的异常。

  44.throw和throws有什么区别?

  1、Throw用于方法内部,Throws用于方法声明上

  2、Throw后跟异常对象,Throws后跟异常类型

  3、Throw后只能跟一个异常对象,Throws后可以一次声明多种异常类型

  45.异常处理完成以后,Exception对象会发生什么变化?

  Exception对象会在下一个垃圾回收过程中被回收掉。

  46.finally代码块和finalize()方法有什么区别?

  无论是否抛出异常,finally代码块都会执行,它主要是用来释放应用占用的资源。finalize()方法是 Object类的一个protected方法,它是在对象被垃圾回收之前由Java虚拟机来调用的。

  47.什么是Applet?

  java applet是能够被包含在HTML页面中并且能被启用了java的客户端浏览器执行的程序。Applet主要用来创建动态交互的web应用程序。

  48.解释一下Applet的生命周期

  applet可以经历下面的状态:

  Init:每次被载入的时候都会被初始化。

  Start:开始执行applet。

  Stop:结束执行applet。

  Destroy:卸载applet之前,做最后的清理工作。

  49.当applet被载入的时候会发生什么?

  首先,创建applet控制类的实例,然后初始化applet,最后开始运行。

  50.Applet和普通的Java应用程序有什么区别?

  applet是运行在启用了java的浏览器中,Java应用程序是可以在浏览器之外运行的独立的Java程序。但是,它们都需要有Java虚拟机。

  进一步来说,Java应用程序需要一个有特定方法签名的main函数来开始执行。Java applet不需要这样的函数来开始执行。

  最后,Java applet一般会使用很严格的安全策略,Java应用一般使用比较宽松的安全策略。

  51.Java applet有哪些限制条件?

  主要是由于安全的原因,给applet施加了以下的限制:

  applet不能够载入类库或者定义本地方法。

  applet不能在宿主机上读写文件。

  applet不能读取特定的系统属性。

  applet不能发起网络连接,除非是跟宿主机。

  applet不能够开启宿主机上其他任何的程序。

  52.什么是不受信任的applet?

  不受信任的applet是不能访问或是执行本地系统文件的Java applet,默认情况下,所有下载的 applet都是不受信任的。

  53.从网络上加载的applet和从本地文件系统加载的applet有什么区别?

  当applet是从网络上加载的时候,applet是由applet类加载器载入的,它受applet安全管理器的限制。

  当applet是从客户端的本地磁盘载入的时候,applet是由文件系统加载器载入的。

  从文件系统载入的applet允许在客户端读文件,写文件,加载类库,并且也允许执行其他程序,但是,却通不过字节码校验。

  54.applet类加载器是什么?它会做哪些工作?

  当applet是从网络上加载的时候,它是由applet类加载器载入的。类加载器有自己的iava名称空间等级结构。类加载器会保证来自文件系统的类有唯一的名称空间,来自网络资源的类有唯一的名称空间。

  当浏览器通过网络载入applet的时候,applet的类被放置于和applet的源相关联的私有的名称空间中。然后,那些被类加载器载入进来的类都是通过了验证器验证的。验证器会检查类文件格式是否遵守Java语言规范,确保不会出现堆栈溢出(stackoverflow)或者下溢(underflow),传递给字节码指令的参数是正确的。

  55.applet安全管理器是什么?它会做哪些工作?

  applet安全管理器是给applet施加限制条件的一种机制。浏览器可以只有一个安全管理器。安全管理器在启动的时候被创建,之后不能被替换覆盖或者是扩展。

  56.弹出式选择菜单(Choice)和列表(List)有什么区别

  Choice是以一种紧凑的形式展示的,需要下拉才能看到所有的选项。Choice中一次只能选中一个选项。List同时可以有多个元素可见,支持选中一个或者多个元素。

  57.什么是布局管理器?

  布局管理器用来在容器中组织组件。

  58滚动条(Scrollbar)和滚动面板(JScrollPane)有什么区别?

  Scrollbar是一个组件,不是容器。而ScrollPane是容器。ScrollPane自己处理滚动事件。

  59.哪些Swing的方法是线程安全的?

  只有3个线程安全的方法:repaint(,revalidate(,and invalidate()。

  60.说出三种支持重绘(painting)的组件。

  Canvas,Frame,Panel,和Applet支持重绘。

  61.什么是裁剪(clipping)?

  限制在一个给定的区域或者形状的绘图操作叫做裁剪。

  62.Menultem和CheckboxMenultem的区别是什么?

  CheckboxMenultem类继承自Menultem类,支持菜单选项可以选中或者不选中。

  63.边缘布局(BorderLayout)里面的元素是如何布局的?

  BorderLayout里面的元素是按照容器的东西南北中进行布局的。

  64.网格包布局(GridBagLayout)里面的元素是如何布局的?

  GridBagLayout里面的元素是按照网格进行布局的。不同大小的元素可能会占据网格的多于1行或一列。因此,行数和列数可以有不同的大小。

  65.Window和Frame有什么区别?

  Frame类继承了Window类,它定义了一个可以有菜单栏的主应用窗口。

  66.裁剪(clipping)和重绘(repainting)有什么联系?

  当窗口被AWT重绘线程进行重绘的时候,它会把裁剪区域设置成需要重绘的窗口的区域

  67.事件监听接口(event-listener interface)和事件适配器(event-adapter)有什么关系?

  事件监听接口定义了对特定的事件,事件外理器a必须要实现的方法,事件适配器给事件监听接口提供了默认的实现。

  68.GUI组件如何来处理它自己的事件?

  GUI组件可以处理它自己的事件,只要它实现相对应的事件监听接口,并且把自己作为事件监听。

  69.Java的布局管理器比传统的窗口系统有哪些优势?

  Java使用布局管理器以一种一致的方式在所有的窗口平台上摆放组件。因为布局管理器不会和组件的绝对大小和位置相绑定,所以他们能够适应跨窗口系统的特定平台的不同。

  70.Java的Swing组件使用了哪种设计模式?

  Java中的Swing组件使用了MVC(模型视图-控制器)设计模式。

【java校招面试编程题及答案】相关文章:

校招面试编程题04-05

恒生电子校招编程面试技巧04-05

JAVA面试真题及答案分享03-15

校招面试怎么准备04-04

华为校招面试流程04-04

比亚迪校招面试经验04-05

中兴校招面试经验04-05

2016银行校招半结构化面试真题04-03

java面试题及答案03-29