校级

来源:互联网 发布:淘宝网如何盈利模式 编辑:程序博客网 时间:2024/06/15 03:02

今天参加了一家公司的面试,算法打的不是很好笔试都没有通过就回来了。心情不是很好但还是想先把东西先整理出来。


笔试题2017.10.10份

1.1字节等于多少位?分别写出:char、int、long、double各占用多少个byte?

答:1byte等于8bit。在java中byte占1个字节、char占2个字节、short占2个字节、int占4个字节、long占8个字节、float占4个字节。double占8个字节

(在进行类型转换时:以下顺序可以自动转换byte、char、short、int、long、float、double)

----------------------------------------------------------------------------------------------------------------------

2.解释什么是继承、多态?如何实现多态?

答:

继承:多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。多个类可以称为子类,单独这个类称为父类超类或者基类。子类可以直接访问父类中的非私有的属性和行为。通过 extends 关键字让类与类之间产生继承关系。

多态:对象在不同时刻表现出来的不同状态。

如何实现多态:要有继承或者实现关系、要有方法重写、要有父类引用指向子类对象。

--------------------------------------------------------------------------------------

3.类方法的重写和重载分别是什么意思?

 重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。

  重写Override表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。

--------------------------------------------------------------------------------------

4.什么是堆、栈、队列?分别有什么特点?如何用两个栈实现一个队列?

堆:堆是一个运行时数据区,通过new等指令创建,不需要程序代码显式释放。

栈:它是一种先进后出(FILO)的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

队列:是一种先进先出的线性表。其限制仅在表的一端(尾端)进行插入,另一端(首端)进行删除的线性表

如何用两个栈实现一个队列:

    Stack<Integer> stack1 = newStack<Integer>();
    Stack<Integer> stack2 = newStack<Integer>();
     
    publicvoid push(intnode) {
        stack1.push(node);
    }
     
    publicint pop() {
        while(!stack1.isEmpty()){
            stack2.push(stack1.pop());
        }
        intnode = stack2.pop();
        while(!stack2.isEmpty()){
            stack1.push(stack2.pop());
        }
        returnnode;
    }
----------------------------------------------------------------------------------------------

5.&和&&的区别,==和equals的区别

&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。

1、基本数据类型比较
==和Equals都比较两个值是否相等。相等为true 否则为false;
2、引用对象比较
==和Equals都是比较栈内存中的地址是否相等 。相等为true 否则为false;

----------------------------------------------------------------------------------------------‘

6解释ArrayList和LinkedList、HashMap和HashTable的区别?

ArrayList 使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。

1)HashMap 没有排序,允许一个null键和多个null,Hashtable不允许;

2)HashMap Hashtablecontains方法去掉了,改成containsvaluecontainsKey,因为contains方法容易让人引起误解;

3)Hashtable 继承自Dictionary类,HashMapJava1.2引进的Map接口的实现;

4)Hashtable 的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap就必须为之提供外同步。HashtableHashMap采用的hash/rehash算法大致一样,所以性能不会有很大的差异。

---------------------------------------------------------------------------------------------------------------------------------------------

7.排序都有哪几种方法?请列举并说明算法思想。

最主要的是冒泡排序、选择排序、插入排序以及快速排序
算法思想后续补充

----------------------------------------------------------------------------------------------------------------------------------------------

8.多线程的几种实现方式,都是什么?同步有几种实现方式,都什么?

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

-----------------------------------------------------------------------------------------------

9常见的设计模式有哪些?分别有什么作用?

Abstract Factory:这个是"抽象工厂模式",用于提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类.

Adapter:适配器模式,根据字面意思很好理解.将每一个类的接口转换成客户希望的另外一个接口.Adapter使得原本接口不兼容而不能一起工作的那些类可以一起工作.

Bridge:桥梁模式,将抽象部分与它的实现部分分离,使他们都可以独立地变化.

Builder:建筑者模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.

Chain of Responsibility:职责链模式,为解除请求的发送者和接收者之间耦合,而使用多个对象都有机会处理这个请求.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它.

Command:命令模式,将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消操作.

Composite:组合模式,将对象组合成树形结构以表示"部分-整体"的层次结构.Composite使得客户对单个对象和复合对象的使用具有一致性.

Decorator:装饰模式,动态的给一个对象添加一些额外的职责.就扩展性而言,Decorator模式比生成子类方式更为灵活.

Facade:外观模式,为系统中的一组接口提供一个一致的界面,facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.

Factory Method:工厂方法模式,定义一个用于创建对象接口,让子类决定将哪一个类实例化.Factory Method使一个类的实例化延迟到其子类.

Flyweight:享元模式,运用共享技术有效地支持大量细粒度的对象.

Interpreter:解释器模式,给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子.解释器模式需要解决的是,如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。比如正则表达式.

Iterator:迭代器模式,提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该对象的内部表示.

Mediator:中介模式,用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

Memento:备忘录模式,在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。

Observer:观察者模式,定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。

Prototype:原型模式,用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。

Proxy:代理模式,为其他对象提供一个代理以控制对这个对象的访问。

Singleton:单例模式,保证一个类仅有一个实例,并提供一个访问它的全局访问点。 

State:状态模式,允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类.

Strategy:策略模式,:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法的变化可独立于使用它的客户。

Template Method:模板方法模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

Visitor:访问者模式,表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

---------------------------------------------------------------------------------------------------------------------------------------------

10.TCP与UDP协议的区别?HTTP是基于哪一个?HTTP中的GET和POST请求有什么区别?

TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。 
UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快
虽然HTTP本身是一个协议,但其最终还是基于TCP的


1Get是用来从服务器上获得数据,而Post是用来向服务器上传递数据;

2Get将表单中数据按照variable=value的形式,添加到action所指向的URL后面,并且两者使用“?”连接,而各个变量之间使用“&”连接;Post是将表单中的数据放在form的数据体中,按照变量和值相对应的方式,传递到action所指向URL

3Get是不安全的,因为在传输过程,数据被放在请求的URL中;Post的所有操作对用户来说都是不可见的;

4Get传输的数据量小,这主要是因为受URL长度限制;而Post可以传输大量的数据,所以在上传文件只能使用Post

5Get限制Form表单的数据集必须为ASCII字符,而Post支持整个ISO10646字符集;

6GetForm的默认方法。

------------------------------------------------------------------------------------------------------------------------------------------------------

编程题

1使用递归实现数字n的阶乘n!

public intdemo(int n){

  if(n<0){

System.out.println("无效数字");

return 0;

}else if(n==1||n==0){

return 1;

}

return n*demo(n-1);

}

--------------------------------------------------------------------------------------------------------------------

2.有数组a[]={1,2,3,4,5,6,7,8} 编写程序使用“二分查找法”找到数字x的位置。

(注:二分法必须是有序的)

int  Lookup(int find,int array[],int low,int high)
{
if (low > high)
return -1;//表示未找到元素
int mid = (low + high)/2
if (array[mid] == find)
return mid;//找到元素,元素的位置为mid
if (array[mid] > find)//如果大于要找的值则在下半区间继续找
return Lookup(find,array,low,mid - 1);
else //如果小于要找的值则在上半区间继续找
return Lookup(find,array,mid + 1,high);
}