java面试题(四)

来源:互联网 发布:网络主播直播内容规划 编辑:程序博客网 时间:2024/05/16 08:44

第四部分    核心API


1. 请画出Java集合框架的主要接口和类的继承关系。
解析:集合石非常重要的类型, 也是企业考察员工编程能力时常常关注的知识点。程序员应该熟悉Java集合框架的主要继承关系, 掌握常用集合类的用法和特点


Collection |   Set  ------  HashSet


                    List ------- | ArrayList

LinkedList


Map -------------  HashMap


2. 用简单代码演示创建一个泛型类为Customer类的List对象,并使用增强for循环迭集合。
解析:JDK5以后,集合框架中的接口和类都是泛型类及泛型接口,并可以使用增强for循环迭代集合。程序员需要确认开发平台的JDK版本,如果低于5.0则不能使用这些功能。
参考答案:
 
ArrayList<Customer> list = new ArrayList<Customer>();

for(Customer c : list){

}     


3. 线程之间通信的方法有哪几个?分别起到什么作用?

解析:如果多个线程共享了某些数据,同时线程之间有存在一定的“依赖”关系,即执行某类线程必须依赖另一类的执行结果,如消费者必须等待生产者生产了商品才能消费。这种情况下,线程之间就需要通信。必须在同步代码块中调用线程通信的方法。


参考答案:线程通信的方法有三个,在Object类中定义。①wait方法:使得线程进入等待状态。②notify 方法:随意通知等待池中的某一个线程。③notifyAll 方法:通知等待池中所有线程。



4.     Collection接口和Map接口分别定义了什么集合类型?有什么区别?    
解析:Collection和Map是Java集合框架中两个基本集合类型,要区别不同的集合首先要从Collection和Map开始。

参考答案:Collection接口是传统的集合接口,可以把单个对象存储进来。而Map接口是映射接口,存储的是键值对。


5.    List和Set集合有什么区别?
解析:List和Set是Collection接口的两个子接口,也是使用最多的两种集合类型。程序员应该熟悉这两个接口的基本特征,能够更准确地选择正确的集合类型。

参考答案:List实现了列表类型的集合,List中的元素是有序(ordered)的,每个元素根据放入集合的顺序而对应一个索引值, 可以根据这个索引值返回集合原宿。而Set实现了不重复元素集合,即Set中的元素不能够重复,重复的元素将无法添加到集合中。


6.     List接口有哪几个实现类?分别说明其特征
解析:List是用的较多的集合类型,List是一个接口,具体使用List集合类型时,需要使用时实现类。List接口的每个实现类也都实现了不同的数据结构,各自具有不同的特征,其中最常用的是List实现类。

参考答案:List接口中有以下几个常用实现1 ArrayList:实现了动态数组的特征。
LinkedList: 实现了链表的数据结构,LinkedList也可以用作栈或者队列。
Vector:向量。
ArrayList  Vector类的功能 ArrayList都可以实现,区别在于Vector是现行同步的。


7.     Collectioin 和Collections有什么区别?
解析:很多初级程序员对Collectioni和Collections容易混淆,二者的名字非常类似,本义却大大不同,Collections类与Arrays类非常类似,都是工具类,程序员应该熟悉掌握。

参考答案:Collection是一个接口的名字,定义了集合类型的共同特征。而Collections是一个类的名字,是集合类型的工具类,类中定义了大量的静态方法,能够操作及和对象。


8.     如何将一个Collection转换成数组?
解析:集合和数组有很多共同的地方,二者都是作为数据容器使用, 用来持有数据。数组的长度是固定的,集合的长度却可以动态扩展,数组由于可以直接通过索引操作其元素,所以性能和效率较高。实际应用中,可能使用及合作为临时变量持有数据,却将处理结果转换成数组返回。

参考答案:Collection接口中定义了toArray(T[] a)方法来将集合转换为数组,其中T是泛型类型。

8.1  集合的作用?
集合是可以存储一批类型不同的对象,针对集合的实现类有很多,作用都是一样的,即存储、传输数据,但存储的数据结构不一样,其速度、安全性也不一样。

9.  HashMap和TreeMap在性能上有什么样的差别呢?你比较倾向于使用哪一个?
一个平衡树的性能是O(logn)。Java里的TreeMap用一个红黑树来保证key/value的排序。红黑树是平衡二叉树。保证二叉树的平衡性,使得插入,删除和查找都比较快,时间复杂度都是O(log n)。不过它没有HashMap快,HashMap的时间复杂度是O(1),但是TreeMap的优点在于它里面键值是排过序的,这样就提供了一些其他的很有用的功能。

10.    什么是Iterator?
一些集合类提供了内容遍历的功能,通过java.util.Iterator接口。这些接口允许遍历对象的集合。依次操作每个元素对象。当使用Iterators时,在获得Iterator的时候包含一个集合快照。通常在遍历一个Iterator的时候不建议修改集合本省。

11.   什么是HaspMap和Map?
Map是接口,Java 集合框架中一部分,用于存储键值对,HashMap是用哈希算法实现Map的类

