天天看点

新浪微博笔试

1: 有如下一段程序:

    package a.b.c;

    public class Test{

       private static int i=0;

       public int getNext(){

          return i++;

       }

    }

    package a.b.c;

    public class TestB{

       public static void main(String[] args){

           Test test=new Test();

           System.out.println(test.getNext());

           Test testObject=new Test();

           System.out.println(testObject.getNext());

           System.out.println(test.getNext());

       }

    }

    请问最后打印出来的是什么,为什么?

打印出来时0,1,2  

private static 修饰i,就表示开辟一处内存空间供该类的的所有对象共享,且该成员域只能在该类中访问

i与实例无关。i用于存储创建实例的个数,i为类的属性而不是实例的属性,本题中getNext()被调用了两次,而且方法中执行的是i++操作,所以结果分别是0,1,2

2: 有这么一段程序:

    String a=new String("a");

    String b="b";

    String c=a+b;

    StringBuffer strBuf=new StringBuffer();

    strBuf.append("a");

    strBuf.append("b");

    String d=strBuf.toString();

    StringBuilder strBuilder=new StringBuilder();

    strBuilder.append("a");

    strBuilder.append("b");

    String e=strBuilder.toString();

    请问以上程序片段中c、d、e的字符串的创建各有什么不同?

c和e创建过程是一样的. 都是采用了StringBuilder 

d采用了StringBuffer

3: 描叙下final, finally, finalize的区别

final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载

finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。

finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。

4: 现有以下数据表结构,请按要求写出SQL语句

    购物人      商品名称     数量

    A            甲          2

    B            乙          4

    C            丙          1

    A            丁          2

    B            丙          5

    查出所有购入商品为两种或两种以上的购物人记录

select 购物人 as 顾客,count(商品名称) as 商品种类数 from 表 group by 购物人 having count(商品名称)>=2

6: 描叙下TCP协议三次握手过程

在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。

第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

完成三次握手,客户端与服务器开始传送数据,在上述过程中,还有一些重要的概念:

未连接队列:在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN包(syn=j)开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于Syn_RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入ESTABLISHED状态。

Backlog参数:表示未连接队列的最大容纳数目。

SYN-ACK 重传次数 服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。注意,每次重传等待的时间不一定相同。

半连接存活时间:是指半连接队列的条目存活的最长时间,也即服务从收到SYN包到确认这个报文无效的最长时间,该时间值是所有重传请求包的最长等待时间总和。有时我们也称半连接存活时间为Timeout时间、SYN_RECV存活时间。

7: 用java/php/C++实现一个单例模式.

public class Singleton {

private static class SingletonHolder{

private static Singleton instance = new Singleton();

}

private Singleton(){

}

public static  Singleton getInstance(){

return SingletonHolder.instance;

}

}

8: 罗列你知道的排序算法,并注明他们的复杂度

冒泡法: 复杂度为O(n*n)

直接插入排序:O(n*n)

选择排序:O(n*n)

快速排序:平均时间复杂度log2(n)*n

归并排序:log2(n)*n

堆排序:log2(n)*n

9: 用java/php/C++实现快速排序算法

public class QSort {

     public static void QuickSort(int[] pData,int left,int right)

     {

       int i,j;

       int middle,temp;

       i = left;

       j = right;

       middle = pData[left];

       //一趟快速排序

       while(true)

       {

       //从第二个数开始找大于中枢的数

           while((++i)<right-1 && pData[i]<middle);

           //从最后一个数开始找第一个小于中枢的数

           while((--j)>left && pData[j]>middle);

           if(i>=j)

               break;

           //交换两边找到的数

           temp = pData[i];

           pData[i] = pData[j];

           pData[j] = temp;

       }

       //交换中枢

       pData[left] = pData[j];

       pData[j] = middle;

       //递归快排中枢左边的数据

       if(left<j)

         QuickSort(pData,left,j);

       //递归快排中枢右边的数据

       if(right>i)

         QuickSort(pData,i,right);

     }

     public static void main(String[] args){

    int [] pData = new int[10];

        for(int i = 0; i< 10; i++)

             pData[i] = (int)(Math.random()*100);

         for(int i = 0; i<pData.length; i++)

             System.out.print(pData[i]+" ");

             System.out.println("");

         QSort.QuickSort(pData, 0, pData.length);

         System.out.println("/n***********************");

         for(int i = 0; i<pData.length; i++)

             System.out.print(pData[i]+" ");

     }

}

10: 名词解释:HTML5,CSS,STL,MYSQL, B-tree, Fedora

HTML5:HTML5草案的前身名为Web Applications 1.0,於2004年被WHATWG提出,於2007年被W3C接纳,并成立了新的HTML工作团队。HTML标准自1999年12月发布的 HTML 4.01后,后继的HTML 5 和其它标准被束之高阁,为了推动web标准化运动的发展,一些公司联合起来,成立了一个叫做 Web Hypertext Application Technology Working Group (Web 超文本应用技术工作组 - WHATWG) 的组织,他们重新拣起 HTML 5。第一份正式草案已于2008年1月22日公布。HTML 5有两大特点:首先,强化了Web网页的表现性能。其次,追加了本地数据库等Web应用的功能。

CSS(Cascading Style Sheet,可译为“层叠样式表”或“级联样式表”)是一组格式设置规则,用于控制Web页面的外观。通过使用CSS样式设置页面的格式,可将页面的内容与表现形式分离。页面内容存放在HTML文档中,而用于定义表现形式的CSS规则则存放在另一个文件中或HTML文档的某一部分,通常为文件头部分。将内容与表现形式分离,不仅可使维护站点的外观更加容易,而且还可以使HTML文档代码更加简练,缩短浏览器的加载时间。

STL = Standard Template Library,标准模板库,惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。这可能是一个历史上最令人兴奋的工具的最无聊的术语。从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。这里的“容器”和算法的集合指的是世界上很多聪明人很多年的杰作。STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件。STL现在是C++的一部分,因此不用额外安装什么。

MySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司。在2008年1月16号被Sun公司收购。而2009年,SUN又被Oracle收购。对于Mysql的前途,没有任何人抱乐观的态度。目前 MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。

B-tree(多路搜索树,并不是二叉的)是一种常见的数据结构。使用B-tree结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度。按照翻译,B 通常认为是Balance的简称.这个数据结构一般用于数据库的索引,综合效率较高。

Fedora 是一个开放的、创新的、前瞻性的操作系统和平台,基于 Linux。它允许任何人自由地使用、修改和重发布,无论现在还是将来。它由一个强大的社群开发,这个社群的成员以自己的不懈努力,提供并维护自由、开放源码的软件和开放的标准。Fedora 项目由 Fedora 基金会管理和控制,得到了 Red Hat, Inc. 的支持。Fedora 是一个独立的操作系统,是Linux的一个发行版,可运行的体系结构包括 x86(即i386-i686), x86_64 和 PowerPC。

11: 在linux下,需要每天凌晨4:30把 /abc目录下的文件归档并压缩为back20110615.tar.gz,描叙shell实现方式。

由超级用户登录,用crontab执行

继续阅读