今天去清华参加开心网的笔试,很开心,有同学一起
总结的题目如下:
1.关于线程的创建,同步的实现,以及为啥不推荐使用stop和suspend?
2.如果在使用finilize时出现异常,垃圾回收器会如何?
3.HashMap和TreeMap的区别
Hashtable 与 HashMap类似,但是主要有6点不同。
1.HashTable的方法是同步的,HashMap未经同步,任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力.。所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。
2.HashTable不允许null值,key和value都不可以,HashMap允许null值,key和value都可以。HashMap允许key值只能由一个null值,因为hashmap如果key值相同,新的key, value将替代旧的。
3.HashTable有一个contains(Object value)功能和containsValue(Object value)功能一样。
4.HashTable使用Enumeration,HashMap使用Iterator。
5.HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。
6.哈希值的使用不同,HashTable直接使用对象的hashCode。
TreeMap与 HashMap
TreeMap能够把它保存的记录根据键排序,默认是按升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。
Hashmap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。
如果没有按照关键字顺序提取Map的元素的需求,那么HashMap是更实用的结构。
4.swith的参数
switch中的整形表达式的值必须是int兼容的类型,既可以是byte、short、char和int,以及enum类型。不可以使用浮点型float、double、long,并且各case子句中的c1, c2,...,是int型或字符型常量。
5.public class Test {
static void add(String s){
s="kaixin001";
}
public static void main(String[] args) {
String s="hello";
add(s);
System.out.println(s);
}
}
结果为hello
上午腾讯笔试、下午完美时空笔试:
腾讯:
全是填空选择题,后面有一个选作的编程题。
1.继承,void f方法,子类如何继承,是除了private之外都可以的。
方法继承的时候,不能减少,而且可见性顺序:private<空<protected<public
2.关于socket编程
三步学会Java Socket编程
http://developer.51cto.com/art/200902/108179.htm
http://www.kuqin.com/networkprog/20090221/35953.html
3.大题:使用java写程序完成对字符串的计算,如“4+(4*5-(4+3))”,且小数点后2位数字。
完美时空:
1.(Test)t.greet();一个非静态方法,不创建对象是无法使用的。
2.程序执行结果
class Parent{
void f(){
System.out.print("parent");
}
}
public class Child extends A{
void f(){
System.out.print("child");
}
public static void main(String[] args) throws IOException{
Parent t=new Child();
t.f();
}
}
结果:child
而如果换成Child t=new Parent ();则会出现编译错误
3.进程、作业调度算法
调度算法:
先来先服务法FCFS
短作业优先法SJF
最高响应比优先法HRN
定时轮转法RR(时间片轮转调度算法)是为了多个终端都能得到系统的及时响应。
静态优先数法
解释:
作业周转时间=作业完成时间-作业提交时间
响应比=作业周转时间/作业运行时间=1+作业等待时间/作业运行时间
(1) HRN算法采用下式计算响应比:
等待时间waittime/需要运行的时间requesttime
(2) 高优先权优先算法采用下述公式计算优先权
[优先权priority * 等待时间waittime]/[需要运行时间requesttime * 紧迫程度quick]
当进程处于运行、就绪和等待状态时,只有运行状态的进程才可以优先占有处理机,而其余两种状态的进程并不占有处理机。
作业调度和进程调度的区别:
一个作业从进入系统到最后完成,一般至少要经历两级调度:作业调度和进程调度。
作业调度是宏观上的高级调度,它的主要功能是根据一定的算法,从输入井选中若干个作业,分配必要的资源如主存和外设等,为它们简历初始状态为就绪的作业进程。
进程调度是微观上的低级调度,它的主要功能是根据一定的算法将CPU分派给就绪队列中的一个进程。一般的操作系统都必须有进程调度。
在多道系统中,作业调度与进程调度是相互配合来实现多道作业的并行执行
参考资料:http://wenku.baidu.com/view/f5cd737d27284b73f24250e1.html
http://baike.baidu.com/view/98104.html?tp=3_01
4.聚集索引、非聚集索引的应用场景及区别
聚集索引确定表中数据的物理顺序。聚集索引类似于电话簿。由于聚集索引规定数据在表中的物理存储顺序,因此一个表只能包含一个聚集索引。但该索引可以包含多个列(组合索引),就像电话簿按姓氏和名字进行组织一样。
聚集索引对于那些经常要搜索范围值的列特别有效。使用聚集索引找到包含第一个值的行后,便可以确保包含后续索引值的行在物理相邻。例如,如果应用程序执行的一个查询经常检索某一日期范围内的记录,则使用聚集索引可以迅速找到包含开始日期的行,然后检索表中所有相邻的行,直到到达结束日期。这样有助于提高此类查询的性能。同样,如果对从表中检索的数据进行排序时经常要用到某一列,则可以将该表在该列上聚集(物理排序),避免每次查询该列时都进行排序,从而节省成本。
非聚集索引与课本中的索引类似。数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置。索引中的项目按索引键值的顺序存储,而表中的信息按另一种顺序存储(这可以由聚集索引规定)。如果在表中未创建聚集索引,则无法保证这些行具有任何特定的顺序。
也就是说:聚集是物理排序。而非聚集是不用将表和视图进行物理排序。一个表或视图中最多有250个非聚集排序或有249个非聚集排序一个聚集排序。
参考文献:
http://www.cnblogs.com/flashicp/archive/2007/05/08/739245.html
http://www.javaeye.com/topic/479461
5.写成几种在32位,64位平台下长度不一致的数据类型
6.画出TCP三次握手及关闭时client server各自的状态迁移图
7.链表的插入、删除、查找
今天晚上去北交大霸笔雅虎。题目全是英文,题目的难度属于中等,虽然我还是有很多的题目不会,其实压力好大,看到别的同学都做完了,自己压力很大。好啦,从现在开始保证自己每天至少3个小时的看书时间,如果达不到,则自动放弃所有的活动!!
只记载全部是java的题目:
1.一段小程序的错误之处
try {
FileInputStream fin=new FileInputStream(new File(""));
BufferedReader rd=new BufferedReader(new InputStreamReader(fin));
while(rd.readLine()!=null){
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
最主要的错误可能是后面没有加上那个IOException 吧,我给忘记了具体题目了,那后面是不是可以不用加上close呢
关于异常,可以通过try catch进行处理,其二可以通过在方法上throws ,两种方法有啥区别呢?我试了一下,现在一个比较简单的区别是,try catch之后还可以直接往下处理。但是throws就直接抛出异常了,后面的内容不进行处理。
BufferedReader in=new BufferedReader(new FileReader(""));这句话与前面要实现的读取文件的功能相同。
而且,我还发现了一点,那就是在读取文件的时候,只有出现File,需要抛出FileNotFoundException 异常,在读取如rd.readLine()的时候,需要抛出IOException 异常。但是IOException 是FileNotFoundException 的父类(class FileNotFoundException extends IOException)。
System.in是一个未经处理的InputStream。若希望从System.in读一行文本也就是一个字符串,则需要将System.in包装成BufferedReader 。但是在此之前还需要用InputStreamReader把System.in转换成Reader。
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
2.关于判断两个List是否相等:
条件是:一、如果使用equals相等,则相等,二,如果是Integer、Float、Long,则只要变成int相等则相等。
下面是我给出的答案,说明:
public boolean compare(List a, List b){
int sizea=a.size();
int sizeb=b.size();
//如果二者长度不等,则一定不等
if(sizea!=sizeb){
return false;
}else{
for(int i=0;i<sizea;i++){
if(!a.get(i).equals(b.get(i))){
if(this.getNum(a.get(i))==-1 || this.getNum(a.get(i))!=this.getNum(b.get(i))){
return false;
}
}
}
}
return true;
}
/**
* 获取一个对象的数字,如果是Integer、Float、Double则变成int,否则返回-1
* @param o
* @return
*/
private int getNum(Object o){
int intValue=-1;
String s=o.toString();
try{
intValue=(int)Double.parseDouble(s);
}catch(NumberFormatException e){
intValue=-1;
}
return intValue;
}
在判断数字类型的int是否相等时,本来想单独来运算,但是后面发现有些问题。所以,就统一转换成string来进行转换。且巧妙的是利用了异常来处理,我觉得挺好的 。
判断一个类是否是Integer:a.getClass().equals(Integer.class);
3.不会的两道题
1)0矩阵,判断一个矩阵是否是0矩阵,可通过往这个元素上加某个值,但是在加的时候,要加到其相邻元素上。
2)pe,分到不同的盘子里,每个盘子里面的数量相等,且相同类型的pie在同一个盘子里,要求盘子最多,
例:3个苹果pie,3个梨pie,6个香蕉pie,分到两个盘子里。
3个苹果pie,2个梨pie,6个香蕉pie,只可以分到一个盘子里。
4.关于TCP和UDP。