1.使用Java输出10个不重复的数字,数字范围在1-100之间。
解答:刚看到这道题时我反复思考的是“不重复”这3个字,我想到了Set集合保存的是不重复的数据,然后写了些。面试官看了之后说我写的有问题,让我再写写看。于是我又想了想,重写了一份,面试官看了之后勉强满意。回来我把我写的code在Eclipse运行了一下,发现代码赘余,经过修改后,代码如下,有更简单的或者别的思路的欢迎告知。
[java] view plaincopyprint?
package com.ldfsoft.test;
import java.util.HashSet;
import java.util.Set;
public class RandomTest {
public static void main(String[] args) {
numTest();
}
static void numTest(){
Set set= new HashSet();
for(int i=0;i<10;i++){
while(true){
int num=(int) (Math.random()*100);
if(!set.contains(num)){
System.out.println(num);
set.add(num);
break;
}
}
}
}
}
2.Java中HashMap,TreeMap,LinkedHashMap的区别。
解答:HashMap与TreeMap我倒是知道,LinkedHashMap我还是第一次听说,只能空着。本人顺便提一下HashTable,这个也面试的较多。查询网上资料,区别如下所示:
java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMapHashtable LinkedHashMap 和TreeMap
Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复。
Hashmap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。HashMap最多只允许一条记录的键为Null,允许多条记录的值为 Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。
Hashtable与 HashMap类似,它继承自Dictionary类,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了 Hashtable在写入时会比较慢。
LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。
TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。
一般情况下,我们用的最多的是HashMap,HashMap里面存入的键值对在取出的时候是随机的,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。在Map 中插入、删除和定位元素,HashMap 是最好的选择。
TreeMap取出来的是排序后的键值对。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。
LinkedHashMap 是HashMap的一个子类,如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现,它还可以按读取顺序来排列,像连接池中可以应用。以下代码实例可以看出HashMap,LinkedHashMap,TreeMap的区别:
[java] view plaincopyprint?
package com.ldfsoft.test;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TreeMap;
public class Ceshi{
@SuppressWarnings(“unchecked”)
public static void main(String[] args) {
//HashMap
System.out.println(“——HashMap无序输出——“);
HashMap hsMap=new HashMap();
hsMap.put(“3″,”Value3”);
hsMap.put(“1″,”Value1”);
hsMap.put(“2″,”Value2”);
hsMap.put(“b”,”ValueB”);
hsMap.put(“a”,”ValueA”);
Iterator it = hsMap.entrySet().iterator();
while (it.hasNext()) {
Map.Entry e = (Map.Entry) it.next();
System.out.println(“Key: ” +e.getKey() + “–Value: “
+ e.getValue());
}
//TreeMap
System.out.println(“——TreeMap按Key排序输出——“);
TreeMap teMap=new TreeMap();
teMap.put(“3″,”Value3”);
teMap.put(“1″,”Value1”);
teMap.put(“2″,”Value2”);
teMap.put(“b”,”ValueB”);
teMap.put(“a”,”ValueA”);
Iterator tit = teMap.entrySet().iterator();
while (tit.hasNext()) {
Map.Entry e = (Map.Entry) tit.next();
System.out.println(“Key: ” +e.getKey() + “–Value: “
+ e.getValue());
}
//LinkedHashMap
System.out.println(“–LinkedHashMap根据输入的顺序输出–“);
LinkedHashMap lhsMap=new LinkedHashMap();
lhsMap.put(“3″,”Value3”);
lhsMap.put(“1″,”Value1”);
lhsMap.put(“2″,”Value2”);
lhsMap.put(“b”,”ValueB”);
lhsMap.put(“a”,”ValueA”);
Iterator lit =lhsMap.entrySet().iterator();
while (lit.hasNext()) {
Map.Entry e = (Map.Entry) lit.next();
System.out.println(“Key: ” +e.getKey() + “–Value: “
+ e.getValue());
}
}
}
3. XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?
解答xml两种形式 dtd schema,他们的本质区别:schema本身是xml的,可以被XML解析器解析(这也是从DTD上发展schema的根本目的),c:有DOM,SAX,STAX等
DOM:处理大型文件时其性能下降的非常厉害。这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问
SAX:不现于DOM,SAX是事件驱动型的XML解析方式。它顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问
STAX:Streaming API for XML (StAX)
4. 写一个Singleton出来。
解答: Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。
一般Singleton模式通常有几种种形式:
第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。
[java] view plaincopyprint?
public class Singleton {
private Singleton(){}
//在自己内部定义自己一个实例,是不是很奇怪?
//注意这是private 只供内部调用
private static Singleton instance = newSingleton();
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance(){
return instance;
}
}
第二种形式:
[java] view plaincopyprint?
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
//这个方法比上面有所改进,不用每次都进行生成对象,只是第一次
//使用时生成实例,提高了效率!
if (instance==null)
instance=new Singleton();
return instance; }
}
其他形式: 定义一个类,它的构造函数为private的,所有方法为static的。
一般认为第一种形式要更加安全些