学习啦>创业指南>职场>面试题>

javaweb常见面试题及参考答案(2)

如英分享

  Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。就HashMap与HashTable主要从三方面来说。

  一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现

  二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的

  三.值:只有HashMap可以让你将空值作为一个表的条目的key或value 求质数的多种优化方式

  答:一般我们求质数时都会去计算小于某一个数N的质数而不会不加限定,现在我们以求小于N的质数来说一说优化方式。在我们求质数的过程中一般会用到两种方法试除法和筛选法两种,现在下来说一下试除法:

  ①.判断小于N的数X是否是质数,就是从2一直尝试到X-1,这种做法效率最差,并不可取----->②如果X是质数,那么它如果不能被小于X/2的数整除即可,这样算法效率提高一些---->③除了2以外,所有的质数都只能是奇数,所以我们可以将数X先试除2,然后尝试从3一直到X/2的所有奇数----->④其实判断一个数是否是质数,只需判断一个数能不能被除了1

  ----->⑤最后,我们可以利用前面求出来的质数来判断,我们只需判断X能不能

  再说筛选法:对于使用筛选法的优化主要是从空间上考虑

  ①定义一个容器,将数据放入容器中,然后遍历其中的数据,将是合数的数据删除,最后剩余的就是质数了------>②我们可以定义一个布尔类型的数组容器,将其中的值都赋值为true,在筛选的过程中将不是质数的数作为数组的下标将对应元素的值改为false,最后取出值为true的元素的下标即可----->③构造定长的byte数组,数组的每个byte存储8个布尔值,这样性能是不是又有了提

  (14) 简述几种排序方式(至少四种,可以从以下各个方面来比较这几种算法,例如从时间复杂度和空间复杂度)

  高呢。冒泡排序:(Bubble Sort)冒泡排序方法是最简单的排序方法。这种方法的基本思想是,将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮。在冒泡排序算法中我们要对这个“气泡”序列处理若干遍。所谓一遍处理,就是自底向上检查一遍这个序列,并时刻注意两个相邻的元素的顺序是否正确。如果发现两个相邻元素的顺序不对,即“轻”的元素在下面,就交换它们的位置。显然,处理一遍之后,“最轻”的元素就浮到了最高位置;处理二遍之后,“次轻”的元素就浮到了次高位置。在作第二遍处理时,由于最高位置上的元素已是“最轻”元素,所以不必检查。一般地,第i遍处理时,不必检查第i高位置以上的元素,因为经过前面i-1遍的处理,它们已正确地排好序。

  插入排序(Insertion Sort)插入排序的基本思想是,经过i-1遍处理后,L[1..i-1]己排好序。第i遍处理仅将L插入L[1..i-1]的适当位置,使得L[1..i]又是排好序的序列。要达到这个目的,我们可以用顺序比较的方法。首

  先比较L和L[i-1],如果L[i-1]≤ L,则L[1..i]已排好序,第i遍处理就结束了;否则交换L与L[i-1]的位置,继续比较L[i-1]和L[i-2],直到找到某一个位置j(1≤j≤i-1),使得L[j] ≤L[j+1]时为止。

  选择排序(Selection Sort)选择排序的基本思想是对待排序的记录序列进行n-1遍的处理,第 i 遍处理是将[i..n]中最小者与位置 i 交换位置。这样,经过 i 遍处理之后,前 i 个记录的位置已经是正确的了。

  快速排序(Quick Sort)快速排序是对冒泡排序的一种本质改进。它的基本思想是通过一趟扫描后,使得排序序列的长度能大幅度地减少。在冒泡排序中,一次扫描只能确保最大数值的数移到正确位置,而待排序序列的长度可能只减少

  1。快速排序通过一趟扫描,就能确保某个数(以它为基准点吧)的左边各数都比它小,右边各数都比它大。然后又用同样的方法处理它左右两边的数,直到基准点的左右只有一个元素为止。

  一、专业知识

  1、a0=1、a1=1、a2=a1+a0、a3=a2+a1,以

  此类推,请写代码用递归算出a30?

  3、简述值类型和引用类型的区别

  值类型包括简单 类型、结构体类型和枚举类型,引用类型包括自定义类、数组、接口、委托等

  他们两在内存中存储的方式不同,值类型以栈的方式存储的,引用类型以堆的方式;前者是真实的存储空间,后者只是存储地址的引用!

  4、简述类中的静态成员和非静态成员的区别

  静态变量使用 static 修饰符进行声明,在类被实例化时创建,通过类进行访问。不带有 static 修饰符声明的变量称做非静态变量,在对象被实例化时创建,通过对象进行访问。一个类的所有实例的同一静态变量都是同一个值,同一个类的不同实例的同一非静态变量可以是不同的值。静态函数的实现里不能使用非静态成员,如非静态变量、非静态函数等。

  5、什么是单例?

  一个类中只有一个实例并且自行化向整个系统提供这个实例叫单例

  下面程序段的输出结果是:

  Void complicatedex(){

  int x=20,y=30;

  boolean b; b=x>50&&y>60||x>50&&y<-6||x<-50&&y>60||x<-50&&y<-60; system.out.println(b);}

  结果为:fasle

  super()和this()的区别

  Super()指父类的无参构造方法,this()指当前类的无参构造方法,两者都必须写在构造方法的第一句

  2、Java中public,private,protected,和默认

  的区别

  a、private修饰词,表示成员是私有的,只有自身可以访问;

  b、protected,表示受保护权限,体现在继承,即子类可以访问父类受保护成员,同时相同包内的其他类也可以访问protected成员。

  c、无修饰词(默认),表示包访问权限(friendly, java语言中是没有friendly这个修饰符的,这样称呼应该是来源于c++ ),同一个包内可以访问,访问权限是包级访问权限;

  d、public修饰词,表示成员是公开的,所有其他类都可以访问;

  3、描述一下java的事件委托机制和垃圾回

  收机制

  java事件委托机制:一个源产生一个事件时,把他送到一个或多个监听器那里,在这种机制种,监听器只是等待,一旦收到事件,处理事件并返回;

  Java垃圾回收:是一种动态存储管理技术,它自动地释放不再被程序引用的对象,按照特定的垃圾收集算法来实现资源自动回收的功能。当一个对象不再被引用的时候,内存回收它占领的空间,以便空间被后来的新对象使用,以免造成内存泄露。

  什么是java序列化,如何事件java序列化 序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。

  public class Cat implements Serializable {}„„

  Try{FileOutputStream fos = new FileOutputStream("catDemo.out"); ObjectOutputStream oos = new ObjectOutputStream(fos);

  System.out.println(" 1> " + cat.getName());

  cat.setName("My Cat");

  oos.writeObject(cat);

  oos.close();

  }catch(Exception e){„ }„„

  overload和overrride的区别。Overloaded

  的方法和是否可以改变返回值类型

  override(重写,覆盖)

  1、方法名、参数、返回值相同。

  2、子类方法不能缩小父类方法的访问权限。

  3、子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。

  4、存在于父类和子类之间。

  5、方法被定义为final不能被重写。

  overload(重载,过载)

  1、参数类型、个数、顺序至少有一个不相同。

  2、不能重载只有返回值不同的方法名。

  3、存在于父类和子类、同类中。

  Overloaded的方法不能改变返回值类型

  final类有什么特点

  该类不能被继承

  写出下面代码的输出结果

  Package test;

  Public class OuterClass{

  Private class InterClass{

  Public InterClass{

  System.out.println(“interClass create”);}}

  Public OuterClass(){

  InterClass ic= new InterClass();

  System.out.println(“outerclass create”);}

  Public static void main(String[] args){

  OuterClass oc=new OuterClass();}}

  输出:

  interClass create

  Outerclass create

  如何格式化日期

  java日期的格式话主要用的是SimpleDateFormat df = new SimpleDateFormat();

  ArrayList Vector LinkedList 的存储性

  能好特性,HashMap和Hashtable的区别

  ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList

  使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。

  1.HashTable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。

  2.HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。

  3.HashTable有一个contains(Object value),功能和containsValue(Object value)功能一样。

  4.HashTable使用Enumeration,HashMap使用Iterator。

  String是基本数据类型吗?

  不是

  多线程有几种实现方式,同步有几种实现方

  式,stop()和suspend()方法为什么不推荐使用

  多线程有两种实现方法,分别是继承Thread类与实现Runnable接口 同步的实现方面有两种,分别是synchronized,wait与notify"

  反对使用stop(),是因为它不安全。它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。结果很难检查出真正的问题所在。suspend()方法容易发生死锁。 调用suspend()的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源,除非被"挂起"的线程恢复 运行。对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成

  死锁。所以不应该使用suspend(),而应在自己的 Thread类中置入一个标志,

  1.请阐述一下你对Java多线程中同步的几

  种使用方式,区别,以及其重要性。

  同步有两种实现方式

  1.同步方法

  2.同步代码块

  多线程的同步时为了能够保证关键数据在单位时间能只能有一个线程操作,保证数据的同步性,安全性

  2.final ,finally , finalize 的区别。

  Final 有最终的不可改变的意思,可以用来修饰基本数据使之成为常

  量,该常量只能在编译期进行修改 。

  当修饰对象时,则该对象引用不能改变,但该对象本身可以做修改。 当修饰方法时,表示该方法在被继承时不能被修改,或覆盖

  当修饰类时,表示该类不会别别的类继承

  Finally 用于在Try-catch-finally语句中 finally 中的代码块时必须执行的

  finalize 当某个对象要被当做垃圾回收时,会调用finalize()方法,该方法用于检查对象不被运行状态的对象引用或间接地引用

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

  Sleep()是线程中的一个方法,该方法用于控制自身线程的流程,当

  执行sleep()方法睡眠时保持对象锁。

  Wait()方法是object类中的一个方法,该方法用于让一个线程处于

  等待状态并释放对象锁,当该线程想要再次执行时需要调用notity

  方法唤醒此线程

  4. abstact 的method是否可同时是static,

  是否可同时是native,是否可同时是synchronized ?

  不可以

  5当一个线程进入一个对象的Synchronized

  方法后,其他线程是否可进入此对象的其他方法

  可以去访问非Synchronized方法。

  6.当一个对象被当做参数传递到一个方法

  后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

  值传递

  7.创建一个class对象有几种方法?分别是

  什么?

  有三种:

  1. Class c=Class.for(“java.lang.String”);

  2. String str=new Stirng();

  Class c=Str.getClass();

  3.Class c=String.Class;

  9.如何获取一个目录下有多少个文件?

  File f=new File(“D://”);

  Int count=f.list().length;

  10.请写出下列代码的输出结果:

  FatherClass Create

  ChildClass Create

  13.当一个对象不再被使用时,如何才能从内

  存中消失?

  将该对象引用值为空

点击下页还有更多>>>javaweb常见面试题及参考答案

1082023