12.   Java集合框架都有哪些最佳实践呢?
根据实际的使用情况选择合适的数据结构,例如固定大小的还是需要增加大小的,有重复元素的还是没有的,需要保持有序还是不需要,遍历是正向的还是双向的,插入是在末尾的还是任意位置的,更多的插入还是更多的读取,是否需要并行访问,是否允许修改,元素类型是相同的还是不同的,等等。另外,还需要尽早考虑多线程,原子性,内存使用量以及性能等因素。
不要假设你的集合里元素的数量一直会保持较小,它也有可能随着时间增长。所以,你的集合最好能够给定一个合适的大小。
针对接口编程优于针对实现编程。例如,可能在某些情况下,LinkedList是最佳的选择,但是后来ArrayList可能因为性能的原因变得更加合适
在取得列表的时候,如果返回的结果是空的话,最好返回一个长度为0的集合或者数组,而不要返回null。因为,返回null的话可能能会导致程序错误。调用你的方法的开发人员可能会忘记对返回为null的情况进行处理。
封装好集合:一般来说,集合都是不可变的对象。所以尽量不要把集合的成员变量暴露给调用者。因为他们的操作一般都不会进行必要的校验。

13.    ArrayList和Vector的区别。 
同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的 .数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半

 14.    ArrayList、Vector、LinkedList的区别?  
 ArrayList、Vector:以线性表的方式存储,查、改快,增删慢    Vector:是线程安全,方法是同步方法  。 
ArrayList:是线程不安全,方法是非同步方法 。
LinkedList:单链表,查、改慢,增删快

15.   Map的接口和特点?

键名+键值,键名不可以重复,键值可以重复,通过键名取键值 
   HashMap:线程不安全   Hasttable:线程安全   jsp中的作用域对象(session、request、application、page)属于map这个体系

16.  Collection及Collections的区别?  
Collection是集合的根   Collections是算法,提供了静态方法,可以对集合进行操作

17.   假设存在文本文件etc.doc,请用代码展示将文件按行读出,并打印输出到控制台。
解析:能够使用java.io包进行文件的输入输出操作是一个程序员必备的技能,使用io中类操作的步骤都基本类似,都需要经历IO选择、创建流对象、进行读写操作、关闭流对象的过程,程序员应该熟悉常用的IO流, 能够根据需要选择适当的IO类。


参考答案: 
File file = new File(“etc.doc”);
try{
     FileReader fr = new FileReader(File);
      BufferedReader br = new BufferedReader(fr);
     String line = br.readLine();
     while(line == null){
          System.out.println(line);
          Line = br.readLine();
     }
}catch(FileNotFoundException e){
     e.printStackTrace();
}catch(IOException e){
      e.printStackTrace();
}


18.使用java语言如何创建线程对象?请列出常用的两种方法。
解析:Java 语言能够支持多线程编程,将线程封装成Thread类型的对象,只要创建Thread类型的对象,就能够便捷地启动线程、执行线程体。程序员首先必须掌握创建线程的常用方法。


参考答案:Java语言中经常使用两种方法创建线程。①创建Thread类的子类,在子类中覆盖Thread类的run方法,实现线程的运行体,只要创建该子类对象就是线程对象。②创建Runable接口的实现类,在实现类中覆盖接口中的run方法,实现线程的运行体。使用Thread(Runable)构造方法可以创建线程对象,参数是Runable接口实现类的实例。


19.关键字synchronized有什么作用?用简单代码展示synchronized的方法。
解析:线程可以共享数据,而共享数据时,可能会因为多个线程并发处理共享数据而导致数据不一致。这种时候,线程同步就费城关键。程序员必须掌握同步的用法,尤其不能随意将代码进行同步,因为同步将降低性能,所以一定不能把不需要同步的代码进行同步,而是只把必须同步的代码进行同步。


参考答案:synchronized可以将某个代码块或者某个方法进行线程同步,被同步的代码块在一个时刻只能被一个线程访问,只有当前线程处理结束后,方能被其他线程访问。例如:
public void run(){
   for(int i=0;i<50;i++){
   synchronized(this){
       System,out,println(Thread.currentThread().getName()+”:x=”+x);
       X++;
    }

}

}

3.    用简单代码演示创建一个泛型类为Customer类的List对象,并使用增强for循环迭集合。
解析:JDK5以后,集合框架中的接口和类都是泛型类及泛型接口,并可以使用增强for循环迭代集合。程序员需要确认开发平台的JDK版本,如果低于5.0则不能使用这些功能。
参考答案:
 
ArrayList<Customer> list = new ArrayList<Customer>();

for(Customer c : list){

}     


4.     线程之间通信的方法有哪几个?分别起到什么作用?

解析:如果多个线程共享了某些数据,同时线程之间有存在一定的“依赖”关系,即执行某类线程必须依赖另一类的执行结果,如消费者必须等待生产者生产了商品才能消费。这种情况下,线程之间就需要通信。必须在同步代码块中调用线程通信的方法。


参考答案:线程通信的方法有三个,在Object类中定义。①wait方法:使得线程进入等待状态。②notify 方法:随意通知等待池中的某一个线程。③notifyAll 方法:通知等待池中所有线程。

0 0